diff --git a/.env.example b/.env.example index 26570fe..b48a7d5 100644 --- a/.env.example +++ b/.env.example @@ -9,7 +9,14 @@ VITE_V3_TOKEN_ADDRESS= VITE_TOKEN_MIGRATION_URI= AMPLITUDE_API_KEY= +AMPLITUDE_SERVER_URL= BUGSNAG_API_KEY= IOS_APP_ID= INTERCOM_APP_ID= STATUS_PAGE_SCRIPT_URI= + +SMARTBANNER_APP_NAME= +SMARTBANNER_ORG_NAME= +SMARTBANNER_ICON_URL= +SMARTBANNER_APPSTORE_URL= +SMARTBANNER_GOOGLEPLAY_URL= diff --git a/.github/workflows/deploy-testnet.yml b/.github/workflows/deploy-testnet.yml index f2edc93..10f4c0f 100644 --- a/.github/workflows/deploy-testnet.yml +++ b/.github/workflows/deploy-testnet.yml @@ -39,6 +39,7 @@ jobs: pnpm run build:inject-amplitude pnpm run build:inject-bugsnag pnpm run build:inject-statuspage + pnpm run build:inject-smartbanner sh scripts/inject-app-deeplinks.sh - name: Upload to IPFS via web3.storage diff --git a/.ladle/components.tsx b/.ladle/components.tsx index 04ee536..b8e8574 100644 --- a/.ladle/components.tsx +++ b/.ladle/components.tsx @@ -2,61 +2,102 @@ import '@/polyfills'; import { useEffect, useState } from 'react'; import { Provider } from 'react-redux'; import styled from 'styled-components'; +import { WagmiConfig } from 'wagmi'; +import { GrazProvider } from 'graz'; +import { QueryClient, QueryClientProvider } from 'react-query'; -import { store } from '@/state/_store'; +import { SupportedLocales } from '@/constants/localization'; + +import { AccountsProvider } from '@/hooks/useAccounts'; +import { AppThemeAndColorModeProvider } from '@/hooks/useAppThemeAndColorMode'; +import { DydxProvider } from '@/hooks/useDydxClient'; +import { DialogAreaProvider } from '@/hooks/useDialogArea'; +import { LocaleProvider } from '@/hooks/useLocaleSeparators'; +import { PotentialMarketsProvider } from '@/hooks/usePotentialMarkets'; +import { RestrictionProvider } from '@/hooks/useRestrictions'; +import { SubaccountProvider } from '@/hooks/useSubaccount'; import { GlobalStyle } from '@/styles/globalStyle'; import { SelectMenu, SelectItem } from '@/components/SelectMenu'; -import { AppThemeProvider } from '@/hooks/useAppTheme'; +import { + AppTheme, + AppThemeSystemSetting, + AppColorMode, + setAppThemeSetting, + setAppColorMode, +} from '@/state/configs'; -import { AppTheme, setAppTheme } from '@/state/configs'; -import { setLocaleLoaded } from '@/state/localization'; +import { setLocaleLoaded, setSelectedLocale } from '@/state/localization'; +import { store } from '@/state/_store'; + +import { config } from '@/lib/wagmi'; import '@/index.css'; import './ladle.css'; +const queryClient = new QueryClient(); + +const wrapProvider = (Component: React.ComponentType, props?: any) => { + // eslint-disable-next-line react/display-name + return ({ children }: { children: React.ReactNode }) => ( + {children} + ); +}; + +const providers = [ + wrapProvider(QueryClientProvider, { client: queryClient }), + wrapProvider(GrazProvider), + wrapProvider(WagmiConfig, { config }), + wrapProvider(LocaleProvider), + wrapProvider(RestrictionProvider), + wrapProvider(DydxProvider), + wrapProvider(AccountsProvider), + wrapProvider(SubaccountProvider), + wrapProvider(DialogAreaProvider), + wrapProvider(PotentialMarketsProvider), + wrapProvider(AppThemeAndColorModeProvider), +]; + export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [theme, setTheme] = useState(AppTheme.Classic); + const [colorMode, setColorMode] = useState(AppColorMode.GreenUp); useEffect(() => { - store.dispatch(setAppTheme(theme)); - switch (theme) { - case AppTheme.Dark: { - document?.documentElement?.classList.remove('theme-light'); - document?.documentElement?.classList.add('theme-dark'); - break; - } - case AppTheme.Light: { - document?.documentElement?.classList.remove('theme-dark'); - document?.documentElement?.classList.add('theme-light'); - break; - } - case AppTheme.Classic: { - document?.documentElement?.classList.remove('theme-dark', 'theme-light'); - break; - } - } - }, [theme]); + store.dispatch(setAppThemeSetting(theme)); + store.dispatch(setAppColorMode(colorMode)); + }, [theme, colorMode]); useEffect(() => { + store.dispatch(setSelectedLocale({ locale: SupportedLocales.EN })); store.dispatch(setLocaleLoaded(true)); }, []); + const content = [...providers].reverse().reduce( + (children, Provider) => { + return {children}; + }, + + + {children} + + ); + return (

Active Theme:

- + {[ { value: AppTheme.Classic, label: 'Default theme', }, + { + value: AppThemeSystemSetting.System, + label: 'System theme', + }, { value: AppTheme.Dark, label: 'Dark theme', @@ -66,20 +107,28 @@ export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children label: 'Light theme', }, ].map(({ value, label }) => ( - + + ))} + +

Active Color Mode:

+ + {[ + { + value: AppColorMode.GreenUp, + label: 'Green up', + }, + { + value: AppColorMode.RedUp, + label: 'Red up', + }, + ].map(({ value, label }) => ( + ))}

- - - {children} - -
+ {content} + ); }; diff --git a/.prettierignore b/.prettierignore index c2658d7..0a03045 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ node_modules/ +public/ diff --git a/README.md b/README.md index 2313c05..39fb04c 100644 --- a/README.md +++ b/README.md @@ -80,10 +80,12 @@ Set environment variables via `.env`. - `VITE_V3_TOKEN_ADDRESS` (optional): Address of the V3 $DYDX token. - `VITE_TOKEN_MIGRATION_URI` (optional): The URL of the token migration website. - `AMPLITUDE_API_KEY` (optional): Amplitude API key for enabling Amplitude; used with `pnpm run build:inject-amplitude`. +- `AMPLITUDE_SERVER_URL` (optional): Custom Amplitude server URL - `BUGSNAG_API_KEY` (optional): API key for enabling Bugsnag; used with `pnpm run build:inject-bugsnag`. - `IOS_APP_ID` (optional): iOS app ID used for enabling deep linking to the iOS app; used with `pnpm run build:inject-app-deeplinks`. - `INTERCOM_APP_ID` (optional): Used for enabling Intercom; utilized with `pnpm run build:inject-intercom`. - `STATUS_PAGE_SCRIPT_URI` (optional): Used for enabling the status page; used with `pnpm run build:inject-statuspage`. +- `SMARTBANNER_APP_NAME`, `SMARTBANNER_ORG_NAME`, `SMARTBANNER_ICON_URL`, `SMARTBANNER_APPSTORE_URL` (optional): Used for enabling the smart app banner; used with `pnpm run build:inject-smartbanner`. # Deployments @@ -109,11 +111,14 @@ pnpm run build --mode testnet If you wish to incorporate analytics via Amplitude and Bugsnag, you can use our scripts: `pnpm run build:inject-amplitude` and `pnpm run build:inject-bugsnag`. You will need to provide your own API keys for these services. In the Environment Variables section, name the variables as `AMPLITUDE_API_KEY` and `BUGSNAG_API_KEY` and provide the respective keys as their values. +If you wish to incorporate smart banner for iOS and/or Android apps, you can use our scripts: +`pnpm run build:inject-smartbanner`. You will need to provide your own app configurations for these services. In the Environment Variables section, name the variables as `SMARTBANNER_APP_NAME`, `SMARTBANNER_ORG_NAME`, `SMARTBANNER_ICON_URL` and `SMARTBANNER_APPSTORE_URL` or `SMARTBANNER_GOOGLEPLAY_URL` and provide the respective values. + For more details, check out Vercel's [official documentation](https://vercel.com/docs). ## Deploying to IPFS -### Enable HashRouting +### Must Enable HashRouting Add the following to `.env` file diff --git a/package.json b/package.json index 23e4030..a1e5b29 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "build:inject-bugsnag": "node scripts/inject-bugsnag.js", "build:inject-intercom": "node scripts/inject-intercom.js", "build:inject-statuspage": "node scripts/inject-statuspage.js", + "build:inject-smartbanner": "node scripts/inject-smartbanner.js", "deploy:ipfs": "node scripts/upload-ipfs.js --verbose", "deploy:update-ipns": "node scripts/update-ipns.js", "deploy:update-dnslink": "node scripts/update-dnslink.js", @@ -39,9 +40,9 @@ "@cosmjs/proto-signing": "^0.32.1", "@cosmjs/stargate": "^0.32.1", "@cosmjs/tendermint-rpc": "^0.32.1", - "@dydxprotocol/v4-abacus": "^1.3.2", - "@dydxprotocol/v4-client-js": "^1.0.17", - "@dydxprotocol/v4-localization": "^1.1.19", + "@dydxprotocol/v4-abacus": "^1.4.5", + "@dydxprotocol/v4-client-js": "^1.0.20", + "@dydxprotocol/v4-localization": "^1.1.30", "@ethersproject/providers": "^5.7.2", "@js-joda/core": "^5.5.3", "@radix-ui/react-accordion": "^1.1.2", @@ -117,7 +118,7 @@ }, "devDependencies": { "@babel/core": "^7.22.5", - "@ladle/react": "^2.15.0", + "@ladle/react": "^4.0.2", "@types/color": "^3.0.3", "@types/crypto-js": "^4.1.1", "@types/luxon": "^3.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 684cfd2..705a63e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: follow-redirects: 1.15.3 @@ -13,31 +9,31 @@ dependencies: version: 1.10.0 '@cosmjs/amino': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/crypto': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/encoding': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/proto-signing': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/stargate': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@cosmjs/tendermint-rpc': specifier: ^0.32.1 - version: 0.32.1 + version: 0.32.2 '@dydxprotocol/v4-abacus': - specifier: ^1.3.2 - version: 1.3.2 + specifier: ^1.4.5 + version: 1.4.5 '@dydxprotocol/v4-client-js': - specifier: ^1.0.17 - version: 1.0.17 + specifier: ^1.0.20 + version: 1.0.20 '@dydxprotocol/v4-localization': - specifier: ^1.1.19 - version: 1.1.19 + specifier: ^1.1.30 + version: 1.1.30 '@ethersproject/providers': specifier: ^5.7.2 version: 5.7.2 @@ -260,8 +256,8 @@ devDependencies: specifier: ^7.22.5 version: 7.22.5 '@ladle/react': - specifier: ^2.15.0 - version: 2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.0.2 + version: 4.0.2(@types/node@20.3.1)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) '@types/color': specifier: ^3.0.3 version: 3.0.3 @@ -382,7 +378,7 @@ packages: /@0xsquid/sdk@1.10.0: resolution: {integrity: sha512-NKxHYB+g/TMPY+XmCHs+LuhyfbhH4KvAbGpVBOBPXM9Q5FsKcKrDJpTd5YnGYCLF9B3qXAzVTR0XhiC73GmOOA==} dependencies: - '@cosmjs/encoding': 0.31.1 + '@cosmjs/encoding': 0.31.0 '@cosmjs/stargate': 0.31.0 axios: 0.27.2 cosmjs-types: 0.8.0 @@ -424,10 +420,23 @@ packages: '@babel/highlight': 7.22.10 chalk: 2.4.2 + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} engines: {node: '>=6.9.0'} @@ -450,6 +459,29 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator@7.22.10: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} @@ -459,6 +491,16 @@ packages: '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -475,6 +517,22 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -486,12 +544,27 @@ packages: '@babel/template': 7.22.5 '@babel/types': 7.22.10 + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.9 + dev: true + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -511,6 +584,20 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} @@ -531,6 +618,16 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -539,6 +636,11 @@ packages: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helpers@7.22.10: resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} engines: {node: '>=6.9.0'} @@ -549,6 +651,17 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} @@ -557,6 +670,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.22.10: resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} @@ -564,6 +686,14 @@ packages: dependencies: '@babel/types': 7.22.10 + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.9 + dev: true + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -583,6 +713,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} @@ -593,6 +733,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/runtime@7.22.10: resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} engines: {node: '>=6.9.0'} @@ -607,6 +757,15 @@ packages: '@babel/parser': 7.22.10 '@babel/types': 7.22.10 + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/traverse@7.22.10(supports-color@5.5.0): resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} @@ -624,6 +783,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.22.10: resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} @@ -632,6 +809,27 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bundled-es-modules/cookie@2.0.0: + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + dependencies: + cookie: 0.5.0 + dev: true + + /@bundled-es-modules/statuses@1.0.1: + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + dependencies: + statuses: 2.0.1 + dev: true + /@coinbase/wallet-sdk@3.7.1: resolution: {integrity: sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg==} engines: {node: '>= 10.0.0'} @@ -689,16 +887,16 @@ packages: resolution: {integrity: sha512-xJ5CCEK7H79FTpOuEmlpSzVI+ZeYESTVvO3wHDgbnceIyAne3C68SvyaKqLUR4uJB0Z4q4+DZHbqW6itUiv4lA==} dependencies: '@cosmjs/crypto': 0.31.0 - '@cosmjs/encoding': 0.31.1 - '@cosmjs/math': 0.31.1 - '@cosmjs/utils': 0.31.1 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 dev: false - /@cosmjs/amino@0.32.1: - resolution: {integrity: sha512-5l2xQ2XuAhV/B3kTIMPBcVZ/OQ+9Yyddzw/lIVs4qE5e/oBI0PVNWXw1oyR0wgfGHrMUxgKjsoOOqE2IbXVyCw==} + /@cosmjs/amino@0.32.2: + resolution: {integrity: sha512-lcK5RCVm4OfdAooxKcF2+NwaDVVpghOq6o/A40c2mHXDUzUoRZ33VAHjVJ9Me6vOFxshrw/XEFn1f4KObntjYA==} dependencies: - '@cosmjs/crypto': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/utils': 0.32.2 dev: false @@ -753,19 +951,19 @@ packages: /@cosmjs/crypto@0.31.0: resolution: {integrity: sha512-UaqCe6Tgh0pe1QlZ66E13t6FlIF86QrnBXXq+EN7Xe1Rouza3fJ1ojGlPleJZkBoq3tAyYVIOOqdZIxtVj/sIQ==} dependencies: - '@cosmjs/encoding': 0.31.1 - '@cosmjs/math': 0.31.1 - '@cosmjs/utils': 0.31.1 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 '@noble/hashes': 1.3.3 bn.js: 5.2.1 elliptic: 6.5.4 libsodium-wrappers-sumo: 0.7.11 dev: false - /@cosmjs/crypto@0.32.1: - resolution: {integrity: sha512-AsKucEg5o8evU0wXF/lDwX+ZSwCKF4bbc57nFzraHywlp3sNu4dfPPURoMrT0r7kT7wQZAy4Pdnvmm9nnCCm/Q==} + /@cosmjs/crypto@0.32.2: + resolution: {integrity: sha512-RuxrYKzhrPF9g6NmU7VEq++Hn1vZJjqqJpZ9Tmw9lOYOV8BUsv+j/0BE86kmWi7xVJ7EwxiuxYsKuM8IR18CIA==} dependencies: - '@cosmjs/encoding': 0.32.1 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/utils': 0.32.2 '@noble/hashes': 1.3.3 @@ -790,16 +988,16 @@ packages: readonly-date: 1.0.0 dev: false - /@cosmjs/encoding@0.31.1: - resolution: {integrity: sha512-IuxP6ewwX6vg9sUJ8ocJD92pkerI4lyG8J5ynAM3NaX3q+n+uMoPRSQXNeL9bnlrv01FF1kIm8if/f5F7ZPtkA==} + /@cosmjs/encoding@0.31.0: + resolution: {integrity: sha512-NYGQDRxT7MIRSlcbAezwxK0FqnaSPKCH7O32cmfpHNWorFxhy9lwmBoCvoe59Kd0HmArI4h+NGzLEfX3OLnA4Q==} dependencies: base64-js: 1.5.1 bech32: 1.1.4 readonly-date: 1.0.0 dev: false - /@cosmjs/encoding@0.32.1: - resolution: {integrity: sha512-x60Lfds+Eq42rVV29NaoIAson3kBhATBI3zPp7X3GJTryBc5HFHQ6L/976tE1WB2DrvkfUdWS3ayCMVOY/qm1g==} + /@cosmjs/encoding@0.32.2: + resolution: {integrity: sha512-WX7m1wLpA9V/zH0zRcz4EmgZdAv1F44g4dbXOgNj1eXZw1PIGR12p58OEkLN51Ha3S4DKRtCv5CkhK1KHEvQtg==} dependencies: base64-js: 1.5.1 bech32: 1.1.4 @@ -859,12 +1057,6 @@ packages: bn.js: 5.2.1 dev: false - /@cosmjs/math@0.31.1: - resolution: {integrity: sha512-kiuHV6m6DSB8/4UV1qpFhlc4ul8SgLXTGRlYkYiIIP4l0YNeJ+OpPYaOlEgx4Unk2mW3/O2FWYj7Jc93+BWXng==} - dependencies: - bn.js: 5.2.1 - dev: false - /@cosmjs/math@0.32.2: resolution: {integrity: sha512-b8+ruAAY8aKtVKWSft2IvtCVCUH1LigIlf9ALIiY8n9jtM4kMASiaRbQ/27etnSAInV88IaezKK9rQZrtxTjcw==} dependencies: @@ -888,19 +1080,19 @@ packages: dependencies: '@cosmjs/amino': 0.31.0 '@cosmjs/crypto': 0.31.0 - '@cosmjs/encoding': 0.31.1 - '@cosmjs/math': 0.31.1 - '@cosmjs/utils': 0.31.1 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 cosmjs-types: 0.8.0 long: 4.0.0 dev: false - /@cosmjs/proto-signing@0.32.1: - resolution: {integrity: sha512-IHJMXQ8XnfzR5K1hWb8VV/jEfJof6BL2mgGIA7X4hSPegwoVfb9hnFKPEPgFjGCTTvGZ8SfnCdXxpsOjianVIA==} + /@cosmjs/proto-signing@0.32.2: + resolution: {integrity: sha512-UV4WwkE3W3G3s7wwU9rizNcUEz2g0W8jQZS5J6/3fiN0mRPwtPKQ6EinPN9ASqcAJ7/VQH4/9EPOw7d6XQGnqw==} dependencies: - '@cosmjs/amino': 0.32.1 - '@cosmjs/crypto': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/amino': 0.32.2 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/utils': 0.32.2 cosmjs-types: 0.9.0 @@ -968,7 +1160,7 @@ packages: dependencies: '@confio/ics23': 0.6.8 '@cosmjs/amino': 0.31.0 - '@cosmjs/encoding': 0.31.1 + '@cosmjs/encoding': 0.31.0 '@cosmjs/math': 0.31.0 '@cosmjs/proto-signing': 0.31.0 '@cosmjs/stream': 0.31.0 @@ -984,16 +1176,16 @@ packages: - utf-8-validate dev: false - /@cosmjs/stargate@0.32.1: - resolution: {integrity: sha512-S0E1qKQ2CMJU79G8bQTquTyrbU03gFsvCkbo3RvK8v2OltVCByjFNh+0nGN5do+uDOzwwmDvnNLhR+SaIyNQoQ==} + /@cosmjs/stargate@0.32.2: + resolution: {integrity: sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg==} dependencies: '@confio/ics23': 0.6.8 - '@cosmjs/amino': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/amino': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 - '@cosmjs/proto-signing': 0.32.1 + '@cosmjs/proto-signing': 0.32.2 '@cosmjs/stream': 0.32.2 - '@cosmjs/tendermint-rpc': 0.32.1 + '@cosmjs/tendermint-rpc': 0.32.2 '@cosmjs/utils': 0.32.2 cosmjs-types: 0.9.0 xstream: 11.14.0 @@ -1044,12 +1236,12 @@ packages: resolution: {integrity: sha512-yo9xbeuI6UoEKIhFZ9g0dvUKLqnBzwdpEc/uldQygQc51j38gQVwFko+6sjmhieJqRYYvrYumcbJMiV6GFM9aA==} dependencies: '@cosmjs/crypto': 0.31.0 - '@cosmjs/encoding': 0.31.1 + '@cosmjs/encoding': 0.31.0 '@cosmjs/json-rpc': 0.31.0 - '@cosmjs/math': 0.31.1 + '@cosmjs/math': 0.31.0 '@cosmjs/socket': 0.31.0 '@cosmjs/stream': 0.31.0 - '@cosmjs/utils': 0.31.1 + '@cosmjs/utils': 0.31.0 axios: 0.21.4 readonly-date: 1.0.0 xstream: 11.14.0 @@ -1059,11 +1251,11 @@ packages: - utf-8-validate dev: false - /@cosmjs/tendermint-rpc@0.32.1: - resolution: {integrity: sha512-4uGSxB2JejWhwBUgxca4GqcK/BGnCFMIP7ptwEledrC3AY/shPeIYcPXWEBwO7sfwCta8DhAOCLrc9zhVC+VAQ==} + /@cosmjs/tendermint-rpc@0.32.2: + resolution: {integrity: sha512-DXyJHDmcAfCix4H/7/dKR0UMdshP01KxJOXHdHxBCbLIpck94BsWD3B2ZTXwfA6sv98so9wOzhp7qGQa5malxg==} dependencies: - '@cosmjs/crypto': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/crypto': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/json-rpc': 0.32.2 '@cosmjs/math': 0.32.2 '@cosmjs/socket': 0.32.2 @@ -1090,41 +1282,33 @@ packages: resolution: {integrity: sha512-nNcycZWUYLNJlrIXgpcgVRqdl6BXjF4YlXdxobQWpW9Tikk61bEGeAFhDYtC0PwHlokCNw0KxWiHGJL4nL7Q5A==} dev: false - /@cosmjs/utils@0.31.1: - resolution: {integrity: sha512-n4Se1wu4GnKwztQHNFfJvUeWcpvx3o8cWhSbNs9JQShEuB3nv3R5lqFBtDCgHZF/emFQAP+ZjF8bTfCs9UBGhA==} - dev: false - /@cosmjs/utils@0.32.2: resolution: {integrity: sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q==} dev: false - /@cush/relative@1.0.0: - resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} - dev: true - - /@dydxprotocol/v4-abacus@1.3.2: - resolution: {integrity: sha512-zo0IHjGMlJRKOYDgNqNFQ9GtBJKJP4+Y9YY7V0X3Wt61ppKAYzodaYQhc9V/RYchcZTtS/xkicLug444YrvehQ==} + /@dydxprotocol/v4-abacus@1.4.5: + resolution: {integrity: sha512-LhJmpIaUkHCsSiHx+jdk+59euvGp2E+gGFelpfmOYpH1+enZgEXDQvWsgHSFEQxYP3mRiGG4uo+ZYNGdvffg7g==} dev: false - /@dydxprotocol/v4-client-js@1.0.17: - resolution: {integrity: sha512-PbTKbzcS7VapuFRofkirUxkF9ThNS2tWYyr0asFOMUfebsQWMvTC1sYC/s1NZIiBeq3cFz9vKdZFbfsKi7Z1bw==} + /@dydxprotocol/v4-client-js@1.0.20: + resolution: {integrity: sha512-dXKW2NC1XlVVIRKvHWVDofLZSCPTJAaRY5eXzxH5CcXpnl2kdXorr7ykqWZxW0jHFPWWvRSJtUDqZN1qFrEe/w==} dependencies: - '@cosmjs/amino': 0.32.1 - '@cosmjs/encoding': 0.32.1 + '@cosmjs/amino': 0.32.2 + '@cosmjs/encoding': 0.32.2 '@cosmjs/math': 0.32.2 - '@cosmjs/proto-signing': 0.32.1 - '@cosmjs/stargate': 0.32.1 - '@cosmjs/tendermint-rpc': 0.32.1 + '@cosmjs/proto-signing': 0.32.2 + '@cosmjs/stargate': 0.32.2 + '@cosmjs/tendermint-rpc': 0.32.2 '@cosmjs/utils': 0.32.2 - '@dydxprotocol/v4-proto': 3.0.0-dev.0 + '@dydxprotocol/v4-proto': 4.0.0-dev.0 '@osmonauts/lcd': 0.6.0 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 axios: 1.1.3 bech32: 1.1.4 bignumber.js: 9.1.1 cosmjs-types: 0.9.0 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.1.2 ethers: 6.6.1 long: 4.0.0 protobufjs: 6.11.4 @@ -1135,12 +1319,12 @@ packages: - utf-8-validate dev: false - /@dydxprotocol/v4-localization@1.1.19: - resolution: {integrity: sha512-EA0J5dXyjFoAuSaEYOt066wEMJAXpSb1+ByAcxnEW1PbRznJ9LwrwNDlRtHQk0lkcWC5vdi+UtmSV8D2TsS+vQ==} + /@dydxprotocol/v4-localization@1.1.30: + resolution: {integrity: sha512-TZfWWRSOxcjLHs972wlJVVHkE7+DVqAUnGZSs24HYHsPtUkPhZiNXMOA2Vk9YddQxumhM79xIRH0cmJSe5DDUg==} dev: false - /@dydxprotocol/v4-proto@3.0.0-dev.0: - resolution: {integrity: sha512-hT6F/AgaTqv8Bwo7twpIhmjXvJE/Fx+3mmHHTuIXMeL6OhVtlOpcEQyHvBEAdh1VrNq/S7qWvdQD0fvC/UgKyA==} + /@dydxprotocol/v4-proto@4.0.0-dev.0: + resolution: {integrity: sha512-PC/xq5YJIisAd3jjIULJGrnujbrYkr5h4ehepnLc6U34nJT720iumKVMiPaezwRC+kHKTI1culpKNnlMnbeYBA==} dependencies: protobufjs: 6.11.4 dev: false @@ -1159,6 +1343,15 @@ packages: /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -1168,6 +1361,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -1177,6 +1379,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -1186,6 +1397,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -1195,6 +1415,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -1204,6 +1433,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -1213,6 +1451,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -1222,6 +1469,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -1231,6 +1487,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -1240,6 +1505,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -1249,6 +1523,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.17.19: resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -1258,6 +1541,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -1267,6 +1559,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -1276,6 +1577,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -1285,6 +1595,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -1294,6 +1613,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -1303,6 +1631,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -1312,6 +1649,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -1321,6 +1667,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -1330,6 +1685,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -1339,6 +1703,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -1348,6 +1721,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -1357,6 +1739,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1966,62 +2357,67 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@ladle/react@2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-rEl5WU1f0YQO+oXFV9fh2FQUHdXR/k4waLxHBnVyJoQvNvZKZJiKSXkzi7kNIxQazK5iVla12pbhlvDe2jR/Yw==} - engines: {node: '>=16.0.0'} + /@ladle/react@4.0.2(@types/node@20.3.1)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3): + resolution: {integrity: sha512-SnYniR/U7kJX1Zh199jhjxqiFa5e5eA8chuX6uYEZYAUtCCY/hQqGr7/7Grr0j6Q4FYu9iQyyV2K1NJKDdUZIw==} + engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - react: '>=16.14.0' - react-dom: '>=16.14.0' + react: '>=18.0.0' + react-dom: '>=18.0.0' dependencies: - '@babel/code-frame': 7.22.10 - '@babel/core': 7.22.5 - '@babel/generator': 7.22.10 - '@babel/parser': 7.22.10 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10(supports-color@5.5.0) - '@babel/types': 7.22.10 + '@babel/code-frame': 7.23.5 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@ladle/react-context': 1.0.1(react-dom@18.2.0)(react@18.2.0) - '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@vitejs/plugin-react': 3.1.0(vite@4.3.9) - '@vitejs/plugin-react-swc': 3.1.0(vite@4.3.9) - axe-core: 4.7.2 + '@mdx-js/mdx': 3.0.0 + '@mdx-js/react': 3.0.0(@types/react@18.2.14)(react@18.2.0) + '@vitejs/plugin-react': 4.2.1(vite@5.0.12) + '@vitejs/plugin-react-swc': 3.6.0(vite@5.0.12) + axe-core: 4.8.3 boxen: 7.1.1 chokidar: 3.5.3 classnames: 2.3.2 - commander: 10.0.1 + commander: 11.1.0 cross-spawn: 7.0.3 debug: 4.3.4(supports-color@5.5.0) - get-port: 6.1.2 - globby: 13.2.2 + get-port: 7.0.0 + globby: 14.0.0 history: 5.3.0 koa: 2.14.2 koa-connect: 2.1.0 lodash.merge: 4.6.2 + msw: 2.1.7(typescript@5.1.3) open: 9.1.0 - prism-react-renderer: 1.3.5(react@18.2.0) + prism-react-renderer: 2.3.1(react@18.2.0) prop-types: 15.8.1 query-string: 8.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-frame-component: 5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-hotkeys-hook: 4.5.0(react-dom@18.2.0)(react@18.2.0) react-inspector: 6.0.2(react@18.2.0) - rehype-raw: 6.1.1 - remark-gfm: 3.0.1 + rehype-class-names: 1.0.14 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 source-map: 0.7.4 - vfile: 5.3.7 - vite: 4.3.9(@types/node@20.3.1) - vite-tsconfig-paths: 3.6.0(vite@4.3.9) + vfile: 6.0.1 + vite: 5.0.12(@types/node@20.3.1) + vite-tsconfig-paths: 4.3.1(typescript@5.1.3)(vite@5.0.12) transitivePeerDependencies: - '@swc/helpers' - '@types/node' + - '@types/react' - less + - lightningcss - sass - stylus - sugarss - supports-color - terser + - typescript dev: true /@lit-labs/ssr-dom-shim@1.1.2: @@ -2034,33 +2430,40 @@ packages: '@lit-labs/ssr-dom-shim': 1.1.2 dev: false - /@mdx-js/mdx@2.3.0: - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} dependencies: + '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 '@types/mdx': 2.0.6 - estree-util-build-jsx: 2.2.2 - estree-util-is-identifier-name: 2.1.0 - estree-util-to-js: 1.2.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 2.3.3 - markdown-extensions: 1.1.1 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 periscopic: 3.1.0 - remark-mdx: 2.3.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - unified: 10.1.2 - unist-util-position-from-estree: 1.1.2 - unist-util-stringify-position: 3.0.3 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - supports-color dev: true - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + /@mdx-js/react@3.0.0(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} peerDependencies: + '@types/react': '>=16' react: '>=16' dependencies: '@types/mdx': 2.0.6 @@ -2145,6 +2548,23 @@ packages: tslib: 2.6.2 dev: false + /@mswjs/cookies@1.1.0: + resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} + engines: {node: '>=18'} + dev: true + + /@mswjs/interceptors@0.25.16: + resolution: {integrity: sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==} + engines: {node: '>=18'} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.2 + strict-event-emitter: 0.5.1 + dev: true + /@multiformats/murmur3@1.1.3: resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} dependencies: @@ -2158,18 +2578,18 @@ packages: '@noble/hashes': 1.3.0 dev: false + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + /@noble/curves@1.2.0: resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} dependencies: '@noble/hashes': 1.3.2 dev: false - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - dependencies: - '@noble/hashes': 1.3.3 - dev: false - /@noble/ed25519@1.7.3: resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} dev: true @@ -2221,6 +2641,21 @@ packages: fastq: 1.15.0 dev: true + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true + + /@open-draft/logger@0.3.0: + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.2 + dev: true + + /@open-draft/until@2.1.0: + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + dev: true + /@osmonauts/lcd@0.6.0: resolution: {integrity: sha512-vz9VavXrEfxZoXbSAfNfk90MLpn34XtBYPV3L9YilE+s56AhqYxUh83nne9J5somnTRfGnyR3oeV8C+lHkqiuA==} dependencies: @@ -4985,6 +5420,110 @@ packages: picomatch: 2.3.1 dev: true + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@safe-global/safe-apps-provider@0.18.1(typescript@5.1.3): resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} dependencies: @@ -5035,18 +5574,18 @@ packages: '@scure/base': 1.1.1 dev: false - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: - '@noble/curves': 1.2.0 + '@noble/curves': 1.1.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 dev: false - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} dependencies: - '@noble/curves': 1.3.0 + '@noble/curves': 1.2.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 dev: false @@ -5065,12 +5604,10 @@ packages: '@scure/base': 1.1.5 dev: false - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 - dev: false + /@sindresorhus/merge-streams@1.0.0: + resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==} + engines: {node: '>=18'} + dev: true /@solana/buffer-layout@4.0.1: resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} @@ -5083,7 +5620,7 @@ packages: resolution: {integrity: sha512-up5VG1dK+GPhykmuMIozJZBbVqpm77vbOG6/r5dS7NBGZonwHfTLdBbsYc3rjmaQ4DpCXUa3tUc4RZHRORvZrw==} dependencies: '@babel/runtime': 7.22.10 - '@noble/curves': 1.3.0 + '@noble/curves': 1.2.0 '@noble/hashes': 1.3.3 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.5.0 @@ -5340,8 +5877,8 @@ packages: - supports-color dev: true - /@swc/core-darwin-arm64@1.3.77: - resolution: {integrity: sha512-l4KGQAGB4Ih1Al2tWoUBrtVJCF/xZRjH3jCMCRD52KZDRAnRVDq42JKek7+aHjjH8juzTISaqzsI8Ipv6zvKhA==} + /@swc/core-darwin-arm64@1.4.0: + resolution: {integrity: sha512-UTJ/Vz+s7Pagef6HmufWt6Rs0aUu+EJF4Pzuwvr7JQQ5b1DZeAAUeUtkUTFx/PvCbM8Xfw4XdKBUZfrIKCfW8A==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -5349,8 +5886,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.77: - resolution: {integrity: sha512-eFCkZg/BzObOn5IWn7t/Ywz+jlZKff/1XBymT7Arh/UkO39Agh+rYdBqjbylp4JQMl0qGRBfxD3wPgDRoViNVQ==} + /@swc/core-darwin-x64@1.4.0: + resolution: {integrity: sha512-f8v58u2GsGak8EtZFN9guXqE0Ep10Suny6xriaW2d8FGqESPyNrnBzli3aqkSeQk5gGqu2zJ7WiiKp3XoUOidA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -5358,8 +5895,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.77: - resolution: {integrity: sha512-+1BueyGcCQAtxSORJml0CU8aKQNssQ5E3ABMFJwCbcec+lUCiGYK1fBfqj4FmWQMbXuQ+mn1SMeXSZAtaXoQ3w==} + /@swc/core-linux-arm-gnueabihf@1.4.0: + resolution: {integrity: sha512-q2KAkBzmPcTnRij/Y1fgHCKAGevUX/H4uUESrw1J5gmUg9Qip6onKV80lTumA1/aooGJ18LOsB31qdbwmZk9OA==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -5367,8 +5904,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.77: - resolution: {integrity: sha512-3smbzVcuuCiWWPFeUIp1c0aAXd+fGsc8x8rUcYvoJAWBgLJ45JymOI5WSUjIybl3rk0prdkbFylZuR0t1Rue3A==} + /@swc/core-linux-arm64-gnu@1.4.0: + resolution: {integrity: sha512-SknGu96W0mzHtLHWm+62fk5+Omp9fMPFO7AWyGFmz2tr8EgRRXtTSrBUnWhAbgcalnhen48GsvtMdxf1KNputg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -5376,8 +5913,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.77: - resolution: {integrity: sha512-e81+i4ef5vDeu9AkMY2AamPcmtPVPUqeqq3aNWM1tcHCaUej1DwY4xhRxrd1OvEoYyVBLtiMb5nenF3V9OzXIQ==} + /@swc/core-linux-arm64-musl@1.4.0: + resolution: {integrity: sha512-/k3TDvpBRMDNskHooNN1KqwUhcwkfBlIYxRTnJvsfT2C7My4pffR+4KXmt0IKynlTTbCdlU/4jgX4801FSuliw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -5385,8 +5922,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.77: - resolution: {integrity: sha512-gl3+9VESckZ/GYCmGClGgXqB2tAA2MivEV/51Wde+2alo2lPSSujEhxE6Q3TNYkXOLAHSupYyDZ0ou9RfXufOw==} + /@swc/core-linux-x64-gnu@1.4.0: + resolution: {integrity: sha512-GYsTMvNt5+WTVlwwQzOOWsPMw6P/F41u5PGHWmfev8Nd4QJ1h3rWPySKk4mV42IJwH9MgQCVSl3ygwNqwl6kFg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -5394,8 +5931,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.77: - resolution: {integrity: sha512-AqQLZAMYTaNrA4i/Nv/GhXdildDZyRv6xsK8u2actevv5PPjD/69yYB3Z4uaptwh/4ys4W/Y2vnt+OPCNH4OQg==} + /@swc/core-linux-x64-musl@1.4.0: + resolution: {integrity: sha512-jGVPdM/VwF7kK/uYRW5N6FwzKf/FnDjGIR3RPvQokjYJy7Auk+3Oj21C0Jev7sIT9RYnO/TrFEoEozKeD/z2Qw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -5403,8 +5940,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.77: - resolution: {integrity: sha512-Wdw++6w7WyavxZ3WruElCrRJ6EO0iHS0Mts4qHnbKgD08GJqIMTZPtZ5qhRe9zCf6sj2rQqhAMf/HKhYrHoF+w==} + /@swc/core-win32-arm64-msvc@1.4.0: + resolution: {integrity: sha512-biHYm1AronEKlt47O/H8sSOBM2BKXMmWT+ApvlxUw50m1RGNnVnE0bgY7tylFuuSiWyXsQPJbmUV708JqORXVg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -5412,8 +5949,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.77: - resolution: {integrity: sha512-ObNVpdtLdXDpmVKuMZh87yBYL4ti64WX95o2j5Oq3r0e0RqwIGqGvPDxvJVEiyCnaXHfl8eSNKWuiOxPHPkMNQ==} + /@swc/core-win32-ia32-msvc@1.4.0: + resolution: {integrity: sha512-TL5L2tFQb19kJwv6+elToGBj74QXCn9j+hZfwQatvZEJRA5rDK16eH6oAE751dGUArhnWlW3Vj65hViPvTuycw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -5421,8 +5958,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.77: - resolution: {integrity: sha512-Ew6jg/qr0v/2ixeJXvIUBuAPMKTz8HRoDBO/nHkvlnDFmkhsyH7h5YwJS1rLBwAEhWuJaVYjYi7cibZTI/QRYQ==} + /@swc/core-win32-x64-msvc@1.4.0: + resolution: {integrity: sha512-e2xVezU7XZ2Stzn4i7TOQe2Kn84oYdG0M3A7XI7oTdcpsKCcKwgiMoroiAhqCv+iN20KNqhnWwJiUiTj/qN5AA==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -5430,8 +5967,8 @@ packages: dev: true optional: true - /@swc/core@1.3.77: - resolution: {integrity: sha512-CiLD2NGTdhE8JnWFHeRAglaCAcvwOxvpeWNtCIT261GrxTKCXHPAn4eqIWiBzXnwWDmZ6XdyrCL4/GmPESNnrg==} + /@swc/core@1.4.0: + resolution: {integrity: sha512-wc5DMI5BJftnK0Fyx9SNJKkA0+BZSJQx8430yutWmsILkHMBD3Yd9GhlMaxasab9RhgKqZp7Ht30hUYO5ZDvQg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -5439,17 +5976,24 @@ packages: peerDependenciesMeta: '@swc/helpers': optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.77 - '@swc/core-darwin-x64': 1.3.77 - '@swc/core-linux-arm-gnueabihf': 1.3.77 - '@swc/core-linux-arm64-gnu': 1.3.77 - '@swc/core-linux-arm64-musl': 1.3.77 - '@swc/core-linux-x64-gnu': 1.3.77 - '@swc/core-linux-x64-musl': 1.3.77 - '@swc/core-win32-arm64-msvc': 1.3.77 - '@swc/core-win32-ia32-msvc': 1.3.77 - '@swc/core-win32-x64-msvc': 1.3.77 + '@swc/core-darwin-arm64': 1.4.0 + '@swc/core-darwin-x64': 1.4.0 + '@swc/core-linux-arm-gnueabihf': 1.4.0 + '@swc/core-linux-arm64-gnu': 1.4.0 + '@swc/core-linux-arm64-musl': 1.4.0 + '@swc/core-linux-x64-gnu': 1.4.0 + '@swc/core-linux-x64-musl': 1.4.0 + '@swc/core-win32-arm64-msvc': 1.4.0 + '@swc/core-win32-ia32-msvc': 1.4.0 + '@swc/core-win32-x64-msvc': 1.4.0 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true /@swc/helpers@0.4.14: @@ -5471,6 +6015,10 @@ packages: tslib: 2.6.2 dev: false + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: true + /@tanstack/match-sorter-utils@8.8.4: resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} engines: {node: '>=12'} @@ -5543,7 +6091,36 @@ packages: /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.9 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.9 dev: true /@types/chai-subset@1.3.3: @@ -5578,6 +6155,10 @@ packages: '@types/node': 20.10.5 dev: false + /@types/cookie@0.6.0: + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + dev: true + /@types/crypto-js@4.1.1: resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} dev: true @@ -5638,7 +6219,7 @@ packages: /@types/estree-jsx@1.0.0: resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /@types/estree@1.0.1: @@ -5649,8 +6230,8 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/hast@2.3.5: - resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: '@types/unist': 2.0.7 dev: true @@ -5685,8 +6266,8 @@ packages: resolution: {integrity: sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==} dev: true - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} dependencies: '@types/unist': 2.0.7 dev: true @@ -5731,8 +6312,8 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + /@types/prismjs@1.26.3: + resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} dev: true /@types/prop-types@15.7.5: @@ -5761,6 +6342,10 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true + /@types/statuses@2.0.4: + resolution: {integrity: sha512-eqNDvZsCNY49OAXB0Firg/Sc2BgoWsntsLUdybGFOhAfCD6QJ2n9HXUIHGqt5qjrxmMv4wS8WLAw43ZkKcJ8Pw==} + dev: true + /@types/styled-components@5.1.26: resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} dependencies: @@ -5777,6 +6362,10 @@ packages: resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} dev: true + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: true + /@types/use-sync-external-store@0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: false @@ -5917,6 +6506,10 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@visx/annotation@3.0.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-otf2AZDlt/XCpOBG0gkPowXVerLJW5yXPFis94Km0bj629htyKOsY5GeJKlBeB89ddxdi4zWHkaFxGFJ79Pqog==} peerDependencies: @@ -6202,33 +6795,17 @@ packages: - react-dom dev: false - /@vitejs/plugin-react-swc@3.1.0(vite@4.3.9): - resolution: {integrity: sha512-xnDULNrkEbtTtRNnMPp+RsuIuIbk1JJV0xY7irchYyv9JJS4uvmc1EYip+qyrnkcX7TQ9c8vCS3AmkQqADI0Fw==} + /@vitejs/plugin-react-swc@3.6.0(vite@5.0.12): + resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: - vite: ^4 + vite: ^4 || ^5 dependencies: - '@swc/core': 1.3.77 - vite: 4.3.9(@types/node@20.3.1) + '@swc/core': 1.4.0 + vite: 5.0.12(@types/node@20.3.1) transitivePeerDependencies: - '@swc/helpers' dev: true - /@vitejs/plugin-react@3.1.0(vite@4.3.9): - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.1.0-beta.0 - dependencies: - '@babel/core': 7.22.5 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) - magic-string: 0.27.0 - react-refresh: 0.14.0 - vite: 4.3.9(@types/node@20.3.1) - transitivePeerDependencies: - - supports-color - dev: true - /@vitejs/plugin-react@4.0.1(vite@4.3.9): resolution: {integrity: sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6244,6 +6821,22 @@ packages: - supports-color dev: true + /@vitejs/plugin-react@4.2.1(vite@5.0.12): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 5.0.12(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + /@vitest/expect@0.32.2: resolution: {integrity: sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==} dependencies: @@ -7216,6 +7809,14 @@ packages: acorn: 8.10.0 dev: true + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -7302,6 +7903,13 @@ packages: string-width: 4.2.3 dev: true + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -7333,10 +7941,6 @@ packages: engines: {node: '>=12'} dev: true - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - /any-signal@2.1.2: resolution: {integrity: sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==} dependencies: @@ -7496,6 +8100,11 @@ packages: engines: {node: '>=4'} dev: true + /axe-core@4.8.3: + resolution: {integrity: sha512-d5ZQHPSPkF9Tw+yfyDcRoUOc4g/8UloJJe5J8m4L5+c7AtDdjDLRxew/knnI4CxvtdxEUVgWz4x3OIQUIFiMfw==} + engines: {node: '>=4'} + dev: true + /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: @@ -7586,6 +8195,10 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + dev: true + /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} dev: false @@ -7644,6 +8257,14 @@ packages: '@noble/hashes': 1.3.3 dev: false + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + /bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} dependencies: @@ -7683,6 +8304,10 @@ packages: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: false + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + /borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} dependencies: @@ -7790,6 +8415,13 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: @@ -7942,6 +8574,10 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: true + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -7990,6 +8626,23 @@ packages: engines: {node: '>=10'} dev: true + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + /clipboardy@3.0.0: resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8007,11 +8660,30 @@ packages: wrap-ansi: 6.2.0 dev: false + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} dev: false + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: true + /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -8036,6 +8708,10 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -8083,19 +8759,14 @@ packages: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -8141,10 +8812,19 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cookie-es@1.0.0: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: false + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} @@ -8198,7 +8878,7 @@ packages: resolution: {integrity: sha512-WIdaQ8uW1vIbYvNnAVunkC6yxTrneJC7VQ5UUQ0kuw8b0C0A39KTIpoQHCfc8tV7o9vF4niwRhdXEdfAgQEsQQ==} dependencies: cosmos-directory-types: 0.0.6 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 dev: false /cosmos-directory-types@0.0.6: @@ -8250,6 +8930,10 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + /css-selector-parser@3.0.4: + resolution: {integrity: sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==} + dev: true + /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} dependencies: @@ -8450,6 +9134,12 @@ packages: titleize: 3.0.0 dev: true + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -8532,16 +9222,17 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: false + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: true + /diff-sequences@29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true - /dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} dev: false @@ -8553,6 +9244,11 @@ packages: path-type: 4.0.0 dev: true + /direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dev: true + /dns-over-http-resolver@1.2.3(node-fetch@3.3.1): resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} dependencies: @@ -8789,6 +9485,37 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + 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 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -9217,37 +9944,38 @@ packages: engines: {node: '>=4.0'} dev: true - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} dependencies: '@types/estree-jsx': 1.0.0 - estree-util-is-identifier-name: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 dev: true - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} dev: true - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} dependencies: '@types/estree-jsx': 1.0.0 astring: 1.8.6 source-map: 0.7.4 dev: true - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true /estree-walker@2.0.2: @@ -9257,7 +9985,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /esutils@2.0.3: @@ -9307,13 +10035,13 @@ packages: fast-safe-stringify: 2.1.1 dev: false - /ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 dev: false /ethers@5.7.2: @@ -9416,6 +10144,15 @@ packages: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + /eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} @@ -9443,6 +10180,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -9478,6 +10226,13 @@ packages: web-streams-polyfill: 3.2.1 dev: true + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9619,7 +10374,6 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} @@ -9646,9 +10400,9 @@ packages: resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} dev: false - /get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + engines: {node: '>=16'} dev: true /get-stream@6.0.1: @@ -9682,25 +10436,10 @@ packages: is-glob: 4.0.3 dev: true - /glob-regex@0.3.2: - resolution: {integrity: sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==} - dev: true - /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -9751,6 +10490,18 @@ packages: slash: 4.0.0 dev: true + /globby@14.0.0: + resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 1.0.0 + fast-glob: 3.3.2 + ignore: 5.2.4 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true @@ -9772,6 +10523,11 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: true + /graz@0.0.43(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cLHdOeYxwyvU8c/9eByK5m23XJH4L3mwZU58OIehNwnBGGF2kQQ0TyAviZ8XH+EPhgp/bzVOvgX+e/8FvwzxHg==} hasBin: true @@ -9898,87 +10654,160 @@ packages: minimalistic-assert: 1.0.1 dev: false - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + /hast-util-classnames@3.0.0: + resolution: {integrity: sha512-tI3JjoGDEBVorMAWK4jNRsfLMYmih1BUOG3VV36pH36njs1IEl7xkNrVTD2mD2yYHmQCa5R/fj61a8IAF4bRaQ==} dependencies: - '@types/hast': 2.3.5 - '@types/unist': 2.0.7 - hastscript: 7.2.0 + '@types/hast': 3.0.4 + space-separated-tokens: 2.0.2 + dev: true + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 property-information: 6.2.0 - vfile: 5.3.7 - vfile-location: 4.1.0 + vfile: 6.0.1 + vfile-location: 5.0.2 web-namespaces: 2.0.1 dev: true - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + /hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} dependencies: - '@types/hast': 2.3.5 + '@types/hast': 3.0.4 dev: true - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: - '@types/hast': 2.3.5 - '@types/parse5': 6.0.3 - hast-util-from-parse5: 7.1.2 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - parse5: 6.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + '@types/hast': 3.0.4 + dev: true + + /hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: true - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + /hast-util-select@6.0.2: + resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} dependencies: - '@types/estree': 1.0.1 - '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/unist': 2.0.7 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 + css-selector-parser: 3.0.4 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.0 + hast-util-whitespace: 3.0.0 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: true + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 property-information: 6.2.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.2 - unist-util-position: 4.0.4 + unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: - supports-color dev: true - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: - '@types/hast': 2.3.5 + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 property-information: 6.2.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: true - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + /hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + dependencies: + '@types/hast': 3.0.4 dev: true - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: - '@types/hast': 2.3.5 + '@types/hast': 3.0.4 + dev: true + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 + hast-util-parse-selector: 4.0.0 property-information: 6.2.0 space-separated-tokens: 2.0.2 dev: true + /headers-polyfill@4.0.2: + resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==} + dev: true + /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} dev: false @@ -10013,8 +10842,8 @@ packages: lru-cache: 6.0.0 dev: true - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} dev: true /http-assert@1.5.0: @@ -10056,6 +10885,13 @@ packages: ms: 2.1.3 dev: false + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -10109,6 +10945,31 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: true + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: true + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: true + /interface-blockstore@2.0.3: resolution: {integrity: sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w==} dependencies: @@ -10477,6 +11338,11 @@ packages: is-docker: 3.0.0 dev: true + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + /is-ip@3.1.0: resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} engines: {node: '>=8'} @@ -10497,6 +11363,10 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: true + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -10531,7 +11401,7 @@ packages: /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /is-regex@1.1.4: @@ -10581,6 +11451,11 @@ packages: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: false + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -10862,11 +11737,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - /koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} dev: true @@ -11065,6 +11935,14 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} @@ -11109,13 +11987,6 @@ packages: engines: {node: '>=12'} dev: false - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.2: resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} engines: {node: '>=12'} @@ -11140,9 +12011,9 @@ packages: engines: {node: '>=8'} dev: true - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} dev: true /markdown-table@3.0.3: @@ -11175,190 +12046,199 @@ packages: safe-buffer: 5.2.1 dev: false - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: true - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 dev: true - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color dev: true - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color dev: true - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 + devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - dev: true - - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 ccount: 2.0.1 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: - '@types/mdast': 3.0.12 - unist-util-is: 5.2.1 + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 dev: true - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 dev: true - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 zwitch: 2.0.4 dev: true - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 4.0.3 dev: true /media-typer@0.3.0: @@ -11399,336 +12279,336 @@ packages: engines: {node: '>= 8'} dev: true - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} dependencies: - '@types/estree': 1.0.1 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.1 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} dependencies: - '@types/estree': 1.0.1 - micromark-core-commonmark: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - micromark-extension-mdx-expression: 1.0.8 - micromark-extension-mdx-jsx: 1.0.5 - micromark-extension-mdx-md: 1.0.1 - micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} dependencies: - '@types/estree': 1.0.1 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} dev: true - /micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.1 - '@types/unist': 2.0.7 - estree-util-visit: 1.2.1 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 dev: true - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} dev: true - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 dev: true - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: true - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} dev: true - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} dev: true - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: '@types/debug': 4.1.12 debug: 4.3.4(supports-color@5.5.0) decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color dev: true @@ -11842,6 +12722,7 @@ packages: /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + dev: false /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} @@ -11854,6 +12735,38 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /msw@2.1.7(typescript@5.1.3): + resolution: {integrity: sha512-yTIYqEMqDSrdbVMrfmqP6rTKQsnIbglTvVmAHDWwNegyXPXRcV+RjsaFEqubRS266gwWCDLm9YdOkWSKLdDvJQ==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + peerDependencies: + typescript: '>= 4.7.x <= 5.3.x' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@mswjs/cookies': 1.1.0 + '@mswjs/interceptors': 0.25.16 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.4 + chalk: 4.1.2 + chokidar: 3.5.3 + graphql: 16.8.1 + headers-polyfill: 4.0.2 + inquirer: 8.2.6 + is-node-process: 1.2.0 + outvariant: 1.4.2 + path-to-regexp: 6.2.1 + strict-event-emitter: 0.5.1 + type-fest: 4.10.2 + typescript: 5.1.3 + yargs: 17.7.2 + dev: true + /multiaddr-to-uri@8.0.0(node-fetch@3.3.1): resolution: {integrity: sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==} deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri @@ -11887,12 +12800,8 @@ packages: engines: {node: '>=8.0.0'} dev: true - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true /nan@2.18.0: @@ -11911,6 +12820,12 @@ packages: hasBin: true dev: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /napi-wasm@1.1.0: resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} dev: false @@ -11969,8 +12884,8 @@ packages: engines: {node: '>=10.5.0'} dev: true - /node-fetch-native@1.6.1: - resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} + /node-fetch-native@1.6.2: + resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} dev: false /node-fetch@2.6.12: @@ -12032,6 +12947,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + /not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + dev: true + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -12045,6 +12964,12 @@ packages: path-key: 4.0.0 dev: true + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -12116,7 +13041,7 @@ packages: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: destr: 2.0.2 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 ufo: 1.3.2 dev: false @@ -12175,6 +13100,30 @@ packages: type-check: 0.4.0 dev: true + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /outvariant@1.4.2: + resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + dev: true + /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} @@ -12274,8 +13223,10 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 dev: true /parseurl@1.3.3: @@ -12304,11 +13255,20 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} @@ -12330,7 +13290,7 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.1 dev: true @@ -12380,11 +13340,6 @@ packages: thread-stream: 0.15.2 dev: false - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -12422,6 +13377,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.34: + resolution: {integrity: sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /preact@10.17.0: resolution: {integrity: sha512-SNsI8cbaCcUS5tbv9nlXuCfIXnJ9ysBMWk0WnB6UWwcVA3qZ2O6FxqDFECMAMttvLQcW/HaNZUe2BLidyvrVYw==} dev: false @@ -12453,11 +13417,13 @@ packages: react-is: 17.0.2 dev: true - /prism-react-renderer@1.3.5(react@18.2.0): - resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + /prism-react-renderer@2.3.1(react@18.2.0): + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} peerDependencies: - react: '>=0.14.9' + react: '>=16.0.0' dependencies: + '@types/prismjs': 1.26.3 + clsx: 2.1.0 react: 18.2.0 dev: true @@ -12656,14 +13622,12 @@ packages: react: 18.2.0 scheduler: 0.23.0 - /react-frame-component@5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4xpZFcLNS6LCEYSlWgsUy81v7LjdgbvB0VHIq7sNSD25PK+e5YYCrdy5557ebGwNLKNLEpYVfAkT3pVzFLPb1g==} + /react-hotkeys-hook@4.5.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==} peerDependencies: - prop-types: ^15.5.9 - react: '>= 16.3' - react-dom: '>= 16.3' + react: '>=16.8.1' + react-dom: '>=16.8.1' dependencies: - prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true @@ -12950,16 +13914,6 @@ packages: ms: 2.1.3 dev: true - /recrawl-sync@2.2.3: - resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==} - dependencies: - '@cush/relative': 1.0.0 - glob-regex: 0.3.2 - slash: 3.0.0 - sucrase: 3.34.0 - tslib: 1.14.1 - dev: true - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -13020,51 +13974,72 @@ packages: functions-have-names: 1.2.3 dev: true - /rehype-raw@6.1.1: - resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + /rehype-class-names@1.0.14: + resolution: {integrity: sha512-eFBt6Qxb7K77y6P82tUtN9rKpU7guWlaK4XA4RrrSFHkUTCvr2D3cgb9OR5d4t1AaGOvR59FH9nRwUnbpn9AEg==} dependencies: - '@types/hast': 2.3.5 - hast-util-raw: 7.2.3 + '@types/hast': 3.0.4 + hast-util-classnames: 3.0.0 + hast-util-select: 6.0.2 unified: 10.1.2 dev: true - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 + '@types/hast': 3.0.4 + hast-util-raw: 9.0.2 + vfile: 6.0.1 + dev: true + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color dev: true - /remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + /remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} dependencies: - mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.1 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color dev: true - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 transitivePeerDependencies: - supports-color dev: true - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: true + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 dev: true /remove-accents@0.4.2: @@ -13074,7 +14049,6 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -13116,6 +14090,14 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /retimer@2.0.0: resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} dev: true @@ -13151,6 +14133,29 @@ packages: fsevents: 2.3.3 dev: true + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 + fsevents: 2.3.3 + dev: true + /rpc-websockets@7.6.0: resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==} dependencies: @@ -13170,6 +14175,11 @@ packages: execa: 5.1.1 dev: true + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -13183,11 +14193,10 @@ packages: tslib: 1.14.1 dev: false - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - mri: 1.2.0 + tslib: 2.6.2 dev: true /safe-array-concat@1.0.0: @@ -13329,6 +14338,11 @@ packages: engines: {node: '>=12'} dev: true + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} dependencies: @@ -13414,6 +14428,11 @@ packages: engines: {node: '>= 0.6'} dev: true + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + /std-env@3.3.3: resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} dev: true @@ -13444,6 +14463,10 @@ packages: engines: {node: '>=10'} dev: true + /strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + dev: true + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -13567,6 +14590,12 @@ packages: inline-style-parser: 0.1.1 dev: true + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: true + /styled-components@5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} engines: {node: '>=10'} @@ -13591,20 +14620,6 @@ packages: transitivePeerDependencies: - '@babel/core' - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - /superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} engines: {node: '>=10'} @@ -13711,19 +14726,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} dependencies: @@ -13736,7 +14738,6 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false /time-zone@1.0.0: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} @@ -13786,6 +14787,13 @@ packages: engines: {node: '>=12'} dev: true + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -13821,8 +14829,17 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + /tsconfck@3.0.1(typescript@5.1.3): + resolution: {integrity: sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.3 dev: true /tsconfig-paths@3.14.2: @@ -13834,15 +14851,6 @@ packages: strip-bom: 3.0.0 dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -13855,7 +14863,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} @@ -13894,6 +14901,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -13909,6 +14921,11 @@ packages: engines: {node: '>=12.20'} dev: true + /type-fest@4.10.2: + resolution: {integrity: sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==} + engines: {node: '>=16'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -14004,7 +15021,7 @@ packages: consola: 3.2.3 defu: 6.1.3 mime: 3.0.0 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 pathe: 1.1.1 dev: false @@ -14012,6 +15029,11 @@ packages: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: false + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: @@ -14024,33 +15046,41 @@ packages: vfile: 5.3.7 dev: true - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 dev: true - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 3.0.2 dev: true - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 dev: true /unist-util-stringify-position@3.0.3: @@ -14059,19 +15089,25 @@ packages: '@types/unist': 2.0.7 dev: true - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 + '@types/unist': 3.0.2 dev: true - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: true + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: true /unload@2.2.0: @@ -14131,7 +15167,7 @@ packages: listhen: 1.5.5 lru-cache: 10.1.0 mri: 1.2.0 - node-fetch-native: 1.6.1 + node-fetch-native: 1.6.2 ofetch: 1.3.3 ufo: 1.3.2 transitivePeerDependencies: @@ -14283,17 +15319,6 @@ packages: hasBin: true dev: false - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: true - /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -14342,11 +15367,11 @@ packages: engines: {node: '>= 0.8'} dev: true - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: - '@types/unist': 2.0.7 - vfile: 5.3.7 + '@types/unist': 3.0.2 + vfile: 6.0.1 dev: true /vfile-message@3.1.4: @@ -14356,6 +15381,13 @@ packages: unist-util-stringify-position: 3.0.3 dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: true + /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: @@ -14365,6 +15397,14 @@ packages: vfile-message: 3.1.4 dev: true + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: true + /viem@1.20.0(typescript@5.1.3): resolution: {integrity: sha512-yPjV9pJr10xi28C/9LEvs5zdZNEMiru3Kz7nufghVYABJAfeSkoZQXb6b23n7MscS7c55JO5nmUI3xKkd9g6Yg==} peerDependencies: @@ -14423,18 +15463,21 @@ packages: - supports-color dev: true - /vite-tsconfig-paths@3.6.0(vite@4.3.9): - resolution: {integrity: sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==} + /vite-tsconfig-paths@4.3.1(typescript@5.1.3)(vite@5.0.12): + resolution: {integrity: sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==} peerDependencies: - vite: '>2.0.0-0' + vite: '*' + peerDependenciesMeta: + vite: + optional: true dependencies: debug: 4.3.4(supports-color@5.5.0) globrex: 0.1.2 - recrawl-sync: 2.2.3 - tsconfig-paths: 4.2.0 - vite: 4.3.9(@types/node@20.3.1) + tsconfck: 3.0.1(typescript@5.1.3) + vite: 5.0.12(@types/node@20.3.1) transitivePeerDependencies: - supports-color + - typescript dev: true /vite@4.3.9(@types/node@20.3.1): @@ -14470,6 +15513,42 @@ packages: fsevents: 2.3.3 dev: true + /vite@5.0.12(@types/node@20.3.1): + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.3.1 + esbuild: 0.19.12 + postcss: 8.4.34 + rollup: 4.9.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitest@0.32.2: resolution: {integrity: sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ==} engines: {node: '>=v14.18.0'} @@ -14600,6 +15679,12 @@ packages: graceful-fs: 4.2.11 dev: true + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + /web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} dependencies: @@ -14761,7 +15846,15 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} @@ -14859,6 +15952,11 @@ packages: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: false + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -14878,6 +15976,11 @@ packages: engines: {node: '>=10'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -14895,6 +15998,19 @@ packages: yargs-parser: 18.1.3 dev: false + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /ylru@1.3.2: resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} engines: {node: '>= 4.0.0'} @@ -14933,3 +16049,7 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/public/.well-known/assetlinks.json b/public/.well-known/assetlinks.json new file mode 100644 index 0000000..35c6d16 --- /dev/null +++ b/public/.well-known/assetlinks.json @@ -0,0 +1,22 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "exchange.dydx.trading.debug", + "sha256_cert_fingerprints": [ + "8A:9C:CC:49:B0:35:9A:91:67:CB:98:B0:B5:87:92:5F:9E:B7:EF:CE:A0:47:57:85:A4:35:3E:0C:E1:56:9E:A2" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "exchange.dydx.trading", + "sha256_cert_fingerprints": [ + "B2:2D:CC:27:9D:52:05:98:63:C9:7B:34:36:70:A3:8E:00:31:28:08:2D:2E:70:76:C9:31:AE:F9:55:21:15:A5" + ] + } + } +] diff --git a/public/chart-background.png b/public/chart-background.png deleted file mode 100644 index c7169a3..0000000 Binary files a/public/chart-background.png and /dev/null differ diff --git a/public/chart-bars-background.svg b/public/chart-bars-background.svg new file mode 100644 index 0000000..a8df022 --- /dev/null +++ b/public/chart-bars-background.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/chart-bars.svg b/public/chart-bars.svg new file mode 100644 index 0000000..9a2e431 --- /dev/null +++ b/public/chart-bars.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/chart-dots-background-dark.svg b/public/chart-dots-background-dark.svg new file mode 100644 index 0000000..8df0635 --- /dev/null +++ b/public/chart-dots-background-dark.svg @@ -0,0 +1,20484 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/chart-dots-background-light.svg b/public/chart-dots-background-light.svg new file mode 100644 index 0000000..f7dc81c --- /dev/null +++ b/public/chart-dots-background-light.svg @@ -0,0 +1,20484 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/configs/env.json b/public/configs/env.json index ce84f7a..1040d05 100644 --- a/public/configs/env.json +++ b/public/configs/env.json @@ -93,8 +93,10 @@ "documentation": "https://docs.dydx.exchange/", "community": "https://discord.com/invite/dydx", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -122,6 +124,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-dev-2": { @@ -172,8 +177,10 @@ "documentation": "https://docs.dydx.exchange/", "community": "https://discord.com/invite/dydx", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -201,6 +208,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-dev-4": { @@ -252,8 +262,10 @@ "documentation": "https://docs.dydx.exchange/", "community": "https://discord.com/invite/dydx", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -281,6 +293,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-dev-5": { @@ -331,8 +346,10 @@ "documentation": "https://docs.dydx.exchange/", "community": "https://discord.com/invite/dydx", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -360,6 +377,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-staging": { @@ -412,8 +432,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -441,6 +463,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-staging-forced-update": { @@ -488,7 +513,8 @@ "documentation": "https://v4-teacher.vercel.app/", "community": "https://discord.com/invite/dydx", "feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform", - "blogs": "https://www.dydx.foundation/blog" + "blogs": "https://www.dydx.foundation/blog", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" }, "wallets": { "walletconnect": { @@ -521,6 +547,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-staging-west": { @@ -573,8 +602,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -602,6 +633,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": true } }, "dydxprotocol-testnet": { @@ -658,8 +692,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -687,6 +723,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-dydx": { @@ -740,8 +779,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -769,6 +810,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-nodefleet": { @@ -822,8 +866,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -851,6 +897,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-kingnodes": { @@ -904,8 +953,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -933,6 +984,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-liquify": { @@ -986,8 +1040,10 @@ "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnMore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" }, @@ -1015,6 +1071,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-polkachu": { @@ -1063,7 +1122,8 @@ "documentation": "https://docs.dydx.exchange/", "community": "https://discord.com/invite/dydx", "feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform", - "blogs": "https://www.dydx.foundation/blog" + "blogs": "https://www.dydx.foundation/blog", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals" }, "wallets": { "walletconnect": { @@ -1089,6 +1149,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-testnet-bware": { @@ -1142,8 +1205,10 @@ "reduceOnlyLearnmore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", "governanceLearnmore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", "stakingLearnmore": "https://help.dydx.exchange", "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", "accountExportLearnmore": "https://help.dydx.exchange", "walletLearnmore": "https://www.dydx.academy/video/defi-wallet" }, @@ -1171,6 +1236,9 @@ "delayBlocks": 900, "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" } + }, + "featureFlags": { + "reduceOnlySupported": false } }, "dydxprotocol-mainnet": { @@ -1224,8 +1292,10 @@ "community": "[HTTP link to community, can be null]", "help": "[HTTP link to help page, can be null]", "governanceLearnMore": "[HTTP link to governance learn more, can be null]", + "newMarketProposalLearnMore": "[HTTP link to new market proposal learn more, can be null]", "stakingLearnMore": "[HTTP link to staking learn more, can be null]", "keplrDashboard": "[HTTP link to keplr dashboard, can be null]", + "strideZoneApp": "[HTTP link to stride zone app, can be null]", "accountExportLearnMore": "[HTTP link to account export learn more, can be null]", "walletLearnMore": "[HTTP link to wallet learn more, can be null]" }, @@ -1253,7 +1323,10 @@ "delayBlocks": 0, "newMarketsMethodology": "[URL to spreadsheet or document that explains methodology]" } + }, + "featureFlags": { + "reduceOnlySupported": false } } } -} +} \ No newline at end of file diff --git a/public/configs/markets.json b/public/configs/markets.json index f743aa3..22d9461 100644 --- a/public/configs/markets.json +++ b/public/configs/markets.json @@ -20,6 +20,13 @@ "whitepaperLink": "https://why.cardano.org/en/introduction/motivation/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/cardano/" }, + "AGIX-USD": { + "name": "SingularityNET", + "tags": ["AI"], + "websiteLink": "https://public.singularitynet.io/whitepaper.pdf", + "whitepaperLink": "https://public.singularitynet.io/whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/singularitynet/" + }, "ALGO-USD": { "name": "Algorand", "tags": ["Layer 1"], @@ -78,11 +85,26 @@ }, "BLUR-USD": { "name": "Blur", - "tags": [], + "tags": ["NFT"], "websiteLink": "https://blur.io/", "whitepaperLink": "https://docs.blur.foundation/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/blur-token/" }, + "BNB-USD":{ + "name": "BNB", + "tags": ["Layer 1"], + "websiteLink": "https://www.bnbchain.org/en", + "whitepaperLink": "https://www.exodus.com/assets/docs/binance-coin-whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/bnb/" + + }, + "CHZ-USD": { + "name": "Chiliz", + "tags": ["Layer 1"], + "websiteLink": "https://www.chiliz.com/", + "whitepaperLink": "https://www.chiliz.com/docs/litepaper-v1.1-20230703.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/chiliz/" + }, "CELO-USD": { "name": "Celo", "tags": [], @@ -125,6 +147,13 @@ "whitepaperLink": "https://polkadot.network/PolkaDotPaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/polkadot-new/" }, + "DYM-USD": { + "name": "Dymension", + "tags": [], + "websiteLink": "https://dymension.xyz/", + "whitepaperLink": "https://docs.dymension.xyz/dymension-litepaper/dymension-litepaper-index", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/dymension/" + }, "ENJ-USD": { "name": "Enjin", "tags": [], @@ -132,6 +161,13 @@ "whitepaperLink": "https://cdn.enjin.io/downloads/whitepapers/enjin-coin/en.pdf/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/enjin-coin/" }, + "ENS-USD": { + "name": "Ethereum Name Service", + "tags": [], + "websiteLink": "https://coinmarketcap.com/currencies/ethereum-name-service/", + "whitepaperLink": "https://docs.ens.domains/", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/ethereum-name-service/" + }, "EOS-USD": { "name": "EOS", "tags": ["Layer 1"], @@ -155,6 +191,13 @@ "displayStepSize": "0.001", "displayTickSize": "0.1" }, + "FET-USD": { + "name": "Fetch.ai", + "tags": ["AI"], + "websiteLink": "https://fetch.ai/", + "whitepaperLink": "https://www.dropbox.com/s/gxptsecwdl3jjtn/David%20Minarsch%20-%202021-04-26%2010.34.17%20-%20paper_21_finalversion.pdf?e=1&dl=0", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/fetch/" + }, "FIL-USD": { "name": "Filecoin", "tags": ["Layer 1"], @@ -162,6 +205,34 @@ "whitepaperLink": "https://filecoin.io/filecoin.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/filecoin/" }, + "FTM-USD": { + "name": "Fantom", + "tags": [], + "websiteLink": "https://fantom.foundation/", + "whitepaperLink": "https://fantom.foundation/_next/static/media/wp_fantom_v1.6.39329cdc5d0ee59684cbc6f228516383.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/fantom/" + }, + "GALA-USD": { + "name": "Gala", + "tags": ["Gaming", "Layer 1"], + "websiteLink": "https://gala.com/", + "whitepaperLink": "https://galahackathon.com/v1.0.0/pdf/sdk-documentation.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/gala/" + }, + "GMT-USD": { + "name": "GMT", + "tags": ["Gaming"], + "websiteLink": "https://stepn.com/", + "whitepaperLink/": "https://whitepaper.stepn.com/", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/green-metaverse-token/" + }, + "GRT-USD": { + "name": "The Graph", + "tags": [], + "websiteLink": "https://thegraph.com/", + "whitepaperLink/": "https://github.com/graphprotocol/research/blob/master/papers/whitepaper/the-graph-whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/the-graph/" + }, "HNT-USD": { "name": "Helium", "tags": ["Layer 1"], @@ -169,6 +240,13 @@ "whitepaperLink": "http://whitepaper.helium.com", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/helium/" }, + "HBAR-USD": { + "name": "Hedera", + "tags": [], + "websiteLink": "https://hedera.com/", + "whitepaperLink/": "https://files.hedera.com/hh_whitepaper_v2.2-20230918.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/hedera/" + }, "ICP-USD": { "name": "Internet Computer", "tags": ["Layer 1"], @@ -176,6 +254,41 @@ "whitepaperLink": "https://dfinity.org/whitepaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/internet-computer/" }, + "IMX-USD": { + "name": "Immutable X", + "tags": ["Gaming", "Layer 2", "NFT"], + "websiteLink": "https://www.immutable.com/", + "whitepaperLink": "https://assets.website-files.com/646557ee455c3e16e4a9bcb3/6499367de527dd82ab7475a3_Immutable%20Whitepaper%20Update%202023%20(3).pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/immutable-x/" + }, + "INJ-USD": { + "name": "Injective", + "tags": ["Layer 1", "Defi"], + "websiteLink": "https://injective.com/", + "whitepaperLink": "https://docs.injective.network/intro/01_overview.html", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/injective/" + }, + "JTO-USD": { + "name": "Jito", + "tags": ["Defi"], + "websiteLink": "https://www.jito.network/", + "whitepaperLink": "https://github.com/jito-foundation", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/jito/" + }, + "JUP-USD": { + "name": "Jupiter", + "tags": ["Defi"], + "websiteLink": "https://station.jup.ag/", + "whitepaperLink": "https://station.jup.ag/blog/green-paper", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/jupiter-ag/" + }, + "KAVA-USD": { + "name": "Kava", + "tags": ["Layer 1"], + "websiteLink": "https://www.kava.io/", + "whitepaperLink": "https://docsend.com/view/gwbwpc3", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/kava/" + }, "LDO-USD": { "name": "Lido DAO", "tags": ["Defi"], @@ -197,6 +310,20 @@ "whitepaperLink": "https://litecoin.info/index.php/Main_Page", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/litecoin/" }, + "MANA-USD": { + "name": "Decentraland", + "tags": ["AR/VR"], + "websiteLink": "https://decentraland.org/", + "whitepaperLink": "https://decentraland.org/whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/decentraland/" + }, + "MASK-USD": { + "name": "Mask Network", + "tags": [], + "websiteLink": "https://mask.io/", + "whitepaperLink": "https://masknetwork.medium.com/introducing-mask-network-maskbook-the-future-of-the-internet-5a973d874edd", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/mask-network/" + }, "MATIC-USD": { "name": "Polygon", "tags": ["Layer 2"], @@ -204,6 +331,13 @@ "whitepaperLink": "https://polygon.technology/lightpaper-polygon.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/polygon/" }, + "MINA-USD": { + "name": "Mina", + "tags": ["Layer 1"], + "websiteLink": "https://minaprotocol.com/", + "whitepaperLink": "https://docs.minaprotocol.com/assets/economicsWhitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/mina/" + }, "MKR-USD": { "name": "Maker", "tags": ["Governance"], @@ -218,6 +352,13 @@ "whitepaperLink": "https://near.org/papers/the-official-near-white-paper/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/near-protocol/" }, + "ORDI-USD": { + "name": "Ordinals", + "tags": ["NFT"], + "websiteLink": "https://ordinals.com/", + "whitepaperLink": "https://rodarmor.com/blog/", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/ordi/" + }, "OP-USD": { "name": "Optimism", "tags": [], @@ -231,6 +372,20 @@ "websiteLink": "https://www.pepe.vip/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/pepe/" }, + "PYTH-USD": { + "name": "Pyth Network", + "tags": [], + "websiteLink": "https://pyth.network/", + "whitepaperLink": "https://pyth.network/whitepaper_v2.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/pyth-network/" + }, + "RNDR-USD": { + "name": "Render Token", + "tags": ["AI"], + "websiteLink": "https://rendernetwork.com/", + "whitepaperLink": "https://renderfoundation.com/whitepaper", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/render/" + }, "RUNE-USD": { "name": "THORChain", "tags": ["Layer 1"], @@ -238,6 +393,13 @@ "whitepaperLink": "https://whitepaper.io/document/709/thorchain-whitepaper", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/thorchain/" }, + "SAND-USD": { + "name": "The Sandbox", + "tags": ["Gaming"], + "websiteLink": "https://www.sandbox.game/en/", + "whitepaperLink": "https://installers.sandbox.game/The_Sandbox_Whitepaper_2020.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/the-sandbox/" + }, "SEI-USD": { "name": "Sei", "tags": ["Layer 1", "Defi"], @@ -266,6 +428,13 @@ "whitepaperLink": "https://solana.com/solana-whitepaper.pdf", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/solana/" }, + "STX-USD": { + "name": "Stacks", + "tags": ["Layer 2"], + "websiteLink": "https://www.stacks.co/", + "whitepaperLink": "https://gaia.blockstack.org/hub/1AxyPunHHAHiEffXWESKfbvmBpGQv138Fp/stacks.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/stacks/" + }, "SUI-USD": { "name": "Sui", "tags": ["Layer 1"], @@ -315,6 +484,13 @@ "whitepaperLink": "https://whitepaper.worldcoin.org/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/worldcoin-org/" }, + "WOO-USD": { + "name": "WOO Network", + "tags": ["Defi"], + "websiteLink": "https://woo.org/", + "whitepaperLink": "https://woo.org/Litepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/wootrade/" + }, "XLM-USD": { "name": "Stellar", "tags": ["Layer 1"], @@ -357,6 +533,13 @@ "whitepaperLink": "https://z.cash/technology/", "coinMarketCapsLink": "https://coinmarketcap.com/currencies/zcash/" }, + "ZETA-USD": { + "name": "ZetaChain", + "tags": ["Layer 1"], + "websiteLink": "https://www.zetachain.com/", + "whitepaperLink": "https://www.zetachain.com/whitepaper.pdf", + "coinMarketCapsLink": "https://coinmarketcap.com/currencies/zetachain/" + }, "ZRX-USD": { "name": "0x", "tags": ["Defi"], diff --git a/public/configs/otherMarketDisclaimer.md b/public/configs/otherMarketDisclaimer.md new file mode 100644 index 0000000..68f8284 --- /dev/null +++ b/public/configs/otherMarketDisclaimer.md @@ -0,0 +1 @@ +This file identifies parameters for the optimal performance of various assets with the dYdX v4 open source software ("dYdX Chain"). For information on which assets are likely to be best compatible with dYdX Chain and how likely software compatibility and optimal parameters are assessed, please review the documentation [here](https://docs.dydx.trade/governance/proposing_a_new_market#example-proposal-json). Users considering using the permissionless markets function of the dYdX Chain are encouraged to consult qualified legal counsel to ensure compliance with the laws of their jurisdiction. The information herein does not constitute and should not be relied on as an endorsement or recommendation for any specific market, or investment, legal, or any other form of professional advice. Use of the v4 software is prohibited in the United States, Canada, and sanctioned jurisdictions as described in the [v4 Terms of Use](https://dydx.exchange/v4-terms). diff --git a/public/configs/otherMarketExchangeConfig.json b/public/configs/otherMarketExchangeConfig.json new file mode 100644 index 0000000..d824230 --- /dev/null +++ b/public/configs/otherMarketExchangeConfig.json @@ -0,0 +1,608 @@ +{ + "1INCH": [ + { "exchangeName": "Binance", "ticker": "1INCHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "1INCH-USD" }, + { "exchangeName": "Gate", "ticker": "1INCH_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "1INCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "1INCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "1INCH_USDT", "adjustByMarket": "USDT-USD" } + ], + "AAVE": [ + { "exchangeName": "Binance", "ticker": "AAVEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "AAVE-USD" }, + { "exchangeName": "Huobi", "ticker": "aaveusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "AAVEUSD" }, + { "exchangeName": "Kucoin", "ticker": "AAVE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "AAVE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "AAVE_USDT", "adjustByMarket": "USDT-USD" } + ], + "ADA": [ + { "exchangeName": "Binance", "ticker": "ADAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "ADA/USD" }, + { "exchangeName": "Bybit", "ticker": "ADAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ADA-USD" }, + { "exchangeName": "Huobi", "ticker": "adausdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ADAUSD" }, + { "exchangeName": "Kucoin", "ticker": "ADA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ADA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ADA_USDT", "adjustByMarket": "USDT-USD" } + ], + "AGIX": [ + { "exchangeName": "Binance", "ticker": "AGIXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "AGIXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "AGIX_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "AGIX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "AGIX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "AGIX_USDT", "adjustByMarket": "USDT-USD" } + ], + "ALGO": [ + { "exchangeName": "Binance", "ticker": "ALGOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ALGO-USD" }, + { "exchangeName": "Kraken", "ticker": "ALGOUSD" }, + { "exchangeName": "Kucoin", "ticker": "ALGO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ALGO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ALGO_USDT", "adjustByMarket": "USDT-USD" } + ], + "APE": [ + { "exchangeName": "Binance", "ticker": "APEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "APE-USD" }, + { "exchangeName": "Gate", "ticker": "APE_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "APEUSD" }, + { "exchangeName": "Kucoin", "ticker": "APE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "APE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "APE_USDT", "adjustByMarket": "USDT-USD" } + ], + "APT": [ + { "exchangeName": "Binance", "ticker": "APTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "APTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "APT-USD" }, + { "exchangeName": "Gate", "ticker": "APT_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "aptusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "APTUSD" }, + { "exchangeName": "Kucoin", "ticker": "APT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "APT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "APT_USDT", "adjustByMarket": "USDT-USD" } + ], + "ARB": [ + { "exchangeName": "Binance", "ticker": "ARBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ARBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ARB-USD" }, + { "exchangeName": "Huobi", "ticker": "arbusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ARBUSD" }, + { "exchangeName": "Kucoin", "ticker": "ARB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ARB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ARB_USDT", "adjustByMarket": "USDT-USD" } + ], + "ATOM": [ + { "exchangeName": "Binance", "ticker": "ATOMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ATOMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ATOM-USD" }, + { "exchangeName": "Gate", "ticker": "ATOM_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ATOMUSD" }, + { "exchangeName": "Kucoin", "ticker": "ATOM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ATOM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ATOM_USDT", "adjustByMarket": "USDT-USD" } + ], + "AVAX": [ + { "exchangeName": "Binance", "ticker": "AVAXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "AVAX/USD" }, + { "exchangeName": "Bybit", "ticker": "AVAXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "AVAX-USD" }, + { "exchangeName": "Huobi", "ticker": "avaxusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "AVAXUSD" }, + { "exchangeName": "Kucoin", "ticker": "AVAX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "AVAX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "AVAX_USDT", "adjustByMarket": "USDT-USD" } + ], + "BCH": [ + { "exchangeName": "Binance", "ticker": "BCHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "BCH/USD" }, + { "exchangeName": "Bybit", "ticker": "BCHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BCH-USD" }, + { "exchangeName": "Huobi", "ticker": "bchusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "BCHUSD" }, + { "exchangeName": "Kucoin", "ticker": "BCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BCH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BCH_USDT", "adjustByMarket": "USDT-USD" } + ], + "BLUR": [ + { "exchangeName": "Binance", "ticker": "BLURUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "BLURUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BLUR-USD" }, + { "exchangeName": "Kraken", "ticker": "BLURUSD" }, + { "exchangeName": "Kucoin", "ticker": "BLUR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BLUR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BLUR_USDT", "adjustByMarket": "USDT-USD" } + ], + "BNB": [ + { "exchangeName": "Binance", "ticker": "BNBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "BNBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "BNB_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "BNB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BNB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BNB_USDT", "adjustByMarket": "USDT-USD" } + ], + "BONK": [ + { "exchangeName": "Binance", "ticker": "BONKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "BONKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BONK-USD" }, + { "exchangeName": "Kucoin", "ticker": "BONK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BONK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BONK_USDT", "adjustByMarket": "USDT-USD" } + ], + "BTC": [ + { "exchangeName": "Binance", "ticker": "BTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "BTC/USD" }, + { "exchangeName": "Bybit", "ticker": "BTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "BTC-USD" }, + { "exchangeName": "Huobi", "ticker": "btcusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "BTCUSD" }, + { "exchangeName": "Kucoin", "ticker": "BTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "BTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "BTC_USDT", "adjustByMarket": "USDT-USD" } + ], + "CHZ": [ + { "exchangeName": "Binance", "ticker": "CHZUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "CHZ-USD" }, + { "exchangeName": "Kraken", "ticker": "CHZUSD" }, + { "exchangeName": "Kucoin", "ticker": "CHZ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "CHZ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "CHZ_USDT", "adjustByMarket": "USDT-USD" } + ], + "CRV": [ + { "exchangeName": "Binance", "ticker": "CRVUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "CRV-USD" }, + { "exchangeName": "Kraken", "ticker": "CRVUSD" }, + { "exchangeName": "Kucoin", "ticker": "CRV-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "CRV-USDT", "adjustByMarket": "USDT-USD" } + ], + "DOGE": [ + { "exchangeName": "Binance", "ticker": "DOGEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "DOGEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "DOGE-USD" }, + { "exchangeName": "Huobi", "ticker": "dogeusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "DOGEUSD" }, + { "exchangeName": "Kucoin", "ticker": "DOGE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "DOGE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "DOGE_USDT", "adjustByMarket": "USDT-USD" } + ], + "DOT": [ + { "exchangeName": "Binance", "ticker": "DOTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "DOTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "DOT-USD" }, + { "exchangeName": "Huobi", "ticker": "dotusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "DOTUSD" }, + { "exchangeName": "Kucoin", "ticker": "DOT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "DOT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "DOT_USDT", "adjustByMarket": "USDT-USD" } + ], + "DYM": [ + { "exchangeName": "Binance", "ticker": "DYMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "DYMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "DYM_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "DYM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "DYM_USDT", "adjustByMarket": "USDT-USD" } + ], + "ENS": [ + { "exchangeName": "Binance", "ticker": "ENSUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ENS-USD" }, + { "exchangeName": "Gate", "ticker": "ENS_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "ENS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ENS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ENS_USDT", "adjustByMarket": "USDT-USD" } + ], + "EOS": [ + { "exchangeName": "Binance", "ticker": "EOSUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "EOSUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "EOS-USD" }, + { "exchangeName": "Gate", "ticker": "EOS_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "EOSUSD" }, + { "exchangeName": "Kucoin", "ticker": "EOS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "EOS-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "EOS_USDT", "adjustByMarket": "USDT-USD" } + ], + "ETC": [ + { "exchangeName": "Binance", "ticker": "ETCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ETCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ETC-USD" }, + { "exchangeName": "Huobi", "ticker": "etcusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ETCUSD" }, + { "exchangeName": "Kucoin", "ticker": "ETC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ETC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ETC_USDT", "adjustByMarket": "USDT-USD" } + ], + "ETH": [ + { "exchangeName": "Binance", "ticker": "ETHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "ETH/USD" }, + { "exchangeName": "Bybit", "ticker": "ETHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ETH-USD" }, + { "exchangeName": "Huobi", "ticker": "ethusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "ETHUSD" }, + { "exchangeName": "Kucoin", "ticker": "ETH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ETH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ETH_USDT", "adjustByMarket": "USDT-USD" } + ], + "FET": [ + { "exchangeName": "Binance", "ticker": "FETUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "FET-USD" }, + { "exchangeName": "Kraken", "ticker": "FETUSD" }, + { "exchangeName": "Kucoin", "ticker": "FET-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "FET-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "FET_USDT", "adjustByMarket": "USDT-USD" } + ], + "FIL": [ + { "exchangeName": "Binance", "ticker": "FILUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "FILUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "FIL-USD" }, + { "exchangeName": "Huobi", "ticker": "filusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "FILUSD" }, + { "exchangeName": "Kucoin", "ticker": "FIL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "FIL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "FIL_USDT", "adjustByMarket": "USDT-USD" } + ], + "FTM": [ + { "exchangeName": "Binance", "ticker": "FTMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "FTMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "FTMUSD" }, + { "exchangeName": "Kucoin", "ticker": "FTM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "FTM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "FTM_USDT", "adjustByMarket": "USDT-USD" } + ], + "GALA": [ + { "exchangeName": "Binance", "ticker": "GALAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "GALAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "GALA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "GALAUSD" }, + { "exchangeName": "Okx", "ticker": "GALA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "GALA_USDT", "adjustByMarket": "USDT-USD" } + ], + "GMT": [ + { "exchangeName": "Binance", "ticker": "GMTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "GMTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "GMT-USD" }, + { "exchangeName": "Gate", "ticker": "GMT_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "GMT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "GMT-USDT", "adjustByMarket": "USDT-USD" } + ], + "GRT": [ + { "exchangeName": "Binance", "ticker": "GRTUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "GRT-USD" }, + { "exchangeName": "Gate", "ticker": "GRT_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "GRTUSD" }, + { "exchangeName": "Kucoin", "ticker": "GRT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "GRT-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "GRT_USDT", "adjustByMarket": "USDT-USD" } + ], + "HBAR": [ + { "exchangeName": "Binance", "ticker": "HBARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "HBARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "HBAR-USD" }, + { "exchangeName": "Kucoin", "ticker": "HBAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "HBAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "HBAR_USDT", "adjustByMarket": "USDT-USD" } + ], + "ICP": [ + { "exchangeName": "Binance", "ticker": "ICPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ICPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ICP-USD" }, + { "exchangeName": "Kraken", "ticker": "ICPUSD" }, + { "exchangeName": "Kucoin", "ticker": "ICP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ICP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ICP_USDT", "adjustByMarket": "USDT-USD" } + ], + "IMX": [ + { "exchangeName": "Binance", "ticker": "IMXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "IMX-USD" }, + { "exchangeName": "Kraken", "ticker": "IMXUSD" }, + { "exchangeName": "Kucoin", "ticker": "IMX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "IMX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "IMX_USDT", "adjustByMarket": "USDT-USD" } + ], + "INJ": [ + { "exchangeName": "Binance", "ticker": "INJUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "INJUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "INJ-USD" }, + { "exchangeName": "Kraken", "ticker": "INJUSD" }, + { "exchangeName": "Kucoin", "ticker": "INJ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "INJ-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "INJ_USDT", "adjustByMarket": "USDT-USD" } + ], + "JTO": [ + { "exchangeName": "Binance", "ticker": "JTOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "JTOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "JTO-USD" }, + { "exchangeName": "Kucoin", "ticker": "JTO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "JTO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "JTO_USDT", "adjustByMarket": "USDT-USD" } + ], + "JUP": [ + { "exchangeName": "Binance", "ticker": "JUPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "JUPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "JUP_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "JUP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "JUP_USDT", "adjustByMarket": "USDT-USD" } + ], + "KAVA": [ + { "exchangeName": "Binance", "ticker": "KAVAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "KAVAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "KAVA-USD" }, + { "exchangeName": "Gate", "ticker": "KAVA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "KAVAUSD" }, + { "exchangeName": "Kucoin", "ticker": "KAVA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "KAVA_USDT", "adjustByMarket": "USDT-USD" } + ], + "LDO": [ + { "exchangeName": "Binance", "ticker": "LDOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "LDOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "LDO-USD" }, + { "exchangeName": "Kraken", "ticker": "LDOUSD" }, + { "exchangeName": "Kucoin", "ticker": "LDO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "LDO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "LDO_USDT", "adjustByMarket": "USDT-USD" } + ], + "LINK": [ + { "exchangeName": "Binance", "ticker": "LINKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "LINK/USD" }, + { "exchangeName": "Bybit", "ticker": "LINKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "LINK-USD" }, + { "exchangeName": "Kraken", "ticker": "LINKUSD" }, + { "exchangeName": "Kucoin", "ticker": "LINK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "LINK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "LINK_USDT", "adjustByMarket": "USDT-USD" } + ], + "LTC": [ + { "exchangeName": "Binance", "ticker": "LTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "LTC/USD" }, + { "exchangeName": "Bybit", "ticker": "LTCUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "LTC-USD" }, + { "exchangeName": "Huobi", "ticker": "ltcusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "LTCUSD" }, + { "exchangeName": "Kucoin", "ticker": "LTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "LTC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "LTC_USDT", "adjustByMarket": "USDT-USD" } + ], + "MANA": [ + { "exchangeName": "Binance", "ticker": "MANAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MANA-USD" }, + { "exchangeName": "Gate", "ticker": "MANA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "MANAUSD" }, + { "exchangeName": "Kucoin", "ticker": "MANA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MANA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MANA_USDT", "adjustByMarket": "USDT-USD" } + ], + "MASK": [ + { "exchangeName": "Binance", "ticker": "MASKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "MASKUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MASK-USD" }, + { "exchangeName": "Gate", "ticker": "MASK_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "maskusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "MASK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MASK-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MASK_USDT", "adjustByMarket": "USDT-USD" } + ], + "MATIC": [ + { "exchangeName": "Binance", "ticker": "MATICUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "MATIC/USD" }, + { "exchangeName": "Bybit", "ticker": "MATICUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MATIC-USD" }, + { "exchangeName": "Huobi", "ticker": "maticusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "MATICUSD" }, + { "exchangeName": "Kucoin", "ticker": "MATIC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MATIC-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MATIC_USDT", "adjustByMarket": "USDT-USD" } + ], + "MINA": [ + { "exchangeName": "Binance", "ticker": "MINAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MINA-USD" }, + { "exchangeName": "Gate", "ticker": "MINA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "MINAUSD" }, + { "exchangeName": "Okx", "ticker": "MINA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "MINA_USDT", "adjustByMarket": "USDT-USD" } + ], + "MKR": [ + { "exchangeName": "Binance", "ticker": "MKRUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "MKR-USD" }, + { "exchangeName": "Kraken", "ticker": "MKRUSD" }, + { "exchangeName": "Kucoin", "ticker": "MKR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "MKR-USDT", "adjustByMarket": "USDT-USD" } + ], + "NEAR": [ + { "exchangeName": "Binance", "ticker": "NEARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "NEARUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "NEAR-USD" }, + { "exchangeName": "Huobi", "ticker": "nearusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "NEARUSD" }, + { "exchangeName": "Kucoin", "ticker": "NEAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "NEAR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "NEAR_USDT", "adjustByMarket": "USDT-USD" } + ], + "OP": [ + { "exchangeName": "Binance", "ticker": "OPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "OPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "OP-USD" }, + { "exchangeName": "Gate", "ticker": "OP_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "OPUSD" }, + { "exchangeName": "Kucoin", "ticker": "OP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "OP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "OP_USDT", "adjustByMarket": "USDT-USD" } + ], + "ORDI": [ + { "exchangeName": "Binance", "ticker": "ORDIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "ORDIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "ORDI_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "ordiusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "ORDI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ORDI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ORDI_USDT", "adjustByMarket": "USDT-USD" } + ], + "PEPE": [ + { "exchangeName": "Binance", "ticker": "PEPEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "PEPEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "PEPEUSD" }, + { "exchangeName": "Kucoin", "ticker": "PEPE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "PEPE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "PEPE_USDT", "adjustByMarket": "USDT-USD" } + ], + "PYTH": [ + { "exchangeName": "Binance", "ticker": "PYTHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "PYTHUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "PYTH_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "PYTH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "PYTH-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "PYTH_USDT", "adjustByMarket": "USDT-USD" } + ], + "RNDR": [ + { "exchangeName": "Binance", "ticker": "RNDRUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "RNDR-USD" }, + { "exchangeName": "Kraken", "ticker": "RNDRUSD" }, + { "exchangeName": "Kucoin", "ticker": "RNDR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "RNDR-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "RNDR_USDT", "adjustByMarket": "USDT-USD" } + ], + "RUNE": [ + { "exchangeName": "Binance", "ticker": "RUNEUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "RUNE_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "RUNEUSD" }, + { "exchangeName": "Kucoin", "ticker": "RUNE-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "RUNE_USDT", "adjustByMarket": "USDT-USD" } + ], + "SAND": [ + { "exchangeName": "Binance", "ticker": "SANDUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SAND-USD" }, + { "exchangeName": "Gate", "ticker": "SAND_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "SAND-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SAND-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SAND_USDT", "adjustByMarket": "USDT-USD" } + ], + "SEI": [ + { "exchangeName": "Binance", "ticker": "SEIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SEIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SEI-USD" }, + { "exchangeName": "Huobi", "ticker": "seiusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SEIUSD" }, + { "exchangeName": "Kucoin", "ticker": "SEI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SEI_USDT", "adjustByMarket": "USDT-USD" } + ], + "SHIB": [ + { "exchangeName": "Binance", "ticker": "SHIBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SHIBUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SHIB-USD" }, + { "exchangeName": "Huobi", "ticker": "shibusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SHIBUSD" }, + { "exchangeName": "Kucoin", "ticker": "SHIB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SHIB-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SHIB_USDT", "adjustByMarket": "USDT-USD" } + ], + "SNX": [ + { "exchangeName": "Binance", "ticker": "SNXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SNXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SNX-USD" }, + { "exchangeName": "Kraken", "ticker": "SNXUSD" }, + { "exchangeName": "Kucoin", "ticker": "SNX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SNX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SNX_USDT", "adjustByMarket": "USDT-USD" } + ], + "SOL": [ + { "exchangeName": "Binance", "ticker": "SOLUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "SOL/USD" }, + { "exchangeName": "Bybit", "ticker": "SOLUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SOL-USD" }, + { "exchangeName": "Huobi", "ticker": "solusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SOLUSD" }, + { "exchangeName": "Kucoin", "ticker": "SOL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SOL-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SOL_USDT", "adjustByMarket": "USDT-USD" } + ], + "STX": [ + { "exchangeName": "Binance", "ticker": "STXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "STXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "STX-USD" }, + { "exchangeName": "Gate", "ticker": "STX_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "STXUSD" }, + { "exchangeName": "Kucoin", "ticker": "STX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "STX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "STX_USDT", "adjustByMarket": "USDT-USD" } + ], + "SUI": [ + { "exchangeName": "Binance", "ticker": "SUIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "SUIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "SUI-USD" }, + { "exchangeName": "Huobi", "ticker": "suiusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "SUIUSD" }, + { "exchangeName": "Kucoin", "ticker": "SUI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "SUI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "SUI_USDT", "adjustByMarket": "USDT-USD" } + ], + "TIA": [ + { "exchangeName": "Binance", "ticker": "TIAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "TIAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "TIA-USD" }, + { "exchangeName": "Kraken", "ticker": "TIAUSD" }, + { "exchangeName": "Kucoin", "ticker": "TIA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "TIA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "TIA_USDT", "adjustByMarket": "USDT-USD" } + ], + "TRX": [ + { "exchangeName": "Binance", "ticker": "TRXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "TRXUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "TRX_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Huobi", "ticker": "trxusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "TRXUSD" }, + { "exchangeName": "Kucoin", "ticker": "TRX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "TRX-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "TRX_USDT", "adjustByMarket": "USDT-USD" } + ], + "UNI": [ + { "exchangeName": "Binance", "ticker": "UNIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "UNIUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "UNI-USD" }, + { "exchangeName": "Kraken", "ticker": "UNIUSD" }, + { "exchangeName": "Kucoin", "ticker": "UNI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "UNI-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "UNI_USDT", "adjustByMarket": "USDT-USD" } + ], + "WLD": [ + { "exchangeName": "Binance", "ticker": "WLDUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bybit", "ticker": "WLDUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "WLD_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "WLD-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "WLD-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "WLD_USDT", "adjustByMarket": "USDT-USD" } + ], + "WOO": [ + { "exchangeName": "Binance", "ticker": "WOOUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Gate", "ticker": "WOO_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "WOO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "WOO-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "WOO_USDT", "adjustByMarket": "USDT-USD" } + ], + "XLM": [ + { "exchangeName": "Binance", "ticker": "XLMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "XLM/USD" }, + { "exchangeName": "Bybit", "ticker": "XLMUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "XLM-USD" }, + { "exchangeName": "Kraken", "ticker": "XLMUSD" }, + { "exchangeName": "Kucoin", "ticker": "XLM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "XLM-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "XLM_USDT", "adjustByMarket": "USDT-USD" } + ], + "XRP": [ + { "exchangeName": "Binance", "ticker": "XRPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Bitstamp", "ticker": "XRP/USD" }, + { "exchangeName": "Bybit", "ticker": "XRPUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "XRP-USD" }, + { "exchangeName": "Huobi", "ticker": "xrpusdt", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kraken", "ticker": "XRPUSD" }, + { "exchangeName": "Kucoin", "ticker": "XRP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "XRP-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "XRP_USDT", "adjustByMarket": "USDT-USD" } + ], + "ZETA": [ + { "exchangeName": "Bybit", "ticker": "ZETAUSDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "CoinbasePro", "ticker": "ZETA-USD" }, + { "exchangeName": "Gate", "ticker": "ZETA_USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Kucoin", "ticker": "ZETA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Okx", "ticker": "ZETA-USDT", "adjustByMarket": "USDT-USD" }, + { "exchangeName": "Mexc", "ticker": "ZETA_USDT", "adjustByMarket": "USDT-USD" } + ] +} diff --git a/public/configs/otherMarketParameters.json b/public/configs/otherMarketParameters.json new file mode 100644 index 0000000..e93bd36 --- /dev/null +++ b/public/configs/otherMarketParameters.json @@ -0,0 +1,1141 @@ +[ + { + "baseAsset": "1INCH", + "referencePrice": 0.3398645158695157, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "1INCH", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "AAVE", + "referencePrice": 85.34916282287368, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "AAVE", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ADA", + "referencePrice": 0.5223295461752288, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Cardano", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "AGIX", + "referencePrice": 0.2445107154373193, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "SingularityNET", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ALGO", + "referencePrice": 0.1681287078892224, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Algorand", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "APE", + "referencePrice": 1.1944183891765008, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "ApeCoin", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "APT", + "referencePrice": 7.866427281197853, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Aptos", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ARB", + "referencePrice": 1.8941460935787378, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Arbitrum", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ATOM", + "referencePrice": 8.376447043890133, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Cosmos", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "AVAX", + "referencePrice": 35.51220693068919, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Avalanche", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "BCH", + "referencePrice": 242.55658383981574, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Bitcoin Cash", + "p": 2.0, + "atomicResolution": -8.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -7.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "BLUR", + "referencePrice": 0.6174156210414935, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Blur", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "BNB", + "referencePrice": 261.9562938974594, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Binance Coin", + "p": 2.0, + "atomicResolution": -8.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -7.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "BONK", + "referencePrice": 1.0481380626265717e-5, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Bonk Token", + "p": -5.0, + "atomicResolution": -1.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -14.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "BTC", + "referencePrice": 44848.16769478778, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Bitcoin", + "p": 4.0, + "atomicResolution": -10.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -5.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "CHZ", + "referencePrice": 0.10152209594142685, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Chiliz", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "CRV", + "referencePrice": 0.48346754113361784, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Curve DAO Token", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "DOGE", + "referencePrice": 0.08014457060243645, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Dogecoin", + "p": -2.0, + "atomicResolution": -4.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -11.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "DOT", + "referencePrice": 6.965370230174219, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Polkadot", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "DYM", + "referencePrice": 5.544949130771594, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Dymension", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ENS", + "referencePrice": 17.72913244361432, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Ethereum Name Service", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "EOS", + "referencePrice": 0.6306070212782233, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Eos", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ETC", + "referencePrice": 25.31458356285971, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Ethereum Classic", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ETH", + "referencePrice": 2431.2439928708804, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Ethereum", + "p": 3.0, + "atomicResolution": -9.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -6.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "FET", + "referencePrice": 0.5560893147613742, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Fetch.ai", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "FIL", + "referencePrice": 5.199120507932321, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Filecoin", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "FTM", + "referencePrice": 0.3711457058956354, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Fantom", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "GALA", + "referencePrice": 0.01898331222229838, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Gala", + "p": -2.0, + "atomicResolution": -4.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -11.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "GMT", + "referencePrice": 0.20404992804891367, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "GMT", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "GRT", + "referencePrice": 0.13921183278937196, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "The Graph", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "HBAR", + "referencePrice": 0.07686278766140874, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Hedera", + "p": -2.0, + "atomicResolution": -4.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -11.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ICP", + "referencePrice": 12.381985084851047, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Internet Computer", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "IMX", + "referencePrice": 2.3007875054054425, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Immutable X", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "INJ", + "referencePrice": 33.427379051845875, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Injective", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "JTO", + "referencePrice": 1.8587604617237268, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Jito", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "JUP", + "referencePrice": 0.4339790660244292, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Jupiter", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "KAVA", + "referencePrice": 0.6150293989811233, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Kava", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "LDO", + "referencePrice": 2.872990563900012, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Lido DAO", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "LINK", + "referencePrice": 18.695585099973265, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "ChainLink", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "LTC", + "referencePrice": 68.82098983684968, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Litecoin", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "MANA", + "referencePrice": 0.3835526503137334, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Decentraland", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "MASK", + "referencePrice": 3.0190606294111477, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Mask Network", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "MATIC", + "referencePrice": 0.8348216286259986, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Matic Network", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "MINA", + "referencePrice": 0.9996552741300538, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Mina", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "MKR", + "referencePrice": 1943.1865605831852, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Maker", + "p": 3.0, + "atomicResolution": -9.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -6.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "NEAR", + "referencePrice": 2.9412830334457607, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Near", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "OP", + "referencePrice": 2.959268526582415, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Optimism", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ORDI", + "referencePrice": 51.40287704643513, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Ordinals", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "PEPE", + "referencePrice": 9.65894964791238e-7, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Pepe", + "p": -7.0, + "atomicResolution": 1.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -16.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "PYTH", + "referencePrice": 0.4024907744770694, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Pyth Network", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "RNDR", + "referencePrice": 4.490794387737395, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Render Token", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "RUNE", + "referencePrice": 3.7264809096406806, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Thorchain", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "SAND", + "referencePrice": 0.37297439115035663, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "The Sandbox", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "SEI", + "referencePrice": 0.6414470586972892, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Sei", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "SHIB", + "referencePrice": 9.204638050039261e-6, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Shiba Inu", + "p": -6.0, + "atomicResolution": 0.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -15.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "SNX", + "referencePrice": 3.3742698571364094, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Synthetix Network Token", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "SOL", + "referencePrice": 102.57213563905393, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Solana", + "p": 2.0, + "atomicResolution": -8.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -7.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "STX", + "referencePrice": 1.5144048703611412, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Stacks", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "SUI", + "referencePrice": 1.5452561101842979, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "SuiNetwork", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "TIA", + "referencePrice": 19.71178951640871, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Celestia", + "p": 1.0, + "atomicResolution": -7.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -8.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "TRX", + "referencePrice": 0.10782035164658409, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "TRON", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "UNI", + "referencePrice": 6.374086551681073, + "numOracles": 7, + "liquidityTier": 2, + "assetName": "Uniswap", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "WLD", + "referencePrice": 1.9810696413118303, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "Worldcoin WLD", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "WOO", + "referencePrice": 0.2944897275608197, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "WOO Network", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "XLM", + "referencePrice": 0.1093759305057456, + "numOracles": 8, + "liquidityTier": 1, + "assetName": "Stellar", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "XRP", + "referencePrice": 0.5140463170757591, + "numOracles": 9, + "liquidityTier": 1, + "assetName": "Ripple", + "p": -1.0, + "atomicResolution": -5.0, + "minExchanges": 3, + "minPriceChangePpm": 2500, + "priceExponent": -10.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + }, + { + "baseAsset": "ZETA", + "referencePrice": 1.0427131536820096, + "numOracles": 6, + "liquidityTier": 2, + "assetName": "ZetaChain", + "p": 0.0, + "atomicResolution": -6.0, + "minExchanges": 3, + "minPriceChangePpm": 4000, + "priceExponent": -9.0, + "stepBaseQuantum": 1000000, + "ticksizeExponent": -3, + "subticksPerTick": 1000000, + "minOrderSize": 1000000, + "quantumConversionExponent": -9 + } +] diff --git a/public/configs/potentialMarketExchangeConfig.csv b/public/configs/potentialMarketExchangeConfig.csv deleted file mode 100644 index ddb12d2..0000000 --- a/public/configs/potentialMarketExchangeConfig.csv +++ /dev/null @@ -1,704 +0,0 @@ -base_asset,exchange,pair,min_2_depth,avg_30d_vol,reference_price,risk_assessment,num_oracles,liquidity_tier,asset_name,adjust_by_market -AAVE,Mexc,AAVE_USDT,403707.603,299498.6587,88.46188619,A,7,2,AAVE,USDT-USD -AAVE,Huobi,aaveusdt,49562.27661,34092101.66,88.52768881,A,7,2,AAVE,USDT-USD -AAVE,Kraken,AAVEUSD,84969.1289,732237.4435,88.21901516,A,7,2,AAVE, -AAVE,Okx,AAVE-USDT,120824.3981,5483819.403,88.48717486,A,7,2,AAVE,USDT-USD -AAVE,Kucoin,AAVE-USDT,60134.45372,1454001.73,88.41847956,A,7,2,AAVE,USDT-USD -AAVE,Binance,AAVEUSDT,336646.7802,17941167.87,88.40806057,A,7,2,AAVE,USDT-USD -AAVE,CoinbasePro,AAVE-USD,162207.2275,7955414.095,88.41304215,A,7,2,AAVE, -ADA,Okx,ADA-USDT,303911.146,12693505.79,0.4718322348,A,9,1,Cardano,USDT-USD -ADA,CoinbasePro,ADA-USD,611511.2428,18323224.07,0.4703816721,A,9,1,Cardano, -ADA,Huobi,adausdt,149750.1588,18688486.68,0.470293013,A,9,1,Cardano,USDT-USD -ADA,Kucoin,ADA-USDT,204346.5493,11339662.31,0.470650622,A,9,1,Cardano,USDT-USD -ADA,Bitstamp,ADA/USD,111141.4265,495063.9401,0.4732612949,A,9,1,Cardano, -ADA,Mexc,ADA_USDT,1480561.883,34705754.08,0.4706681442,A,9,1,Cardano,USDT-USD -ADA,Bybit,ADAUSDT,261755.7266,15267158.53,0.4715127504,A,9,1,Cardano,USDT-USD -ADA,Kraken,ADAUSD,631495.1952,4783679.81,0.4728831552,A,9,1,Cardano, -ADA,Binance,ADAUSDT,1014519.017,74913609.68,0.4709109462,A,9,1,Cardano,USDT-USD -AGIX,Okx,AGIX-USDT,144402.4677,1230616.692,0.2534299858,A,6,2,SingularityNET,USDT-USD -AGIX,Bybit,AGIXUSDT,72731.67454,2177116.497,0.2534800192,A,6,2,SingularityNET,USDT-USD -AGIX,Kucoin,AGIX-USDT,86823.62761,4637581.791,0.2531545743,A,6,2,SingularityNET,USDT-USD -AGIX,Mexc,AGIX_USDT,114261.8075,179945.4082,0.2532243225,A,6,2,SingularityNET,USDT-USD -AGIX,Binance,AGIXUSDT,181499.5614,6601700.149,0.2535772917,A,6,2,SingularityNET,USDT-USD -AGIX,Gate,AGIX_USDT,50000,100000,0,A,6,2,SingularityNET,USDT-USD -ALGO,Kucoin,ALGO-USDT,125172.0507,2774508.432,0.1612760665,A,6,2,Algorand,USDT-USD -ALGO,Mexc,ALGO_USDT,471722.5569,391031.4403,0.1615972948,A,6,2,Algorand,USDT-USD -ALGO,Okx,ALGO-USDT,84724.99655,3001155.055,0.1614784231,A,6,2,Algorand,USDT-USD -ALGO,CoinbasePro,ALGO-USD,137293.3037,3626194.058,0.1612613776,A,6,2,Algorand, -ALGO,Kraken,ALGOUSD,94239.46899,856438.0736,0.1611316036,A,6,2,Algorand, -ALGO,Binance,ALGOUSDT,240363.9844,10216526.81,0.1613137606,A,6,2,Algorand,USDT-USD -APE,Mexc,APE_USDT,845830.979,329116.5427,1.31149687,A,7,2,ApeCoin,USDT-USD -APE,Kucoin,APE-USDT,74830.83223,1527594.928,1.306893397,A,7,2,ApeCoin,USDT-USD -APE,CoinbasePro,APE-USD,79825.96928,1765569.337,1.310147807,A,7,2,ApeCoin, -APE,Okx,APE-USDT,127038.7774,4931009.134,1.310171735,A,7,2,ApeCoin,USDT-USD -APE,Binance,APEUSDT,295540.0092,16809984.56,1.309457667,A,7,2,ApeCoin,USDT-USD -APE,Kraken,APEUSD,47261.34196,350969.3303,1.302436726,A,7,2,ApeCoin, -APE,Gate,APE_USDT,50000,100000,0,A,7,2,ApeCoin,USDT-USD -APT,Binance,APTUSDT,970622.772,42662112,8.365109058,A,8,2,Aptos,USDT-USD -APT,Kraken,APTUSD,95252.8507,687239.9038,8.373953519,A,8,2,Aptos, -APT,Bybit,APTUSDT,421662.7604,13658424.61,8.360517459,A,8,2,Aptos,USDT-USD -APT,Kucoin,APT-USDT,59781.95498,3012611.094,8.371347497,A,8,2,Aptos,USDT-USD -APT,Mexc,APT_USDT,188448.7027,6995386.772,8.37360865,A,8,2,Aptos,USDT-USD -APT,CoinbasePro,APT-USD,158248.5255,5176336.024,8.369192123,A,8,2,Aptos, -APT,Okx,APT-USDT,596052.5515,20209030.67,8.37385096,A,8,2,Aptos,USDT-USD -APT,Gate,APT_USDT,50000,100000,0,A,8,2,Aptos,USDT-USD -ARB,Kraken,ARBUSD,100206.2199,4381943.143,1.705803002,A,8,1,Arbitrum, -ARB,Mexc,ARB_USDT,563395.9496,70966050.57,1.700151185,A,8,1,Arbitrum,USDT-USD -ARB,CoinbasePro,ARB-USD,323984.7248,25023919.67,1.706804349,A,8,1,Arbitrum, -ARB,Binance,ARBUSDT,1448064.308,225490594,1.700534337,A,8,1,Arbitrum,USDT-USD -ARB,Bybit,ARBUSDT,188544.697,49644508.17,1.697965318,A,8,1,Arbitrum,USDT-USD -ARB,Okx,ARB-USDT,619050.2317,56911723.48,1.700105696,A,8,1,Arbitrum,USDT-USD -ARB,Kucoin,ARB-USDT,244278.1403,15751598.26,1.705204466,A,8,1,Arbitrum,USDT-USD -ARB,Huobi,arbusdt,111073.3497,24106121.68,1.696818375,A,8,1,Arbitrum,USDT-USD -ATOM,Kucoin,ATOM-USDT,122511.6105,4164205.618,9.196821466,A,8,2,Cosmos,USDT-USD -ATOM,CoinbasePro,ATOM-USD,205758.8309,4244575.601,9.188194158,A,8,2,Cosmos, -ATOM,Binance,ATOMUSDT,500205.8745,32707609.21,9.19886839,A,8,2,Cosmos,USDT-USD -ATOM,Kraken,ATOMUSD,228688.3729,1024035.956,9.218557996,A,8,2,Cosmos, -ATOM,Okx,ATOM-USDT,147209.9881,6727992.679,9.196235185,A,8,2,Cosmos,USDT-USD -ATOM,Mexc,ATOM_USDT,396797.5433,1008586.239,9.21317801,A,8,2,Cosmos,USDT-USD -ATOM,Bybit,ATOMUSDT,100035.0706,5523700.635,9.191262868,A,8,2,Cosmos,USDT-USD -ATOM,Gate,ATOM_USDT,50000,100000,0,A,8,2,Cosmos,USDT-USD -AVAX,Okx,AVAX-USDT,459223.0249,27191336.53,30.3671387,A,9,1,Avalanche,USDT-USD -AVAX,Mexc,AVAX_USDT,2630410.171,40197237.8,30.31335915,A,9,1,Avalanche,USDT-USD -AVAX,CoinbasePro,AVAX-USD,710189.1641,41234008.85,30.43579342,A,9,1,Avalanche, -AVAX,Kraken,AVAXUSD,455749.7351,5083869.862,30.36461631,A,9,1,Avalanche, -AVAX,Huobi,avaxusdt,83674.34414,20197355.5,30.38713582,A,9,1,Avalanche,USDT-USD -AVAX,Bitstamp,AVAX/USD,78931.59345,492591.779,30.51926775,A,9,1,Avalanche, -AVAX,Binance,AVAXUSDT,1424442.662,110228072.3,30.31927119,A,9,1,Avalanche,USDT-USD -AVAX,Bybit,AVAXUSDT,266594.6447,19032772.46,30.37667694,A,9,1,Avalanche,USDT-USD -AVAX,Kucoin,AVAX-USDT,256007.3589,13423273.72,30.36129437,A,9,1,Avalanche,USDT-USD -BCH,Kraken,BCHUSD,203340.9953,1163173.528,236.4383838,A,9,1,Bitcoin Cash, -BCH,Bitstamp,BCH/USD,133890.8622,1113055.48,236.3834073,A,9,1,Bitcoin Cash, -BCH,Kucoin,BCH-USDT,153403.2244,1766025.88,236.2130317,A,9,1,Bitcoin Cash,USDT-USD -BCH,Mexc,BCH_USDT,1688109.018,340077.5421,236.974317,A,9,1,Bitcoin Cash,USDT-USD -BCH,Binance,BCHUSDT,672821.7917,32395763.97,236.0220829,A,9,1,Bitcoin Cash,USDT-USD -BCH,Bybit,BCHUSDT,156013.3525,7323063.446,236.304741,A,9,1,Bitcoin Cash,USDT-USD -BCH,Huobi,bchusdt,65221.14333,14976246.74,236.1401006,A,9,1,Bitcoin Cash,USDT-USD -BCH,Okx,BCH-USDT,351452.4549,15579827.1,236.1496084,A,9,1,Bitcoin Cash,USDT-USD -BCH,CoinbasePro,BCH-USD,448678.0454,10694749.58,236.3332929,A,9,1,Bitcoin Cash, -BLUR,Kraken,BLURUSD,99075.46212,1216513.285,0.6025188372,A,7,2,Blur, -BLUR,Bybit,BLURUSDT,68313.916,6461469.994,0.60531087,A,7,2,Blur,USDT-USD -BLUR,Binance,BLURUSDT,523824.0691,49785352.29,0.6085401119,A,7,2,Blur,USDT-USD -BLUR,Kucoin,BLUR-USDT,114279.3879,3580944.358,0.6060076016,A,7,2,Blur,USDT-USD -BLUR,Okx,BLUR-USDT,242440.7708,21042871.79,0.6072397492,A,7,2,Blur,USDT-USD -BLUR,CoinbasePro,BLUR-USD,156092.3813,8736803.112,0.6038877368,A,7,2,Blur, -BLUR,Mexc,BLUR_USDT,845700.0176,614271.1779,0.6015683969,A,7,2,Blur,USDT-USD -BNB,Okx,BNB-USDT,171035.3871,10049830.17,291.7391615,A,6,2,Binance Coin,USDT-USD -BNB,Kucoin,BNB-USDT,172933.5367,7563235.244,291.8671543,A,6,2,Binance Coin,USDT-USD -BNB,Mexc,BNB_USDT,2668302.204,2095942.424,291.3317029,A,6,2,Binance Coin,USDT-USD -BNB,Binance,BNBUSDT,2315487.589,299938471.1,292.0261567,A,6,2,Binance Coin,USDT-USD -BNB,Bybit,BNBUSDT,73840.12419,11584488.51,291.812684,A,6,2,Binance Coin,USDT-USD -BNB,Gate,BNB_USDT,50000,100000,0,A,6,2,Binance Coin,USDT-USD -BONK,Bybit,BONKUSDT,91223.30674,10108782.84,1.09E-05,A,6,2,Bonk Token,USDT-USD -BONK,Mexc,BONK_USDT,880507.727,1996432.036,1.10E-05,A,6,2,Bonk Token,USDT-USD -BONK,Binance,BONKUSDT,496236.8093,63520367.26,1.09E-05,A,6,2,Bonk Token,USDT-USD -BONK,Okx,BONK-USDT,84194.41757,4939704.699,1.09E-05,A,6,2,Bonk Token,USDT-USD -BONK,CoinbasePro,BONK-USD,291120.8766,24041618.38,1.10E-05,A,6,2,Bonk Token, -BONK,Kucoin,BONK-USDT,104413.0879,5795566.827,1.09E-05,A,6,2,Bonk Token,USDT-USD -BTC,Kucoin,BTC-USDT,1385049.373,192647255.8,39920.8141,A,9,1,Bitcoin,USDT-USD -BTC,Mexc,BTC_USDT,6055794.786,468890338.6,39929.87241,A,9,1,Bitcoin,USDT-USD -BTC,Bybit,BTCUSDT,1934000.115,501075059.1,39905.40634,A,9,1,Bitcoin,USDT-USD -BTC,Okx,BTC-USDT,3216401.515,736570802.6,39910.57726,A,9,1,Bitcoin,USDT-USD -BTC,Bitstamp,BTC/USD,4904357.079,103847807.2,39898.51266,A,9,1,Bitcoin, -BTC,Huobi,btcusdt,1628523.051,85957777.78,39927.11023,A,9,1,Bitcoin,USDT-USD -BTC,CoinbasePro,BTC-USD,11838510.17,799998360.6,39872.42919,A,9,1,Bitcoin, -BTC,Kraken,BTCUSD,11254244.98,152725974.7,39905.34906,A,9,1,Bitcoin, -BTC,Binance,BTCUSDT,13081922.22,1943592587,39912.24136,A,9,1,Bitcoin,USDT-USD -CHZ,Okx,CHZ-USDT,76721.70261,9853334.361,0.1037356507,A,6,2,Chiliz,USDT-USD -CHZ,Mexc,CHZ_USDT,230477.9128,285408.6504,0.1038430482,A,6,2,Chiliz,USDT-USD -CHZ,CoinbasePro,CHZ-USD,51276.07653,1252645.033,0.1054762023,A,6,2,Chiliz, -CHZ,Kraken,CHZUSD,48524.85664,395637.5252,0.1050375877,A,6,2,Chiliz, -CHZ,Binance,CHZUSDT,249888.0127,28501304.85,0.1046721926,A,6,2,Chiliz,USDT-USD -CHZ,Gate,CHZ_USDT,50000,100000,0,A,6,2,Chiliz,USDT-USD -CRV,Kraken,CRVUSD,60416.85503,292275.2165,0.4482389055,A,6,2,Curve DAO Token, -CRV,Kucoin,CRV-USDT,50096.30378,680353.338,0.4434254994,A,6,2,Curve DAO Token,USDT-USD -CRV,Binance,CRVUSDT,265385.0097,9688519.274,0.443424373,A,6,2,Curve DAO Token,USDT-USD -CRV,CoinbasePro,CRV-USD,96582.28361,871025.6346,0.4446821049,A,6,2,Curve DAO Token, -CRV,Mexc,CRV_USDT,202941.3475,133320.8099,0.4438313683,A,6,2,Curve DAO Token,USDT-USD -CRV,Okx,CRV-USDT,109901.21,6873330.009,0.4425725114,A,6,2,Curve DAO Token,USDT-USD -DOGE,CoinbasePro,DOGE-USD,705184.7562,25424875.32,0.07793120656,A,9,1,Dogecoin, -DOGE,Okx,DOGE-USDT,565834.5118,33076839.3,0.07788150395,A,9,1,Dogecoin,USDT-USD -DOGE,Mexc,DOGE_USDT,1091538.578,22937578.29,0.0779243829,A,9,1,Dogecoin,USDT-USD -DOGE,Kraken,DOGEUSD,547998.0729,4621710.265,0.07778464129,A,9,1,Dogecoin, -DOGE,Bybit,DOGEUSDT,290256.381,15914185,0.07796760983,A,9,1,Dogecoin,USDT-USD -DOGE,Bitstamp,DOGE/USD,46447.64873,189541.7938,0.07799339803,A,9,1,Dogecoin, -DOGE,Binance,DOGEUSDT,1252926.134,84403824.56,0.07796643769,A,9,1,Dogecoin,USDT-USD -DOGE,Huobi,dogeusdt,269955.645,21525311.57,0.07794967908,A,9,1,Dogecoin,USDT-USD -DOGE,Kucoin,DOGE-USDT,365702.9014,7810505.65,0.07798714967,A,9,1,Dogecoin,USDT-USD -DOT,Kraken,DOTUSD,368701.8747,4429592.47,6.452188898,A,8,1,Polkadot, -DOT,Okx,DOT-USDT,222355.039,10742911.87,6.458175307,A,8,1,Polkadot,USDT-USD -DOT,Huobi,dotusdt,45783.29935,10974447.87,6.450317276,A,8,1,Polkadot,USDT-USD -DOT,Mexc,DOT_USDT,1098245.94,1339831.03,6.446585762,A,8,1,Polkadot,USDT-USD -DOT,Bybit,DOTUSDT,166496.7868,9913978.391,6.454271244,A,8,1,Polkadot,USDT-USD -DOT,CoinbasePro,DOT-USD,168119.2694,9778920.932,6.452749635,A,8,1,Polkadot, -DOT,Kucoin,DOT-USDT,124303.7984,5544103.268,6.453780538,A,8,1,Polkadot,USDT-USD -DOT,Binance,DOTUSDT,593806.1697,48873686.06,6.451243808,A,8,1,Polkadot,USDT-USD -ENS,Mexc,ENS_USDT,367658.849,670539.5241,17.98863652,A,6,2,Ethereum Name Service (ENS),USDT-USD -ENS,Kucoin,ENS-USDT,54724.81451,3676707.428,17.75880758,A,6,2,Ethereum Name Service (ENS),USDT-USD -ENS,Binance,ENSUSDT,291418.3232,62479176.65,17.81688813,A,6,2,Ethereum Name Service (ENS),USDT-USD -ENS,CoinbasePro,ENS-USD,91775.13594,7641723.902,17.79343763,A,6,2,Ethereum Name Service (ENS), -ENS,Okx,ENS-USDT,137796.003,17044833.9,17.78364476,A,6,2,Ethereum Name Service (ENS),USDT-USD -ENS,Gate,ENS_USDT,50000,100000,0,A,6,2,Ethereum Name Service (ENS),USDT-USD -EOS,Binance,EOSUSDT,372008.7468,8074383.692,0.6830128043,A,8,2,Eos,USDT-USD -EOS,Mexc,EOS_USDT,1199704.281,272102.5368,0.6840073934,A,8,2,Eos,USDT-USD -EOS,Kucoin,EOS-USDT,75854.21225,709014.6871,0.68384828,A,8,2,Eos,USDT-USD -EOS,CoinbasePro,EOS-USD,77320.52881,1313993.017,0.6822937779,A,8,2,Eos, -EOS,Kraken,EOSUSD,88673.50535,723904.186,0.6839062109,A,8,2,Eos, -EOS,Okx,EOS-USDT,139325.4759,9112853.76,0.6825281331,A,8,2,Eos,USDT-USD -EOS,Bybit,EOSUSDT,50578.19146,5841158.864,0.6822045569,A,8,2,Eos,USDT-USD -EOS,Gate,EOS_USDT,50000,100000,0,A,8,2,Eos,USDT-USD -ETC,Kucoin,ETC-USDT,113759.0808,3477554.997,22.85192736,A,8,1,Ethereum Classic,USDT-USD -ETC,Binance,ETCUSDT,655668.4981,60729272.86,22.86694828,A,8,1,Ethereum Classic,USDT-USD -ETC,Bybit,ETCUSDT,49561.58743,2838378.919,22.8367253,A,8,1,Ethereum Classic,USDT-USD -ETC,Kraken,ETCUSD,155878.8877,734888.778,22.88123977,A,8,1,Ethereum Classic, -ETC,CoinbasePro,ETC-USD,584427.6111,7597750.664,22.83725611,A,8,1,Ethereum Classic, -ETC,Huobi,etcusdt,81646.91108,13533193.91,22.77483439,A,8,1,Ethereum Classic,USDT-USD -ETC,Okx,ETC-USDT,338589.5466,23459446.52,22.81594291,A,8,1,Ethereum Classic,USDT-USD -ETC,Mexc,ETC_USDT,1378585.921,911135.813,22.92403344,A,8,1,Ethereum Classic,USDT-USD -ETH,Bitstamp,ETH/USD,1786424.201,19272496.97,2212.492226,A,9,1,Ethereum, -ETH,Okx,ETH-USDT,2444418.764,388934350.5,2210.16441,A,9,1,Ethereum,USDT-USD -ETH,Huobi,ethusdt,1695970.121,34272154.83,2212.288729,A,9,1,Ethereum,USDT-USD -ETH,Kucoin,ETH-USDT,1037412.076,119386693.6,2211.480181,A,9,1,Ethereum,USDT-USD -ETH,Bybit,ETHUSDT,1345249.473,304189767.2,2211.399676,A,9,1,Ethereum,USDT-USD -ETH,Kraken,ETHUSD,5075383.05,56853252.58,2212.377288,A,9,1,Ethereum, -ETH,Mexc,ETH_USDT,4484321.007,210359167.7,2214.032265,A,9,1,Ethereum,USDT-USD -ETH,CoinbasePro,ETH-USD,7298871.343,296252747.3,2210.07616,A,9,1,Ethereum, -ETH,Binance,ETHUSDT,10324165.63,1060630897,2211.179573,A,9,1,Ethereum,USDT-USD -FET,Mexc,FET_USDT,494656.0995,559935.8786,0.5882081836,A,6,2,Fetch AI,USDT-USD -FET,Binance,FETUSDT,465708.0914,22769357.29,0.5862566061,A,6,2,Fetch AI,USDT-USD -FET,Kucoin,FET-USDT,96173.26242,4354855.944,0.5872583338,A,6,2,Fetch AI,USDT-USD -FET,Okx,FET-USDT,80416.82548,1578553.143,0.587271404,A,6,2,Fetch AI,USDT-USD -FET,Kraken,FETUSD,80688.82031,1386327.677,0.5848580771,A,6,2,Fetch AI, -FET,CoinbasePro,FET-USD,241779.2529,9092328.77,0.5848723328,A,6,2,Fetch AI, -FIL,Kucoin,FIL-USDT,136368.2949,7410428.74,4.93172295,A,8,1,Filecoin,USDT-USD -FIL,Kraken,FILUSD,133991.2228,1832800.962,4.933693054,A,8,1,Filecoin, -FIL,CoinbasePro,FIL-USD,258870.6985,11530932.48,4.934286612,A,8,1,Filecoin, -FIL,Bybit,FILUSDT,86576.25386,7525363.033,4.91922609,A,8,1,Filecoin,USDT-USD -FIL,Mexc,FIL_USDT,1094874.372,1819214.992,4.927851525,A,8,1,Filecoin,USDT-USD -FIL,Okx,FIL-USDT,646778.4394,55504900,4.9289709,A,8,1,Filecoin,USDT-USD -FIL,Binance,FILUSDT,844740.0409,75887089.73,4.930605871,A,8,1,Filecoin,USDT-USD -FIL,Huobi,filusdt,68173.55527,16793194.38,4.936018668,A,8,1,Filecoin,USDT-USD -FTM,Bybit,FTMUSDT,71346.61591,4128311.729,0.3352808917,A,6,2,Fantom,USDT-USD -FTM,Kraken,FTMUSD,87646.51897,1176507.833,0.3346537706,A,6,2,Fantom, -FTM,Kucoin,FTM-USDT,106225.8231,4400742.84,0.3358058793,A,6,2,Fantom,USDT-USD -FTM,Mexc,FTM_USDT,632339.7399,1081199.831,0.3365010633,A,6,2,Fantom,USDT-USD -FTM,Binance,FTMUSDT,424997.2126,25764943.66,0.3360637395,A,6,2,Fantom,USDT-USD -FTM,Okx,FTM-USDT,98090.82999,4900885.095,0.3376845609,A,6,2,Fantom,USDT-USD -GALA,Okx,GALA-USDT,189873.4137,6654005.649,0.02204820477,A,6,2,Gala,USDT-USD -GALA,Mexc,GALA_USDT,674173.1073,662194.7213,0.02211283071,A,6,2,Gala,USDT-USD -GALA,Bybit,GALAUSDT,81233.95423,2802651.478,0.02204724605,A,6,2,Gala,USDT-USD -GALA,Kraken,GALAUSD,81853.15768,971887.7737,0.02213452999,A,6,2,Gala, -GALA,Binance,GALAUSDT,415969.0247,23466983.63,0.02205812128,A,6,2,Gala,USDT-USD -GALA,Gate,GALA_USDT,50000,100000,0,A,6,2,Gala,USDT-USD -GRT,CoinbasePro,GRT-USD,212787.1065,5275612.932,0.1493811838,A,7,2,The Graph, -GRT,Okx,GRT-USDT,65342.41311,2506599.164,0.1492456221,A,7,2,The Graph,USDT-USD -GRT,Mexc,GRT_USDT,598125.0805,479952.4649,0.1491757716,A,7,2,The Graph,USDT-USD -GRT,Kraken,GRTUSD,75871.99326,633740.4267,0.1498390276,A,7,2,The Graph, -GRT,Binance,GRTUSDT,326438.7018,17403725.33,0.1491240716,A,7,2,The Graph,USDT-USD -GRT,Kucoin,GRT-USDT,81544.85738,1753762.597,0.1493661616,A,7,2,The Graph,USDT-USD -GRT,Gate,GRT_USDT,50000,100000,0,A,7,2,The Graph,USDT-USD -HBAR,Kucoin,HBAR-USDT,114290.7661,2775278.488,0.07132025496,A,7,2,Hedera Hashgraph,USDT-USD -HBAR,Mexc,HBAR_USDT,460300.1662,483877.2872,0.07108943658,A,7,2,Hedera Hashgraph,USDT-USD -HBAR,CoinbasePro,HBAR-USD,214294.0589,7087561.93,0.07116005717,A,7,2,Hedera Hashgraph, -HBAR,Okx,HBAR-USDT,112689.0708,4026461.082,0.07125365623,A,7,2,Hedera Hashgraph,USDT-USD -HBAR,Huobi,hbarusdt,46422.78344,12502601.52,0.07144363395,A,7,2,Hedera Hashgraph,USDT-USD -HBAR,Binance,HBARUSDT,342801.5964,14209768.84,0.07132722883,A,7,2,Hedera Hashgraph,USDT-USD -HBAR,Bybit,HBARUSDT,45261.49627,1258321.041,0.07136344216,A,7,2,Hedera Hashgraph,USDT-USD -ICP,Binance,ICPUSDT,501774.1138,77170682.6,11.52804787,A,7,2,Internet Computer,USDT-USD -ICP,Okx,ICP-USDT,297422.7336,20593859.34,11.59386803,A,7,2,Internet Computer,USDT-USD -ICP,Mexc,ICP_USDT,229038.0671,2659248.459,11.29959518,A,7,2,Internet Computer,USDT-USD -ICP,Bybit,ICPUSDT,145658.1104,13815502.64,11.47155514,A,7,2,Internet Computer,USDT-USD -ICP,CoinbasePro,ICP-USD,481694.0934,22919263.78,11.51929241,A,7,2,Internet Computer, -ICP,Kucoin,ICP-USDT,243799.5596,21281791.71,11.4267898,A,7,2,Internet Computer,USDT-USD -ICP,Kraken,ICPUSD,152510.8207,4230646.898,11.48180455,A,7,2,Internet Computer, -INJ,Binance,INJUSDT,761854.6344,75471268.13,31.75641906,A,7,2,Injective Protocol,USDT-USD -INJ,Bybit,INJUSDT,46259.03266,8671297.48,31.81868206,A,7,2,Injective Protocol,USDT-USD -INJ,Mexc,INJ_USDT,195130.7785,2547540.558,31.75180875,A,7,2,Injective Protocol,USDT-USD -INJ,Kraken,INJUSD,110554.9597,4615214.653,31.81822066,A,7,2,Injective Protocol, -INJ,CoinbasePro,INJ-USD,263574.9589,21960083.14,31.75834432,A,7,2,Injective Protocol, -INJ,Kucoin,INJ-USDT,112763.3848,13043315.83,31.73964964,A,7,2,Injective Protocol,USDT-USD -INJ,Okx,INJ-USDT,156547.4276,6879780.129,31.838232,A,7,2,Injective Protocol,USDT-USD -JTO,CoinbasePro,JTO-USD,209989.3821,10018464.73,1.887681028,A,6,2,Jito, -JTO,Binance,JTOUSDT,350644.6827,47762160.17,1.883291251,A,6,2,Jito,USDT-USD -JTO,Bybit,JTOUSDT,74864.14695,4967573.71,1.886557933,A,6,2,Jito,USDT-USD -JTO,Mexc,JTO_USDT,138559.5351,998743.8255,1.88425904,A,6,2,Jito,USDT-USD -JTO,Okx,JTO-USDT,96745.66258,8928569.193,1.884792183,A,6,2,Jito,USDT-USD -JTO,Kucoin,JTO-USDT,87953.5565,3015273.183,1.890669659,A,6,2,Jito,USDT-USD -KAVA,CoinbasePro,KAVA-USD,176534.8573,385485.2501,0.6919030037,A,6,2,Kava, -KAVA,Mexc,KAVA_USDT,1176186.319,270495.2643,0.6895330959,A,6,2,Kava,USDT-USD -KAVA,Kucoin,KAVA-USDT,89752.19321,596070.2703,0.6890117656,A,6,2,Kava,USDT-USD -KAVA,Binance,KAVAUSDT,646090.2324,11218433.99,0.6895853325,A,6,2,Kava,USDT-USD -KAVA,Kraken,KAVAUSD,85320.83296,641014.1765,0.6908946014,A,6,2,Kava, -KAVA,Gate,KAVA_USDT,50000,100000,0,A,6,2,Kava,USDT-USD -LDO,Okx,LDO-USDT,181894.181,10111578.42,2.88714217,A,8,2,Lido DAO,USDT-USD -LDO,Binance,LDOUSDT,387738.82,41043700.87,2.883611792,A,8,2,Lido DAO,USDT-USD -LDO,CoinbasePro,LDO-USD,220300.8676,11976409.69,2.884625596,A,8,2,Lido DAO, -LDO,Kraken,LDOUSD,100447.1249,2150960.494,2.887488478,A,8,2,Lido DAO, -LDO,Mexc,LDO_USDT,588930.053,638809.6967,2.882180527,A,8,2,Lido DAO,USDT-USD -LDO,Kucoin,LDO-USDT,91009.30345,4468563.248,2.885880042,A,8,2,Lido DAO,USDT-USD -LDO,Bybit,LDOUSDT,71154.49236,6463827.135,2.885385432,A,8,2,Lido DAO,USDT-USD -LDO,Gate,LDO_USDT,50000,100000,0,A,8,2,Lido DAO,USDT-USD -LINK,Kraken,LINKUSD,552242.3853,5755261.063,13.82357462,A,8,1,ChainLink, -LINK,CoinbasePro,LINK-USD,680356.4439,32122820.26,13.80640803,A,8,1,ChainLink, -LINK,Mexc,LINK_USDT,1218298.471,49003625.57,13.80057366,A,8,1,ChainLink,USDT-USD -LINK,Binance,LINKUSDT,1057623.562,91375865.04,13.7948244,A,8,1,ChainLink,USDT-USD -LINK,Okx,LINK-USDT,275176.1551,13565986.64,13.79776617,A,8,1,ChainLink,USDT-USD -LINK,Bitstamp,LINK/USD,151182.7984,1359533.87,13.84044633,A,8,1,ChainLink, -LINK,Kucoin,LINK-USDT,196203.2947,9579617.943,13.81059009,A,8,1,ChainLink,USDT-USD -LINK,Bybit,LINKUSDT,180315.7755,14220162.33,13.85826731,A,8,1,ChainLink,USDT-USD -LTC,CoinbasePro,LTC-USD,543451.3689,13785634.51,65.4631381,A,9,1,Litecoin, -LTC,Mexc,LTC_USDT,1879096.824,17331806.29,65.43634611,A,9,1,Litecoin,USDT-USD -LTC,Okx,LTC-USDT,507929.3471,26530065.91,65.41225491,A,9,1,Litecoin,USDT-USD -LTC,Kucoin,LTC-USDT,290350.1634,6126387.388,65.4318351,A,9,1,Litecoin,USDT-USD -LTC,Bybit,LTCUSDT,201299.6733,12383937.05,65.45086009,A,9,1,Litecoin,USDT-USD -LTC,Bitstamp,LTC/USD,71302.43935,837193.57,65.38819428,A,9,1,Litecoin, -LTC,Huobi,ltcusdt,150004.7632,4614143.66,65.4369822,A,9,1,Litecoin,USDT-USD -LTC,Kraken,LTCUSD,485564.9077,2601077.121,65.43280684,A,9,1,Litecoin, -LTC,Binance,LTCUSDT,975861.6282,46447198.76,65.43597402,A,9,1,Litecoin,USDT-USD -MANA,Binance,MANAUSDT,161539.8083,8060438.22,0.4335988613,A,7,2,Decentraland,USDT-USD -MANA,Kucoin,MANA-USDT,58087.72222,503402.4757,0.4338408816,A,7,2,Decentraland,USDT-USD -MANA,Kraken,MANAUSD,84924.79935,272373.0049,0.432452467,A,7,2,Decentraland, -MANA,Mexc,MANA_USDT,253761.7046,145519.6743,0.4345951497,A,7,2,Decentraland,USDT-USD -MANA,Okx,MANA-USDT,68844.47795,1431443.961,0.4338122156,A,7,2,Decentraland,USDT-USD -MANA,CoinbasePro,MANA-USD,69142.62162,865483.8728,0.4332575848,A,7,2,Decentraland, -MANA,Gate,MANA_USDT,50000,100000,0,A,7,2,Decentraland,USDT-USD -MASK,Binance,MASKUSDT,527334.4347,29606345.22,3.252034856,A,7,2,Mask Network,USDT-USD -MASK,Okx,MASK-USDT,164626.3439,17425407.01,3.247435343,A,7,2,Mask Network,USDT-USD -MASK,Kucoin,MASK-USDT,68471.50785,2787550.55,3.250394924,A,7,2,Mask Network,USDT-USD -MASK,Mexc,MASK_USDT,551854.5319,340523.7233,3.255251096,A,7,2,Mask Network,USDT-USD -MASK,CoinbasePro,MASK-USD,76371.2574,1172479.2,3.257449365,A,7,2,Mask Network, -MASK,Bybit,MASKUSDT,55836.09372,3549089.841,3.251526238,A,7,2,Mask Network,USDT-USD -MASK,Gate,MASK_USDT,50000,100000,0,A,7,2,Mask Network,USDT-USD -MATIC,Okx,MATIC-USDT,286529.4599,19272111.96,0.7282054395,A,9,1,Matic Network,USDT-USD -MATIC,CoinbasePro,MATIC-USD,392683.598,14444572.98,0.7281953324,A,9,1,Matic Network, -MATIC,Binance,MATICUSDT,880166.8053,97986293.13,0.7281469424,A,9,1,Matic Network,USDT-USD -MATIC,Huobi,maticusdt,109573.122,15234696.66,0.7286294763,A,9,1,Matic Network,USDT-USD -MATIC,Bybit,MATICUSDT,253953.798,21099460.02,0.7281887236,A,9,1,Matic Network,USDT-USD -MATIC,Mexc,MATIC_USDT,985242.4337,45954909.9,0.7282376458,A,9,1,Matic Network,USDT-USD -MATIC,Kraken,MATICUSD,478478.4995,4510025.126,0.7294573007,A,9,1,Matic Network, -MATIC,Bitstamp,MATIC/USD,77920.84684,344911.6889,0.733080163,A,9,1,Matic Network, -MATIC,Kucoin,MATIC-USDT,356785.0871,8215026.183,0.7274795596,A,9,1,Matic Network,USDT-USD -MKR,CoinbasePro,MKR-USD,189657.3728,7901151.839,2113.462825,A,6,2,Maker, -MKR,Mexc,MKR_USDT,659686.2959,230714.6623,2119.293037,A,6,2,Maker,USDT-USD -MKR,Binance,MKRUSDT,368523.4153,23448263.7,2114.219678,A,6,2,Maker,USDT-USD -MKR,Kraken,MKRUSD,49658.74142,622993.922,2107.930364,A,6,2,Maker, -MKR,Okx,MKR-USDT,81342.70903,3487712.056,2111.932327,A,6,2,Maker,USDT-USD -MKR,Kucoin,MKR-USDT,45425.02507,675263.6294,2112.071675,A,6,2,Maker,USDT-USD -NEAR,Kucoin,NEAR-USDT,124294.3172,5843254.667,2.674161205,A,8,1,Near,USDT-USD -NEAR,Bybit,NEARUSDT,58206.62204,4630072.987,2.678918634,A,8,1,Near,USDT-USD -NEAR,CoinbasePro,NEAR-USD,185291.8636,5187550.998,2.67843549,A,8,1,Near, -NEAR,Kraken,NEARUSD,191549.9708,3360632.501,2.667463339,A,8,1,Near, -NEAR,Okx,NEAR-USDT,311377.3773,15382244.05,2.672818299,A,8,1,Near,USDT-USD -NEAR,Binance,NEARUSDT,578778.0911,61784058.07,2.676081404,A,8,1,Near,USDT-USD -NEAR,Mexc,NEAR_USDT,871096.6953,1184958.966,2.678323491,A,8,1,Near,USDT-USD -NEAR,Huobi,nearusdt,74787.28484,6999178.627,2.67181076,A,8,1,Near,USDT-USD -OP,Mexc,OP_USDT,1987545.663,1684136.999,2.871032553,A,7,2,Optimism,USDT-USD -OP,Okx,OP-USDT,456470.0968,40684606.93,2.865726402,A,7,2,Optimism,USDT-USD -OP,Bybit,OPUSDT,121956.4932,12754054.86,2.863599682,A,7,2,Optimism,USDT-USD -OP,Binance,OPUSDT,1189317.678,120606269.7,2.866861935,A,7,2,Optimism,USDT-USD -OP,Kucoin,OP-USDT,151102.3965,7514893.178,2.86647468,A,7,2,Optimism,USDT-USD -OP,CoinbasePro,OP-USD,351393.8984,22928210.76,2.864965623,A,7,2,Optimism, -OP,Gate,OP_USDT,50000,100000,0,A,7,2,Optimism,USDT-USD -ORDI,Kucoin,ORDI-USDT,110936.0169,7517594.63,51.5460857,A,6,2,Ordinals,USDT-USD -ORDI,Bybit,ORDIUSDT,119439.2682,9142897.563,51.46062583,A,6,2,Ordinals,USDT-USD -ORDI,Binance,ORDIUSDT,1816384.797,157536421.3,51.50890555,A,6,2,Ordinals,USDT-USD -ORDI,Okx,ORDI-USDT,897255.021,111729885.1,51.56285708,A,6,2,Ordinals,USDT-USD -ORDI,Huobi,ordiusdt,90017.00367,6939659.846,52.21823543,A,6,2,Ordinals,USDT-USD -ORDI,Gate,ORDI_USDT,50000,100000,0,A,6,2,Ordinals,USDT-USD -PEPE,Binance,PEPEUSDT,1854338.485,21983200.56,1.02E-06,A,6,2,Pepe,USDT-USD -PEPE,Kraken,PEPEUSD,66383.09612,339921.3126,1.02E-06,A,6,2,Pepe, -PEPE,Bybit,PEPEUSDT,70662.28564,5776041.599,1.02E-06,A,6,2,Pepe,USDT-USD -PEPE,Kucoin,PEPE-USDT,117845.5631,6320839.499,1.02E-06,A,6,2,Pepe,USDT-USD -PEPE,Mexc,PEPE_USDT,576088.0345,1051367.142,1.02E-06,A,6,2,Pepe,USDT-USD -PEPE,Okx,PEPE-USDT,253199.6634,10378463.48,1.02E-06,A,6,2,Pepe,USDT-USD -RNDR,Kucoin,RNDR-USDT,93245.66824,3389990.196,3.78277704,A,6,2,Render Token,USDT-USD -RNDR,Binance,RNDRUSDT,456778.1853,34499985.8,3.781059636,A,6,2,Render Token,USDT-USD -RNDR,CoinbasePro,RNDR-USD,180418.0343,11691967.24,3.767943401,A,6,2,Render Token, -RNDR,Kraken,RNDRUSD,62255.2913,1176061.236,3.788017753,A,6,2,Render Token, -RNDR,Mexc,RNDR_USDT,627963.3038,617023.2409,3.770998381,A,6,2,Render Token,USDT-USD -RNDR,Okx,RNDR-USDT,122198.2874,5319549.855,3.772653723,A,6,2,Render Token,USDT-USD -SAND,Okx,SAND-USDT,100469.8264,3508230.948,0.4373225476,A,7,2,SAND,USDT-USD -SAND,Kucoin,SAND-USDT,64668.48254,997968.9032,0.4371193254,A,7,2,SAND,USDT-USD -SAND,Kraken,SANDUSD,47650.66542,278973.929,0.4395664881,A,7,2,SAND, -SAND,CoinbasePro,SAND-USD,54744.16281,731889.0885,0.437434037,A,7,2,SAND, -SAND,Binance,SANDUSDT,263841.1812,14105685.55,0.4370122624,A,7,2,SAND,USDT-USD -SAND,Mexc,SAND_USDT,380990.8836,209883.4311,0.437304002,A,7,2,SAND,USDT-USD -SAND,Gate,SAND_USDT,50000,100000,0,A,7,2,SAND,USDT-USD -SEI,Binance,SEIUSDT,960266.1108,147580247.1,0.613207501,A,7,2,Sei,USDT-USD -SEI,CoinbasePro,SEI-USD,501975.7126,44992922.16,0.6149800585,A,7,2,Sei, -SEI,Huobi,seiusdt,58169.10057,38375753.16,0.6146183588,A,7,2,Sei,USDT-USD -SEI,Bybit,SEIUSDT,131815.1551,20617259.61,0.6146716564,A,7,2,Sei,USDT-USD -SEI,Kraken,SEIUSD,60743.57825,6077393.643,0.6142689745,A,7,2,Sei, -SEI,Kucoin,SEI-USDT,178642.4194,10251443.59,0.6122370319,A,7,2,Sei,USDT-USD -SEI,Mexc,SEI_USDT,456994.8627,3721782.454,0.6209961106,A,7,2,Sei,USDT-USD -SHIB,Okx,SHIB-USDT,186962.879,5752876.108,8.84E-06,A,8,1,Shiba Inu,USDT-USD -SHIB,Bybit,SHIBUSDT,97654.78678,2621562.66,8.84E-06,A,8,1,Shiba Inu,USDT-USD -SHIB,Kucoin,SHIB-USDT,214053.7893,4620710.046,8.84E-06,A,8,1,Shiba Inu,USDT-USD -SHIB,CoinbasePro,SHIB-USD,472915.9234,9834603.706,8.84E-06,A,8,1,Shiba Inu, -SHIB,Binance,SHIBUSDT,711743.4514,34409618.31,8.84E-06,A,8,1,Shiba Inu,USDT-USD -SHIB,Kraken,SHIBUSD,104567.4626,420513.5586,8.84E-06,A,8,1,Shiba Inu, -SHIB,Mexc,SHIB_USDT,1940827.945,796547.7524,8.84E-06,A,8,1,Shiba Inu,USDT-USD -SHIB,Huobi,shibusdt,67117.45039,363334.4836,8.84E-06,A,8,1,Shiba Inu,USDT-USD -SNX,Mexc,SNX_USDT,310714.3857,335052.6602,3.112944227,A,6,2,Synthetix Network Token,USDT-USD -SNX,Kraken,SNXUSD,63489.12006,606793.6628,3.13979134,A,6,2,Synthetix Network Token, -SNX,Okx,SNX-USDT,103282.8979,3298762.932,3.135011753,A,6,2,Synthetix Network Token,USDT-USD -SNX,Bybit,SNXUSDT,60753.04211,1293350.734,3.125053636,A,6,2,Synthetix Network Token,USDT-USD -SNX,Binance,SNXUSDT,287994.4111,12367152.42,3.133185754,A,6,2,Synthetix Network Token,USDT-USD -SNX,CoinbasePro,SNX-USD,138260.8807,3807927.897,3.137731528,A,6,2,Synthetix Network Token, -SOL,Kucoin,SOL-USDT,374442.0549,56433240.02,87.53739207,A,9,1,Solana,USDT-USD -SOL,CoinbasePro,SOL-USD,2257090.149,145521917.4,87.38247282,A,9,1,Solana, -SOL,Okx,SOL-USDT,1397468.011,135207705.4,87.4902174,A,9,1,Solana,USDT-USD -SOL,Mexc,SOL_USDT,1779392.262,299329951.9,87.49495206,A,9,1,Solana,USDT-USD -SOL,Kraken,SOLUSD,2251190.633,64593290.11,87.67728718,A,9,1,Solana, -SOL,Binance,SOLUSDT,3741601.199,607947665.6,87.49377311,A,9,1,Solana,USDT-USD -SOL,Bitstamp,SOL/USD,109890.2738,2646819.043,87.31111501,A,9,1,Solana, -SOL,Bybit,SOLUSDT,831770.3877,120667847.4,87.36083166,A,9,1,Solana,USDT-USD -SOL,Huobi,solusdt,275163.2969,41233952.41,87.4809317,A,9,1,Solana,USDT-USD -STX,Okx,STX-USDT,180203.7241,13352549.39,1.463485107,A,7,2,Stacks,USDT-USD -STX,Kraken,STXUSD,58949.55711,1353219.917,1.468122483,A,7,2,Stacks, -STX,CoinbasePro,STX-USD,258400.6869,14123894.62,1.463175003,A,7,2,Stacks, -STX,Kucoin,STX-USDT,152358.5064,5233980.249,1.465347379,A,7,2,Stacks,USDT-USD -STX,Binance,STXUSDT,584610.0183,45329052.16,1.462632266,A,7,2,Stacks,USDT-USD -STX,Mexc,STX_USDT,227354.8541,915054.5567,1.463303254,A,7,2,Stacks,USDT-USD -STX,Gate,STX_USDT,50000,100000,0,A,7,2,Stacks,USDT-USD -SUI,Kucoin,SUI-USDT,157119.1,12511155.03,1.224163869,A,6,2,SuiNetwork,USDT-USD -SUI,Mexc,SUI_USDT,233548.7548,2056662.292,1.222993101,A,6,2,SuiNetwork,USDT-USD -SUI,Binance,SUIUSDT,1262079.981,111516956.8,1.223930951,A,6,2,SuiNetwork,USDT-USD -SUI,CoinbasePro,SUI-USD,164063.7043,14862283.81,1.225266393,A,6,2,SuiNetwork, -SUI,Bybit,SUIUSDT,212067.1354,19630489.94,1.225408738,A,6,2,SuiNetwork,USDT-USD -SUI,Okx,SUI-USDT,613217.7334,54191478.11,1.223865903,A,6,2,SuiNetwork,USDT-USD -SUSHI,Mexc,SUSHI_USDT,698897.3305,162827.6862,1.069891177,A,6,2,Sushi,USDT-USD -SUSHI,Binance,SUSHIUSDT,314905.5164,8301205.3,1.070356721,A,6,2,Sushi,USDT-USD -SUSHI,Okx,SUSHI-USDT,140667.711,3610840.809,1.067487683,A,6,2,Sushi,USDT-USD -SUSHI,Kraken,SUSHIUSD,60333.51362,206177.6733,1.075978241,A,6,2,Sushi, -SUSHI,CoinbasePro,SUSHI-USD,84615.09476,3085188.166,1.072066002,A,6,2,Sushi, -SUSHI,Gate,SUSHI_USDT,50000,100000,0,A,6,2,Sushi,USDT-USD -TIA,Bybit,TIAUSDT,187918.6442,14660427.8,15.52650347,A,7,2,Celestia,USDT-USD -TIA,Binance,TIAUSDT,841382.0946,102103230.5,15.53648038,A,7,2,Celestia,USDT-USD -TIA,CoinbasePro,TIA-USD,383069.4815,25165071.27,15.51546599,A,7,2,Celestia, -TIA,Kraken,TIAUSD,111097.8042,6238500.3,15.50599396,A,7,2,Celestia, -TIA,Kucoin,TIA-USDT,125355.6151,11079068.85,15.55654998,A,7,2,Celestia,USDT-USD -TIA,Mexc,TIA_USDT,100237.1437,2406206.399,15.72168637,A,7,2,Celestia,USDT-USD -TIA,Okx,TIA-USDT,552714.9757,23266716.08,15.50535992,A,7,2,Celestia,USDT-USD -TRX,Kraken,TRXUSD,256930.9396,749814.9748,0.1113946358,A,8,2,TRON, -TRX,Binance,TRXUSDT,613911.798,39811843.58,0.110779356,A,8,2,TRON,USDT-USD -TRX,Huobi,trxusdt,213398.1056,8135870.339,0.1107429915,A,8,2,TRON,USDT-USD -TRX,Okx,TRX-USDT,162323.4689,5484388.924,0.1107910725,A,8,2,TRON,USDT-USD -TRX,Bybit,TRXUSDT,137021.0481,4074633.26,0.1107581644,A,8,2,TRON,USDT-USD -TRX,Kucoin,TRX-USDT,129267.4773,2807145.376,0.1109288304,A,8,2,TRON,USDT-USD -TRX,Mexc,TRX_USDT,676244.1047,18412701.3,0.1107773897,A,8,2,TRON,USDT-USD -TRX,Gate,TRX_USDT,50000,100000,0,A,8,2,TRON,USDT-USD -UNI,Mexc,UNI_USDT,764302.9979,247466.3051,5.761766722,A,7,2,Uniswap,USDT-USD -UNI,Binance,UNIUSDT,399637.0021,17327263.14,5.766455246,A,7,2,Uniswap,USDT-USD -UNI,Bybit,UNIUSDT,67657.94054,2493651.981,5.759751567,A,7,2,Uniswap,USDT-USD -UNI,Kucoin,UNI-USDT,62238.34996,915687.2194,5.769731774,A,7,2,Uniswap,USDT-USD -UNI,Kraken,UNIUSD,110184.576,575064.438,5.744322919,A,7,2,Uniswap, -UNI,Okx,UNI-USDT,188134.5271,8636195.728,5.755593059,A,7,2,Uniswap,USDT-USD -UNI,CoinbasePro,UNI-USD,136046.1025,4933014.237,5.766666815,A,7,2,Uniswap, -WLD,Okx,WLD-USDT,251129.2683,9586681.603,2.292928825,A,6,2,Worldcoin WLD,USDT-USD -WLD,Mexc,WLD_USDT,487737.0114,273829.0676,2.273495768,A,6,2,Worldcoin WLD,USDT-USD -WLD,Bybit,WLDUSDT,56863.91933,3194845.195,2.293914994,A,6,2,Worldcoin WLD,USDT-USD -WLD,Binance,WLDUSDT,309841.6575,26594366.07,2.291594044,A,6,2,Worldcoin WLD,USDT-USD -WLD,Kucoin,WLD-USDT,82240.3581,1301628.522,2.294060237,A,6,2,Worldcoin WLD,USDT-USD -WLD,Gate,WLD_USDT,50000,100000,0,A,6,2,Worldcoin WLD,USDT-USD -XLM,Kucoin,XLM-USDT,85927.31243,1417810.596,0.1117112483,A,8,1,Stellar,USDT-USD -XLM,CoinbasePro,XLM-USD,225276.1032,8883356.851,0.1117142784,A,8,1,Stellar, -XLM,Okx,XLM-USDT,118111.3781,1765770.66,0.1116885221,A,8,1,Stellar,USDT-USD -XLM,Kraken,XLMUSD,176811.499,408089.0655,0.1115158801,A,8,1,Stellar, -XLM,Bitstamp,XLM/USD,72720.87116,733454.4667,0.1113217575,A,8,1,Stellar, -XLM,Mexc,XLM_USDT,1132933.24,618310.8309,0.1117266616,A,8,1,Stellar,USDT-USD -XLM,Bybit,XLMUSDT,88709.74889,3151890.822,0.111753146,A,8,1,Stellar,USDT-USD -XLM,Binance,XLMUSDT,345297.9107,8403369.953,0.1117183159,A,8,1,Stellar,USDT-USD -XRP,Kraken,XRPUSD,814559.1334,6616229.004,0.5113032699,A,9,1,Ripple, -XRP,Binance,XRPUSDT,1884848.243,189067323.1,0.5112663149,A,9,1,Ripple,USDT-USD -XRP,Okx,XRP-USDT,563822.8277,34832795.43,0.5114652914,A,9,1,Ripple,USDT-USD -XRP,CoinbasePro,XRP-USD,730290.9717,38862484.52,0.5115428632,A,9,1,Ripple, -XRP,Huobi,xrpusdt,130799.1755,30764931.78,0.5116267728,A,9,1,Ripple,USDT-USD -XRP,Kucoin,XRP-USDT,711262.8242,17611337.65,0.5113220721,A,9,1,Ripple,USDT-USD -XRP,Bybit,XRPUSDT,574200.8828,60341501.96,0.511381899,A,9,1,Ripple,USDT-USD -XRP,Bitstamp,XRP/USD,893779.877,8546572.012,0.5101769016,A,9,1,Ripple, -XRP,Mexc,XRP_USDT,2253802.257,64063212.39,0.5113602624,A,9,1,Ripple,USDT-USD -CFX,Mexc,CFX_USDT,741948.4908,377232.5696,0.1828636419,B,5,2,Conflux Token,USDT-USD -CFX,Kucoin,CFX-USDT,55943.9793,3166120.044,0.1814791365,B,5,2,Conflux Token,USDT-USD -CFX,Binance,CFXUSDT,425985.235,21370941.25,0.1814141679,B,5,2,Conflux Token,USDT-USD -CFX,Okx,CFX-USDT,225570.4218,11740974.87,0.1814352472,B,5,2,Conflux Token,USDT-USD -CFX,Gate,CFX_USDT,50000,100000,0,B,5,2,Conflux Token,USDT-USD -COMP,Kraken,COMPUSD,53754.17258,243932.5958,53.11057205,B,5,2,Compound Coin, -COMP,Mexc,COMP_USDT,230873.8911,180053.2444,52.64207051,B,5,2,Compound Coin,USDT-USD -COMP,Okx,COMP-USDT,66721.14412,2254113.721,52.63991084,B,5,2,Compound Coin,USDT-USD -COMP,CoinbasePro,COMP-USD,62085.28523,1437341.815,52.63084228,B,5,2,Compound Coin, -COMP,Binance,COMPUSDT,121785.3724,8389374.272,52.68915121,B,5,2,Compound Coin,USDT-USD -EGLD,Kucoin,EGLD-USDT,65252.11559,1177346.419,48.76618226,B,5,2,MultiversX,USDT-USD -EGLD,Binance,EGLDUSDT,271211.9052,11875041.97,48.79330927,B,5,2,MultiversX,USDT-USD -EGLD,Mexc,EGLD_USDT,376293.4565,276441.7792,48.74594483,B,5,2,MultiversX,USDT-USD -EGLD,CoinbasePro,EGLD-USD,52835.82668,917429.1077,48.88945848,B,5,2,MultiversX, -EGLD,Gate,EGLD_USDT,50000,100000,0,B,5,2,MultiversX,USDT-USD -FLOW,Kraken,FLOWUSD,51916.27241,275346.5158,0.7242278161,B,5,2,Flow - Dapper Labs, -FLOW,Binance,FLOWUSDT,293656.6338,9552308.898,0.7291395058,B,5,2,Flow - Dapper Labs,USDT-USD -FLOW,Mexc,FLOW_USDT,483739.2177,113468.7798,0.7323395177,B,5,2,Flow - Dapper Labs,USDT-USD -FLOW,Okx,FLOW-USDT,80766.53137,9510373.237,0.7285897993,B,5,2,Flow - Dapper Labs,USDT-USD -FLOW,Gate,FLOW_USDT,50000,100000,0,B,5,2,Flow - Dapper Labs,USDT-USD -GMT,CoinbasePro,GMT-USD,67428.76141,2248881.711,0.2560028014,B,5,2,STEPN, -GMT,Binance,GMTUSDT,462665.2276,38705519.52,0.2555371175,B,5,2,STEPN,USDT-USD -GMT,Kucoin,GMT-USDT,72869.96385,2005043.366,0.2557195795,B,5,2,STEPN,USDT-USD -GMT,Okx,GMT-USDT,152103.8921,8914015.232,0.2554599347,B,5,2,STEPN,USDT-USD -GMT,Gate,GMT_USDT,50000,100000,0,B,5,2,STEPN,USDT-USD -MEME,Bybit,MEMEUSDT,74659.94612,1660599.611,0.02253908946,B,5,2,Memecoin Price,USDT-USD -MEME,Binance,MEMEUSDT,489840.1554,31554049.74,0.02249870307,B,5,2,Memecoin Price,USDT-USD -MEME,Kucoin,MEME-USDT,50201.45759,1498743.96,0.02243463802,B,5,2,Memecoin Price,USDT-USD -MEME,Mexc,MEME_USDT,184005.5762,478785.4964,0.02260242467,B,5,2,Memecoin Price,USDT-USD -MEME,Gate,MEME_USDT,50000,100000,0,B,5,2,Memecoin Price,USDT-USD -MINA,Mexc,MINA_USDT,110130.5009,610463.4036,1.00715717,B,5,2,Mina,USDT-USD -MINA,CoinbasePro,MINA-USD,59277.03658,6118487.412,1.008738919,B,5,2,Mina, -MINA,Kraken,MINAUSD,104251.6176,1744827.397,1.002235423,B,5,2,Mina, -MINA,Binance,MINAUSDT,163902.8209,27632789.9,1.009175349,B,5,2,Mina,USDT-USD -MINA,Okx,MINA-USDT,58811.29263,5177907.38,1.013323303,B,5,2,Mina,USDT-USD -PEOPLE,Okx,PEOPLE-USDT,318441.9026,37806408.11,0.02743487292,B,5,2,ConstitutionDAO,USDT-USD -PEOPLE,Kucoin,PEOPLE-USDT,64922.56302,3574827.52,0.0273835447,B,5,2,ConstitutionDAO,USDT-USD -PEOPLE,Mexc,PEOPLE_USDT,168543.6372,757272.2515,0.02744498423,B,5,2,ConstitutionDAO,USDT-USD -PEOPLE,Binance,PEOPLEUSDT,192342.5961,85366302.35,0.02746617133,B,5,2,ConstitutionDAO,USDT-USD -PEOPLE,Gate,PEOPLE_USDT,50000,100000,0,B,5,2,ConstitutionDAO,USDT-USD -WAVES,Okx,WAVES-USDT,91892.84196,2741667.219,2.144997825,B,5,2,Waves,USDT-USD -WAVES,Binance,WAVESUSDT,272620.4813,9543737.677,2.143624016,B,5,2,Waves,USDT-USD -WAVES,Mexc,WAVES_USDT,558956.9951,168193.854,2.142261269,B,5,2,Waves,USDT-USD -WAVES,Kucoin,WAVES-USDT,55367.18425,769644.5638,2.142747289,B,5,2,Waves,USDT-USD -WAVES,Kraken,WAVESUSD,45555.16136,112134.6183,2.154872324,B,5,2,Waves, -1INCH,Binance,1INCHUSDT,223047.9107,10123584.48,0.3759697336,C,4,2,1INCH,USDT-USD -1INCH,CoinbasePro,1INCH-USD,63433.64579,1220856.095,0.3761909036,C,4,2,1INCH, -1INCH,Mexc,1INCH_USDT,220805.8565,397303.2595,0.3751712747,C,4,2,1INCH,USDT-USD -1INCH,Okx,1INCH-USDT,87382.44268,4403164.462,0.375964926,C,4,2,1INCH,USDT-USD -ACE,Binance,ACEUSDT,219186.3365,36291711.39,9.125489437,C,2,2,Fusionist,USDT-USD -ACE,Okx,ACE-USDT,120509.3158,8941538.795,9.092071496,C,2,2,Fusionist,USDT-USD -ACH,CoinbasePro,ACH-USD,97110.58491,894158.4549,0.01675701504,C,3,2,Alchemy Pay, -ACH,Binance,ACHUSDT,84700.65638,4414398.216,0.01675085779,C,3,2,Alchemy Pay,USDT-USD -ACH,Mexc,ACH_USDT,192469.0915,100559.3076,0.01679041985,C,3,2,Alchemy Pay,USDT-USD -AEUR,Binance,AEURUSDT,1270915.824,759036.3652,1.085248864,C,1,2,Anchored Coins AEUR,USDT-USD -API3,Mexc,API3_USDT,152284.022,205441.5,2.043375234,C,2,2,API3,USDT-USD -API3,Binance,API3USDT,90101.84241,17128907.56,2.048019395,C,2,2,API3,USDT-USD -AR,Okx,AR-USDT,49845.96145,2809779.829,8.610082522,C,2,2,Arweave,USDT-USD -AR,Binance,ARUSDT,118756.107,5634710.58,8.603353236,C,2,2,Arweave,USDT-USD -ARKM,Binance,ARKMUSDT,101600.3693,9290971.501,0.5035873534,C,2,2,Arkham,USDT-USD -ARKM,Mexc,ARKM_USDT,104313.7334,237646.8392,0.502258142,C,2,2,Arkham,USDT-USD -ARPA,Binance,ARPAUSDT,141483.7342,6962539.152,0.05938416152,C,1,2,ArpaCoin,USDT-USD -ASTR,Mexc,ASTR_USDT,337777.2363,556571.4433,0.1714246019,C,3,2,ASTR,USDT-USD -ASTR,Binance,ASTRUSDT,272250.3728,29115614.2,0.1710438223,C,3,2,ASTR,USDT-USD -ASTR,Okx,ASTR-USDT,61040.31153,7741218.973,0.1712013965,C,3,2,ASTR,USDT-USD -AUCTION,Mexc,AUCTION_USDT,205068.2365,269845.2565,24.64750337,C,3,2,Auction,USDT-USD -AUCTION,Binance,AUCTIONUSDT,141766.5502,24443787.65,24.52525957,C,3,2,Auction,USDT-USD -AUCTION,Okx,AUCTION-USDT,64014.51076,7264691.478,24.43296353,C,3,2,Auction,USDT-USD -AXS,Mexc,AXS_USDT,262075.6017,132406.1769,7.065952702,C,3,2,Axie Infinity,USDT-USD -AXS,Binance,AXSUSDT,231000.3653,12333785.24,7.054601867,C,3,2,Axie Infinity,USDT-USD -AXS,CoinbasePro,AXS-USD,46520.7417,953800.4786,7.063964044,C,3,2,Axie Infinity, -BAKE,Binance,BAKEUSDT,182011.4866,35921179.76,0.3094882759,C,2,2,Bakery Token,USDT-USD -BAKE,Mexc,BAKE_USDT,185326.3247,583699.372,0.3068157366,C,2,2,Bakery Token,USDT-USD -BAND,Binance,BANDUSDT,55086.31129,6612180.017,1.592617506,C,1,2,Band Protocol,USDT-USD -BEAM,Binance,BEAMUSDT,152991.9166,15969226.65,0.01691214062,C,1,2,BEAM (Merit Circle),USDT-USD -BLZ,Binance,BLZUSDT,108417.3522,5588057.361,0.2904520078,C,2,2,Bluzelle,USDT-USD -BLZ,CoinbasePro,BLZ-USD,58365.73324,369664.6277,0.2910902264,C,2,2,Bluzelle, -BOND,Binance,BONDUSDT,101881.7077,6611834.75,3.051545382,C,1,2,BarnBridge,USDT-USD -BSW,Binance,BSWUSDT,46034.40658,4599238.929,0.08886586012,C,1,2,Biswap (BSW),USDT-USD -C98,Mexc,C98_USDT,285083.0197,153443.734,0.2185707406,C,2,2,Coin98,USDT-USD -C98,Binance,C98USDT,189878.1329,5558051.461,0.2185832922,C,2,2,Coin98,USDT-USD -CAKE,Mexc,CAKE_USDT,405312.078,551396.0436,2.447890968,C,2,2,PancakeSwap,USDT-USD -CAKE,Binance,CAKEUSDT,195778.7099,23654981.25,2.454039405,C,2,2,PancakeSwap,USDT-USD -CELO,Mexc,CELO_USDT,125444.7762,302663.9345,0.6476452305,C,3,2,Celo,USDT-USD -CELO,Okx,CELO-USDT,74867.9216,2248910.392,0.6477003752,C,3,2,Celo,USDT-USD -CELO,Binance,CELOUSDT,188957.1416,10478656.48,0.6474077901,C,3,2,Celo,USDT-USD -CHR,Binance,CHRUSDT,98985.18915,8983410.231,0.2454323105,C,1,2,Chromia,USDT-USD -CTSI,Binance,CTSIUSDT,61529.46969,13400594.76,0.211724629,C,1,2,Cartesi,USDT-USD -CYBER,Binance,CYBERUSDT,157494.8313,21582311.99,6.891553463,C,2,2,CyberConnect,USDT-USD -CYBER,Mexc,CYBER_USDT,245967.0815,775034.3955,6.894934361,C,2,2,CyberConnect,USDT-USD -DATA,Binance,DATAUSDT,56436.38905,6577080.731,0.04655652469,C,1,2,Streamr DATAcoin,USDT-USD -DEGO,Binance,DEGOUSDT,49442.4569,6918692.999,2.058938225,C,2,2,Dego Finance,USDT-USD -DEGO,Mexc,DEGO_USDT,47063.22126,145028.8291,2.061702998,C,2,2,Dego Finance,USDT-USD -DIA,Binance,DIAUSDT,46415.86926,5008591.814,0.398446883,C,1,2,DIAToken,USDT-USD -DUSK,Binance,DUSKUSDT,89726.44858,5994345.592,0.24835762,C,1,2,Dusk Network,USDT-USD -EUR,Binance,EURUSDT,914754.1506,25453392.79,1.086238407,C,3,2,Euro,USDT-USD -EUR,Bitstamp,EUR/USD,161923.2853,2925912.624,1.085974486,C,3,2,Euro, -EUR,Kraken,EURUSD,973749.5483,17562785.59,1.087181078,C,3,2,Euro, -FDUSD,Binance,FDUSDUSDT,20819829.91,791868072.3,0.9982990251,C,1,2,First Digital USD,USDT-USD -FRONT,Binance,FRONTUSDT,116592.5536,8033362.547,0.4244166096,C,1,2,Frontier,USDT-USD -FTT,Binance,FTTUSDT,85361.25321,18918457.67,2.637355962,C,2,2,FTX Token,USDT-USD -FTT,Mexc,FTT_USDT,61679.15314,885931.1891,2.625461927,C,2,2,FTX Token,USDT-USD -FXS,Binance,FXSUSDT,76687.07914,7919284.862,9.870999715,C,1,2,Frax Share,USDT-USD -GAL,Binance,GALUSDT,123198.1518,6183386.884,1.713442116,C,1,2,Project Galaxy,USDT-USD -GAS,Okx,GAS-USDT,71550.26438,3589890.498,5.559745992,C,2,2,Gas,USDT-USD -GAS,Binance,GASUSDT,143459.5949,16249734.4,5.551653689,C,2,2,Gas,USDT-USD -GLMR,Binance,GLMRUSDT,66465.37977,5440648.9,0.351519818,C,2,2,Moonbeam Network Glimmer Token,USDT-USD -GLMR,Mexc,GLMR_USDT,132937.7799,226967.7255,0.3519219251,C,2,2,Moonbeam Network Glimmer Token,USDT-USD -GMX,Binance,GMXUSDT,86050.25266,8488792.893,41.68565019,C,1,2,GMX,USDT-USD -GTC,Binance,GTCUSDT,63833.57202,5559771.674,1.109504239,C,1,2,Gitcoin,USDT-USD -HFT,Mexc,HFT_USDT,92867.50229,155840.9593,0.3163831693,C,3,2,Hashflow,USDT-USD -HFT,CoinbasePro,HFT-USD,67639.33185,1082720.501,0.3166013692,C,3,2,Hashflow, -HFT,Binance,HFTUSDT,86389.41028,4335472.459,0.3155912724,C,3,2,Hashflow,USDT-USD -HIFI,Binance,HIFIUSDT,65279.10529,4308106.952,0.5695358478,C,1,2,Hifi Finance,USDT-USD -HIGH,Binance,HIGHUSDT,94832.54951,5568886.461,1.416275081,C,1,2,Highstreet,USDT-USD -HOOK,Binance,HOOKUSDT,125566.4187,10904796.41,0.8514358619,C,1,2,Hooked Protocol,USDT-USD -HOT,Binance,HOTUSDT,88284.00246,4898150.064,0.00182001891,C,1,2,Holo,USDT-USD -ID,Binance,IDUSDT,105739.9887,10529785.09,0.2642775002,C,2,2,Space ID,USDT-USD -ID,Mexc,ID_USDT,99019.7159,293195.7436,0.2653625693,C,2,2,Space ID,USDT-USD -ILV,Binance,ILVUSDT,65967.97711,4756421.779,72.43485363,C,2,2,Illuvium,USDT-USD -ILV,Mexc,ILV_USDT,101351.5141,124582.7065,72.49241072,C,2,2,Illuvium,USDT-USD -IMX,Binance,IMXUSDT,159306.9212,9773348.424,1.833882485,C,4,2,Immutable X,USDT-USD -IMX,Mexc,IMX_USDT,125843.6309,288710.9571,1.831721582,C,4,2,Immutable X,USDT-USD -IMX,CoinbasePro,IMX-USD,63576.38536,3545209.657,1.832415885,C,4,2,Immutable X, -IMX,Okx,IMX-USDT,63231.7586,4815890.341,1.835477545,C,4,2,Immutable X,USDT-USD -IOTA,Binance,IOTAUSDT,156813.2627,9448427.026,0.2404979188,C,2,2,IOTA,USDT-USD -IOTA,Okx,IOTA-USDT,81364.86526,1422701.965,0.240249504,C,2,2,IOTA,USDT-USD -IOTX,Mexc,IOTX_USDT,63717.81113,114944.2482,0.04098756361,C,2,2,IoTeX,USDT-USD -IOTX,Binance,IOTXUSDT,118425.8892,5645105.663,0.04116999109,C,2,2,IoTeX,USDT-USD -JASMY,CoinbasePro,JASMY-USD,106938.7996,2456750.498,0.004883328831,C,4,2,Jasmy, -JASMY,Kucoin,JASMY-USDT,46532.2408,878234.3701,0.004897641967,C,4,2,Jasmy,USDT-USD -JASMY,Binance,JASMYUSDT,103914.894,4638424.246,0.004895538164,C,4,2,Jasmy,USDT-USD -JASMY,Mexc,JASMY_USDT,118057.5456,426212.9186,0.004900948254,C,4,2,Jasmy,USDT-USD -JOE,Binance,JOEUSDT,95891.84261,4986487.55,0.4210333582,C,2,2,TraderJoe,USDT-USD -JOE,Mexc,JOE_USDT,106334.2549,155616.5895,0.4240505807,C,2,2,TraderJoe,USDT-USD -KDA,Binance,KDAUSDT,52068.57953,6603653.169,0.9864134387,C,1,2,Kadena,USDT-USD -KLAY,Mexc,KLAY_USDT,198792.0879,193094.4612,0.1935774129,C,2,2,Klaytn,USDT-USD -KLAY,Binance,KLAYUSDT,102537.9319,8166690.792,0.1947100267,C,2,2,Klaytn,USDT-USD -KP3R,Binance,KP3RUSDT,54560.4206,6827068.529,68.97052078,C,1,2,Keep3rV1,USDT-USD -KSM,Okx,KSM-USDT,49131.02426,2272156.7,35.8946584,C,4,2,Kusama,USDT-USD -KSM,Kraken,KSMUSD,82906.03275,662412.7086,35.91468468,C,4,2,Kusama, -KSM,Mexc,KSM_USDT,51623.03643,146361.7075,35.99359072,C,4,2,Kusama,USDT-USD -KSM,Binance,KSMUSDT,104173.4084,6749163.486,35.92864815,C,4,2,Kusama,USDT-USD -LEVER,Binance,LEVERUSDT,103584.2033,8631452.701,0.001297870719,C,2,2,leverfi,USDT-USD -LEVER,Mexc,LEVER_USDT,269243.6154,100150.2478,0.001297685532,C,2,2,leverfi,USDT-USD -LOOM,Binance,LOOMUSDT,72863.84961,6250861.053,0.08656430192,C,1,2,Loom Network,USDT-USD -LPT,Binance,LPTUSDT,124147.244,4976570.721,6.65831672,C,1,2,Livepeer,USDT-USD -LQTY,Mexc,LQTY_USDT,289158.432,110300.6315,1.195620223,C,2,2,Liquity,USDT-USD -LQTY,Binance,LQTYUSDT,127715.2767,7023298.015,1.191924708,C,2,2,Liquity,USDT-USD -LRC,CoinbasePro,LRC-USD,59174.11432,3383810.585,0.2285031455,C,3,2,Loopring, -LRC,Mexc,LRC_USDT,45956.53557,124278.9266,0.2288337603,C,3,2,Loopring,USDT-USD -LRC,Binance,LRCUSDT,146930.5688,6969566.753,0.2286497941,C,3,2,Loopring,USDT-USD -LUNA,Okx,LUNA-USDT,140979.1409,2806262.42,9.33E-05,C,4,2,Terra Luna Classic,USDT-USD -LUNA,Mexc,LUNA_USDT,285530.9676,548675.4766,9.33E-05,C,4,2,Terra Luna Classic,USDT-USD -LUNA,Binance,LUNAUSDT,327295.5899,25245311.88,9.32E-05,C,4,2,Terra Luna Classic,USDT-USD -LUNA,Kucoin,LUNA-USDT,162730.8732,2161850.295,9.34E-05,C,4,2,Terra Luna Classic,USDT-USD -LUNA2,Okx,LUNA2-USDT,116714.2838,5214721.607,0.5862913961,C,4,2,Terra Luna 2,USDT-USD -LUNA2,Binance,LUNA2USDT,283182.821,12663702.95,0.5867542898,C,4,2,Terra Luna 2,USDT-USD -LUNA2,Kucoin,LUNA2-USDT,83502.73597,2063709.03,0.586261171,C,4,2,Terra Luna 2,USDT-USD -LUNA2,Mexc,LUNA2_USDT,108379.4362,339907.5678,0.5861178482,C,4,2,Terra Luna 2,USDT-USD -MAGIC,Mexc,MAGIC_USDT,264533.7207,290531.8239,0.9620408497,C,4,2,MAGIC,USDT-USD -MAGIC,Binance,MAGICUSDT,220494.1405,15191286.46,0.9583392892,C,4,2,MAGIC,USDT-USD -MAGIC,Okx,MAGIC-USDT,105405.7972,5401719.867,0.9595420314,C,4,2,MAGIC,USDT-USD -MAGIC,Gate,MAGIC_USDT,50000,100000,0,C,4,2,MAGIC,USDT-USD -MANTA,Bybit,MANTAUSDT,53885.15969,18009025.51,3.063765317,C,2,2,Manta,USDT-USD -MANTA,Binance,MANTAUSDT,403816.6432,259161217.8,3.08167379,C,2,2,Manta,USDT-USD -MAV,Mexc,MAV_USDT,185736.3436,457436.4408,0.5373792545,C,2,2,Maverick Protocol,USDT-USD -MAV,Binance,MAVUSDT,99388.71969,22924519.05,0.536668425,C,2,2,Maverick Protocol,USDT-USD -MOVR,Binance,MOVRUSDT,140137.8354,34228440.2,22.26851193,C,1,2,Moonriver,USDT-USD -NEO,Binance,NEOUSDT,174759.4944,6735135.997,10.50592939,C,2,2,NEO,USDT-USD -NEO,Mexc,NEO_USDT,285086.2477,101306.1126,10.51571434,C,2,2,NEO,USDT-USD -NFP,Binance,NFPUSDT,136224.0611,40056163.12,0.4984980965,C,1,2,NFPrompt,USDT-USD -NMR,Mexc,NMR_USDT,56441.59171,117950.3206,20.80947578,C,1,2,Numeraire,USDT-USD -NTRN,Binance,NTRNUSDT,190762.7558,22412232.21,1.043698576,C,3,2,Neutron,USDT-USD -NTRN,Kucoin,NTRN-USDT,61322.46516,4357183.961,1.0429518,C,3,2,Neutron,USDT-USD -NTRN,Mexc,NTRN_USDT,85753.64033,420380.4134,1.049013149,C,3,2,Neutron,USDT-USD -OGN,Mexc,OGN_USDT,133395.5319,153105.7316,0.1506897838,C,2,2,Origin Protocol,USDT-USD -OGN,Binance,OGNUSDT,114751.9375,8567467.491,0.1509501147,C,2,2,Origin Protocol,USDT-USD -ONE,Mexc,ONE_USDT,103633.3233,169389.5422,0.01381296016,C,1,2,Harmony,USDT-USD -ONT,Binance,ONTUSDT,101745.7079,6573307.838,0.2378290263,C,2,2,Ontology,USDT-USD -ONT,Mexc,ONT_USDT,134099.6108,119281.0604,0.2328763351,C,2,2,Ontology,USDT-USD -OSMO,CoinbasePro,OSMO-USD,45573.4572,505627.9592,1.434332792,C,2,2,osmosis, -OSMO,Binance,OSMOUSDT,184069.0761,6248594.99,1.436154852,C,2,2,osmosis,USDT-USD -OXT,Binance,OXTUSDT,121674.5039,4092402.317,0.08759780776,C,1,2,Orchid,USDT-USD -PENDLE,Mexc,PENDLE_USDT,94363.66432,302375.5024,2.414568281,C,2,2,Pendle,USDT-USD -PENDLE,Binance,PENDLEUSDT,198805.1833,19093374.54,2.411570446,C,2,2,Pendle,USDT-USD -PERP,Mexc,PERP_USDT,70959.09524,263694.8546,1.108616603,C,2,2,Perpetual Protocol,USDT-USD -PERP,Binance,PERPUSDT,97699.23947,18395585.05,1.101367961,C,2,2,Perpetual Protocol,USDT-USD -PHB,Binance,PHBUSDT,87353.37405,5541104.607,0.8191750331,C,1,2,Phoenix Global,USDT-USD -POLYX,Binance,POLYXUSDT,77106.52126,4877840.89,0.1556027116,C,1,2,Polymex,USDT-USD -POWR,Binance,POWRUSDT,101684.5648,32858394.18,0.3110983216,C,1,2,Power Ledger,USDT-USD -PROS,Binance,PROSUSDT,47335.53338,6601983.056,0.4958016306,C,1,2,Prosper,USDT-USD -PYR,Mexc,PYR_USDT,136917.2423,282019.549,5.525717506,C,2,2,Vulcan Forged,USDT-USD -PYR,Binance,PYRUSDT,67837.28685,6095379.499,5.513382639,C,2,2,Vulcan Forged,USDT-USD -QI,Binance,QIUSDT,65705.70399,4479686.822,0.01492820908,C,1,2,Benqi,USDT-USD -QNT,Binance,QNTUSDT,150130.1919,4958738.066,105.1210689,C,3,2,Quant,USDT-USD -QNT,CoinbasePro,QNT-USD,77932.07738,2702196.734,104.8651886,C,3,2,Quant, -QNT,Mexc,QNT_USDT,319187.1936,283469.3662,105.6252627,C,3,2,Quant,USDT-USD -RAD,Binance,RADUSDT,64303.27111,13728893.14,1.863131994,C,1,2,Radicle,USDT-USD -RAY,Binance,RAYUSDT,49059.70839,10476697.73,1.086883488,C,1,2,Raydium,USDT-USD -RDNT,Okx,RDNT-USDT,99487.73444,4908849.751,0.2781249382,C,2,2,Radiant Capital,USDT-USD -RDNT,Binance,RDNTUSDT,202234.405,19676252.31,0.27834352,C,2,2,Radiant Capital,USDT-USD -RIF,Binance,RIFUSDT,102720.0668,5575326.551,0.126668978,C,1,2,RIF Token,USDT-USD -RLC,CoinbasePro,RLC-USD,45038.78592,956263.9594,2.193508506,C,2,2,iExec RLC, -RLC,Binance,RLCUSDT,113296.5214,10458930.76,2.240062189,C,2,2,iExec RLC,USDT-USD -ROSE,CoinbasePro,ROSE-USD,94865.22605,2007709.124,0.09853848605,C,4,2,Oasis Network, -ROSE,Kucoin,ROSE-USDT,60914.79989,2255011.858,0.09829991324,C,4,2,Oasis Network,USDT-USD -ROSE,Binance,ROSEUSDT,188268.4384,13037035.32,0.09827645727,C,4,2,Oasis Network,USDT-USD -ROSE,Mexc,ROSE_USDT,87574.57166,553950.1122,0.09824638256,C,4,2,Oasis Network,USDT-USD -RUNE,Kucoin,RUNE-USDT,150957.3196,4886709.369,4.034373849,C,3,2,Thorchain,USDT-USD -RUNE,Kraken,RUNEUSD,64699.56261,918799.2368,4.070013999,C,3,2,Thorchain, -RUNE,Binance,RUNEUSDT,380276.4214,62447654.52,4.036291948,C,3,2,Thorchain,USDT-USD -SANTOS,Binance,SANTOSUSDT,48414.7599,10421735.09,4.748221741,C,1,2,Santos FC Fan Token,USDT-USD -SATS,Binance,SATSUSDT,270661.8914,65862844.2,0.0003862181853,C,2,2,SATS (Ordinals),USDT-USD -SATS,Okx,SATS-USDT,186918.757,23374134.77,3.87E-07,C,2,2,SATS (Ordinals),USDT-USD -SC,Binance,SCUSDT,56737.90689,11988942.85,0.008758778298,C,2,2,Siacoin,USDT-USD -SC,Kraken,SCUSD,72897.05559,939274.4661,0.009133476567,C,2,2,Siacoin, -SKL,CoinbasePro,SKL-USD,89253.48802,7106650.138,0.07392654734,C,2,2,SKALE Network, -SKL,Binance,SKLUSDT,245593.9026,14952643.43,0.07413113803,C,2,2,SKALE Network,USDT-USD -SLEEPAI,Binance,SLEEPAIUSDT,226926.639,75074601.74,1.03330556,C,1,2,Sleepless AI,USDT-USD -SLP,Binance,SLPUSDT,75829.29241,4740257.278,0.002835530307,C,1,2,Smooth Love Potion,USDT-USD -SSV,Binance,SSVUSDT,323731.8901,22076581.02,28.20046712,C,3,2,SSV Token,USDT-USD -SSV,Okx,SSV-USDT,138780.4853,10437857.38,28.20537722,C,3,2,SSV Token,USDT-USD -SSV,Mexc,SSV_USDT,72456.44543,262132.0541,28.25282324,C,3,2,SSV Token,USDT-USD -STG,Binance,STGUSDT,108865.1255,5746995.142,0.5045724388,C,2,2,Stargate Finance,USDT-USD -STG,Mexc,STG_USDT,84129.48408,141951.2826,0.503347766,C,2,2,Stargate Finance,USDT-USD -STORJ,Okx,STORJ-USDT,107087.3563,3141734.853,0.5481481935,C,4,2,Storj,USDT-USD -STORJ,Mexc,STORJ_USDT,379448.5526,135570.0261,0.542814224,C,4,2,Storj,USDT-USD -STORJ,Binance,STORJUSDT,231654.1428,10131073.03,0.5507150911,C,4,2,Storj,USDT-USD -STORJ,CoinbasePro,STORJ-USD,51027.83869,779419.6502,0.5473696668,C,4,2,Storj, -STRAX,Binance,STRAXUSDT,52905.44524,8603073.461,0.859584148,C,1,2,STRAX Token,USDT-USD -SUPER,CoinbasePro,SUPER-USD,50756.77233,2582255.195,0.5798868417,C,2,2,SuperCoin, -SUPER,Binance,SUPERUSDT,118810.403,6113031.497,0.5750921405,C,2,2,SuperCoin,USDT-USD -SYN,Binance,SYNUSDT,47988.72934,8355559.222,0.8286535512,C,1,2,Synapse,USDT-USD -T,Binance,TUSDT,67613.62552,15650726.81,0.0266303701,C,1,2,Threshold Network Token,USDT-USD -THETA,Okx,THETA-USDT,45307.20349,1748100.687,0.9536451092,C,3,2,Theta Token,USDT-USD -THETA,Kucoin,THETA-USDT,50799.11682,953331.377,0.9531037657,C,3,2,Theta Token,USDT-USD -THETA,Binance,THETAUSDT,124500.3519,6901396.198,0.9509138016,C,3,2,Theta Token,USDT-USD -TRB,Binance,TRBUSDT,390984.8389,100946113.2,103.9610988,C,3,2,Tellor Tributes,USDT-USD -TRB,CoinbasePro,TRB-USD,88075.97643,17801109.2,104.1184355,C,3,2,Tellor Tributes, -TRB,Okx,TRB-USDT,186073.443,21824721.52,104.3779998,C,3,2,Tellor Tributes,USDT-USD -TUSD,Mexc,TUSD_USDT,3321290.381,438627.3706,0.9834745064,C,2,2,TrueUSD,USDT-USD -TUSD,Binance,TUSDUSDT,8528624.338,127150976.8,0.983448235,C,2,2,TrueUSD,USDT-USD -TWT,Mexc,TWT_USDT,53326.82705,174132.0743,1.098094178,C,2,2,Trust Wallet Token,USDT-USD -TWT,Binance,TWTUSDT,82499.98134,4322265.177,1.095769461,C,2,2,Trust Wallet Token,USDT-USD -UMA,Binance,UMAUSDT,59739.75936,40479668.6,4.951798234,C,1,2,UMA,USDT-USD -UNFI,Binance,UNFIUSDT,131780.4267,7051952.799,5.639134191,C,2,2,Unifi Protocol DAO,USDT-USD -UNFI,Mexc,UNFI_USDT,130778.7414,110299.8533,5.64795796,C,2,2,Unifi Protocol DAO,USDT-USD -USTC,Binance,USTCUSDT,104193.9018,15652520.83,0.02414702556,C,3,2,TerraClassicUSD,USDT-USD -USTC,Okx,USTC-USDT,79755.13934,3789072.942,0.02416523268,C,3,2,TerraClassicUSD,USDT-USD -USTC,Mexc,USTC_USDT,160428.8833,291642.1385,0.02413599889,C,3,2,TerraClassicUSD,USDT-USD -VANRY,Binance,VANRYUSDT,52749.63014,6196670.624,0.05698171548,C,1,2,VANAR,USDT-USD -VENUS,Binance,VENUSUSDT,142572.1277,4451222.365,11.45017461,C,1,2,VENUS,USDT-USD -VET,Kucoin,VET-USDT,47075.4841,1459523.548,0.02683736035,C,4,2,VeChain Thor Blockchain,USDT-USD -VET,Binance,VETUSDT,156275.2048,10448229.43,0.02681801761,C,4,2,VeChain Thor Blockchain,USDT-USD -VET,CoinbasePro,VET-USD,76873.43971,1778291.301,0.02682562648,C,4,2,VeChain Thor Blockchain, -VET,Mexc,VET_USDT,206314.8694,264812.6117,0.02680541699,C,4,2,VeChain Thor Blockchain,USDT-USD -WBTC,Binance,WBTCUSDT,112200.2527,1683109.194,39963.72177,C,1,2,Wrapped Bitcoin,USDT-USD -WING,Binance,WINGUSDT,62333.07274,6305353.437,8.576492466,C,2,2,Wing Finance,USDT-USD -WING,Mexc,WING_USDT,145609.7828,144300.5718,8.312628247,C,2,2,Wing Finance,USDT-USD -WOO,Kucoin,WOO-USDT,56843.55491,2278027.521,0.3371057009,C,4,2,Wootrade Network,USDT-USD -WOO,Binance,WOOUSDT,151442.7656,10671160.74,0.3366437512,C,4,2,Wootrade Network,USDT-USD -WOO,Okx,WOO-USDT,69348.19917,2025176.877,0.3367207662,C,4,2,Wootrade Network,USDT-USD -WOO,Mexc,WOO_USDT,199456.2006,304849.2574,0.3360550686,C,4,2,Wootrade Network,USDT-USD -XAI,Binance,XAIUSDT,364809.2616,121646517.1,0.7172651447,C,3,2,Xai,USDT-USD -XAI,Kucoin,XAI-USDT,80369.25096,6679818.276,0.7140484103,C,3,2,Xai,USDT-USD -XAI,Mexc,XAI_USDT,62519.5629,2089596.926,0.7163100149,C,3,2,Xai,USDT-USD -XMR,Mexc,XMR_USDT,637929.6215,5399712.779,155.4816876,C,4,2,Monero,USDT-USD -XMR,Kucoin,XMR-USDT,75861.34173,8391529.693,155.526225,C,4,2,Monero,USDT-USD -XMR,Kraken,XMRUSD,152433.9495,1066363.955,155.8084502,C,4,2,Monero, -XMR,Binance,XMRUSDT,325239.0746,14167130.57,155.4210491,C,4,2,Monero,USDT-USD -XTZ,Binance,XTZUSDT,74018.47298,6036351.412,0.9344370358,C,2,2,Tezos,USDT-USD -XTZ,Kraken,XTZUSD,115428.0625,918276.8649,0.9324110152,C,2,2,Tezos, -YFI,Binance,YFIUSDT,106489.0261,4283188.193,7008.442394,C,2,2,yearn.finance,USDT-USD -YFI,CoinbasePro,YFI-USD,69803.71322,2485716.132,7006.499518,C,2,2,yearn.finance, -YGG,Binance,YGGUSDT,255512.6937,15978592.67,0.4253489864,C,3,2,Yield Guild Games,USDT-USD -YGG,Okx,YGG-USDT,112564.4286,8795935.186,0.4242942872,C,3,2,Yield Guild Games,USDT-USD -YGG,Mexc,YGG_USDT,291214.2319,384654.8937,0.4279915233,C,3,2,Yield Guild Games,USDT-USD -ZEC,Mexc,ZEC_USDT,508650.6599,287365.0153,21.96116327,C,2,2,Zcash,USDT-USD -ZEC,Binance,ZECUSDT,107748.7569,6231023.464,22.06774527,C,2,2,Zcash,USDT-USD -ZEN,Binance,ZENUSDT,121239.4862,5983871.133,7.622205603,C,1,2,Horizen,USDT-USD -ZIL,Binance,ZILUSDT,78122.06511,5951041.305,0.01981457877,C,3,2,Zilliqa,USDT-USD -ZIL,Mexc,ZIL_USDT,164288.1689,136450.7828,0.01983149916,C,3,2,Zilliqa,USDT-USD -ZIL,Kucoin,ZIL-USDT,51622.45768,620061.2048,0.0198240821,C,3,2,Zilliqa,USDT-U diff --git a/public/configs/potentialMarketParameters.csv b/public/configs/potentialMarketParameters.csv deleted file mode 100644 index 4be255e..0000000 --- a/public/configs/potentialMarketParameters.csv +++ /dev/null @@ -1,68 +0,0 @@ -base_asset,reference_price,num_oracles,liquidity_tier,asset_name,p,atomic_resolution,min_exchanges,min_price_change_ppm,price_exponent,step_base_quantum,ticksize_exponent,subticks_per_tick,min_order_size,quantum_conversion_exponent -AAVE,88.41933533,7,2,AAVE,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -ADA,0.4713770925,9,1,Cardano,-1,-5,3,2500,-10,1000000,-3,1000000,1000000,-9 -AGIX,0.2111443656,6,2,SingularityNET,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -ALGO,0.1613430877,6,2,Algorand,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -APE,1.121514886,7,2,ApeCoin,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -APT,7.323447408,8,2,Aptos,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -ARB,1.701673341,8,1,Arbitrum,0,-6,3,2500,-9,1000000,-3,1000000,1000000,-9 -ATOM,8.050389759,8,2,Cosmos,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -AVAX,30.38272818,9,1,Avalanche,1,-7,3,2500,-8,1000000,-3,1000000,1000000,-9 -BCH,236.328774,9,1,Bitcoin Cash,2,-8,3,2500,-7,1000000,-3,1000000,1000000,-9 -BLUR,0.6050104719,7,2,Blur,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -BNB,243.1294766,6,2,Binance Coin,2,-8,3,4000,-7,1000000,-3,1000000,1000000,-9 -BONK,1.09E-05,6,2,Bonk Token,-5,-1,3,4000,-14,1000000,-3,1000000,1000000,-9 -BTC,39909.14585,9,1,Bitcoin,4,-10,3,2500,-5,1000000,-3,1000000,1000000,-9 -CFX,0.1454384387,5,2,Conflux Token,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -CHZ,0.08712744693,6,2,Chiliz,-2,-4,3,4000,-11,1000000,-3,1000000,1000000,-9 -COMP,52.74250938,5,2,Compound Coin,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -CRV,0.4443624604,6,2,Curve DAO Token,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -DOGE,0.07793177878,9,1,Dogecoin,-2,-4,3,2500,-11,1000000,-3,1000000,1000000,-9 -DOT,6.452414058,8,1,Polkadot,0,-6,3,2500,-9,1000000,-3,1000000,1000000,-9 -EGLD,39.03897897,5,2,MultiversX,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -ENS,14.85690244,6,2,Ethereum Name Service (ENS),1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -EOS,0.5977251446,8,2,Eos,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -ETC,22.84861344,8,1,Ethereum Classic,1,-7,3,2500,-8,1000000,-3,1000000,1000000,-9 -ETH,2211.721168,9,1,Ethereum,3,-9,3,2500,-6,1000000,-3,1000000,1000000,-9 -FET,0.5864541562,6,2,Fetch AI,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -FIL,4.930296959,8,1,Filecoin,0,-6,3,2500,-9,1000000,-3,1000000,1000000,-9 -FLOW,0.5828593278,5,2,Flow - Dapper Labs,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -FTM,0.3359983176,6,2,Fantom,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -GALA,0.01840015547,6,2,Gala,-2,-4,3,4000,-11,1000000,-3,1000000,1000000,-9 -GMT,0.2045438866,5,2,STEPN,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -GRT,0.128018834,7,2,The Graph,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -HBAR,0.07127967284,7,2,Hedera Hashgraph,-2,-4,3,4000,-11,1000000,-3,1000000,1000000,-9 -ICP,11.47442186,7,2,Internet Computer,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -INJ,31.78305093,7,2,Injective Protocol,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -JTO,1.886208515,6,2,Jito,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -KAVA,0.5751546332,6,2,Kava,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -LDO,2.524539255,8,2,Lido DAO,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -LINK,13.81655633,8,1,ChainLink,1,-7,3,2500,-8,1000000,-3,1000000,1000000,-9 -LTC,65.43204352,9,1,Litecoin,1,-7,3,2500,-8,1000000,-3,1000000,1000000,-9 -MANA,0.3716510229,7,2,Decentraland,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -MASK,2.787727403,7,2,Mask Network,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -MATIC,0.7288467315,9,1,Matic Network,-1,-5,3,2500,-10,1000000,-3,1000000,1000000,-9 -MEME,0.01801497104,5,2,Memecoin Price,-2,-4,3,4000,-11,1000000,-3,1000000,1000000,-9 -MINA,1.008126033,5,2,Mina,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -MKR,2113.151651,6,2,Maker,3,-9,3,4000,-6,1000000,-3,1000000,1000000,-9 -NEAR,2.674751578,8,1,Near,0,-6,3,2500,-9,1000000,-3,1000000,1000000,-9 -OP,2.456951554,7,2,Optimism,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -ORDI,43.0494516,6,2,Ordinals,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -PEOPLE,0.02194591464,5,2,ConstitutionDAO,-2,-4,3,4000,-11,1000000,-3,1000000,1000000,-9 -PEPE,1.02E-06,6,2,Pepe,-6,0,3,4000,-15,1000000,-3,1000000,1000000,-9 -RNDR,3.777241656,6,2,Render Token,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -SAND,0.3751083804,7,2,SAND,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -SEI,0.6149970988,7,2,Sei,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -SHIB,8.84E-06,8,1,Shiba Inu,-6,0,3,2500,-15,1000000,-3,1000000,1000000,-9 -SNX,3.130619706,6,2,Synthetix Network Token,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -SOL,87.46988589,9,1,Solana,1,-7,3,2500,-8,1000000,-3,1000000,1000000,-9 -STX,1.255152213,7,2,Stacks,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -SUI,1.224271493,6,2,SuiNetwork,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -SUSHI,0.8926299706,6,2,Sushi,-1,-5,3,4000,-10,1000000,-3,1000000,1000000,-9 -TIA,15.55257715,7,2,Celestia,1,-7,3,4000,-8,1000000,-3,1000000,1000000,-9 -TRX,0.09702155504,8,2,TRON,-2,-4,3,4000,-11,1000000,-3,1000000,1000000,-9 -UNI,5.760612586,7,2,Uniswap,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -WAVES,2.145700544,5,2,Waves,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -WLD,1.907665645,6,2,Worldcoin WLD,0,-6,3,4000,-9,1000000,-3,1000000,1000000,-9 -XLM,0.1116437262,8,1,Stellar,-1,-5,3,2500,-10,1000000,-3,1000000,1000000,-9 -XRP,0.5112717386,9,1,Ripple,-1,-5,3,2500,-10,1000000,-3,1000000,1000000,-9 diff --git a/public/configs/v1/env.json b/public/configs/v1/env.json new file mode 100644 index 0000000..924e94a --- /dev/null +++ b/public/configs/v1/env.json @@ -0,0 +1,638 @@ +{ + "apps": { + "ios": { + "scheme": "dydx-t-v4" + } + }, + "tokens": { + "dydxprotocol-testnet": { + "chain": { + "name": "Dv4TNT", + "denom": "adv4tnt", + "decimals": 18, + "image": "/currencies/dydx.png" + }, + "usdc": { + "name": "USDC", + "denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "gasDenom": "uusdc", + "decimals": 6, + "image": "/currencies/usdc.png" + } + }, + "dydx-testnet-4": { + "chain": { + "name": "Dv4TNT", + "denom": "adv4tnt", + "decimals": 18, + "image": "/currencies/dydx.png" + }, + "usdc": { + "name": "USDC", + "denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "gasDenom": "uusdc", + "decimals": 6, + "image": "/currencies/usdc.png" + } + }, + "[mainnet chain id]": { + "comment": "Change according to mainnet release", + "chain": { + "name": "TokenName", + "denom": "tokenDenom", + "decimals": 18, + "image": "/currencies/dydx.png" + }, + "usdc": { + "name": "USDC", + "denom": "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5", + "gasDenom": "uusdc", + "decimals": 6, + "image": "/currencies/usdc.png" + } + } + }, + "links": { + "dydxprotocol-testnet": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "statusPage": "https://status.v4testnet.dydx.exchange/", + "mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}", + "blogs": "https://www.dydx.foundation/blog", + "foundation": "https://www.dydx.foundation", + "help": "https://help.dydx.exchange/", + "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", + "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", + "documentation": "https://docs.dydx.exchange/", + "community": "https://discord.com/invite/dydx", + "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", + "stakingLearnMore": "https://help.dydx.exchange", + "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", + "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", + "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" + }, + "dydx-testnet-4": { + "tos": "https://dydx.exchange/v4-terms", + "privacy": "https://dydx.exchange/privacy", + "statusPage": "https://status.v4testnet.dydx.exchange/", + "mintscan": "https://testnet.mintscan.io/dydx-testnet/txs/{tx_hash}", + "documentation": "https://docs.dydx.exchange/", + "community": "https://discord.com/invite/dydx", + "feedback": "https://docs.google.com/forms/d/e/1FAIpQLSezLsWCKvAYDEb7L-2O4wOON1T56xxro9A2Azvl6IxXHP_15Q/viewform", + "blogs": "https://www.dydx.foundation/blog", + "foundation": "https://www.dydx.foundation", + "help": "https://help.dydx.exchange/", + "reduceOnlyLearnMore": "https://help.dydx.exchange/articles/6345793-reduce-only-orders", + "mintscanBase": "https://testnet.mintscan.io/dydx-testnet", + "governanceLearnMore": "https://help.dydx.exchange", + "newMarketProposalLearnMore": "https://dydx.exchange/blog/new-market-proposals", + "stakingLearnMore": "https://help.dydx.exchange", + "keplrDashboard": "https://testnet.keplr.app/", + "strideZoneApp": "https://testnet.stride.zone", + "accountExportLearnMore": "https://help.dydx.exchange/en/articles/8565867-secret-phrase-on-dydx-chain", + "walletLearnMore": "https://www.dydx.academy/video/defi-wallet" + }, + "[mainnet chain id]": { + "tos": "[HTTP link to TOS]", + "privacy": "[HTTP link to Privacy Policy]", + "statusPage": "[HTTP link to status page]", + "mintscan": "[HTTP link to Mintscan, with {tx_hash} placeholder]", + "mintscanBase": "[HTTP link to TOS mintscan base url]", + "feedback": "[HTTP link to feedback form, can be null]", + "blogs": "[HTTP link to blogs, can be null]", + "foundation": "[HTTP link to foundation, can be null]", + "reduceOnlyLearnMore": "[HTTP link to reduce-only learn more, can be null]", + "documentation": "[HTTP link to documentation, can be null]", + "community": "[HTTP link to community, can be null]", + "help": "[HTTP link to help page, can be null]", + "governanceLearnMore": "[HTTP link to governance learn more, can be null]", + "newMarketProposalLearnMore": "[HTTP link to new market proposal learn more, can be null]", + "stakingLearnMore": "[HTTP link to staking learn more, can be null]", + "keplrDashboard": "[HTTP link to keplr dashboard, can be null]", + "strideZoneApp": "[HTTP link to stride zone app, can be null]", + "accountExportLearnMore": "[HTTP link to account export learn more, can be null]", + "walletLearnMore": "[HTTP link to wallet learn more, can be null]" + } + }, + "wallets": { + "dydxprotocol-testnet": { + "walletconnect": { + "client": { + "name": "dYdX v4", + "description": "dYdX v4 App", + "iconUrl": "/logos/dydx-x.png" + }, + "v2": { + "projectId": "47559b2ec96c09aed9ff2cb54a31ab0e" + } + }, + "walletSegue": { + "callbackUrl": "/walletsegue" + }, + "images": "/wallets/", + "signTypedDataAction": "dYdX Chain Onboarding", + "signTypedDataDomainName": "dYdX Chain" + }, + "dydx-testnet-4": { + "walletconnect": { + "client": { + "name": "dYdX v4", + "description": "dYdX v4 App", + "iconUrl": "/logos/dydx-x.png" + }, + "v2": { + "projectId": "47559b2ec96c09aed9ff2cb54a31ab0e" + } + }, + "walletSegue": { + "callbackUrl": "/walletsegue" + }, + "images": "/wallets/", + "signTypedDataAction": "dYdX Chain Onboarding", + "signTypedDataDomainName": "dYdX Chain" + }, + "[mainnet chain id]": { + "walletconnect": { + "client": { + "name": "[Name of the app]", + "description": "[Description of the app]", + "iconUrl": "[Relative URL of the icon URL]" + }, + "v2": { + "projectId": "[Project ID]" + } + }, + "walletSegue": { + "callbackUrl": "[Relative callback URL for WalletSegue, should match apple-app-site-association]" + }, + "images": "[Relative URL for wallet images]", + "signTypedDataAction": "dYdX Chain Onboarding", + "signTypedDataDomainName": "dYdX Chain" + } + }, + "governance": { + "dydxprotocol-testnet": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "dydx-testnet-4": { + "newMarketProposal": { + "initialDepositAmount": 10000000, + "delayBlocks": 900, + "newMarketsMethodology": "https://docs.google.com/spreadsheets/d/1zjkV9R7R_7KMItuzqzvKGwefSBRfE-ZNAx1LH55OcqY/edit?usp=sharing" + } + }, + "[mainnet chain id]": { + "newMarketProposal": { + "initialDepositAmount": 0, + "delayBlocks": 0, + "newMarketsMethodology": "[URL to spreadsheet or document that explains methodology]" + } + } + }, + "deployments": { + "MAINNET": { + "environments": [ + "dydxprotocol-mainnet" + ], + "default": "dydxprotocol-mainnet" + }, + "TESTFLIGHT": { + "environments": [ + "dydxprotocol-mainnet", + "dydxprotocol-testnet" + ], + "default": "dydxprotocol-mainnet" + }, + "TESTNET": { + "environments": [ + "dydxprotocol-testnet" + ], + "default": "dydxprotocol-testnet" + }, + "DEV": { + "environments": [ + "dydxprotocol-dev", + "dydxprotocol-dev-2", + "dydxprotocol-dev-4", + "dydxprotocol-dev-5", + "dydxprotocol-staging", + "dydxprotocol-staging-west", + "dydxprotocol-testnet", + "dydxprotocol-testnet-dydx", + "dydxprotocol-testnet-nodefleet", + "dydxprotocol-testnet-kingnodes", + "dydxprotocol-testnet-liquify", + "dydxprotocol-testnet-polkachu", + "dydxprotocol-testnet-bware" + ], + "default": "dydxprotocol-testnet" + } + }, + "environments": { + "dydxprotocol-dev": { + "name": "v4 Dev", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4dev.dydx.exchange", + "socket": "wss://indexer.v4dev.dydx.exchange" + } + ], + "validators": [ + "https://validator.v4dev.dydx.exchange" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4dev.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-dev-2": { + "name": "v4 Dev 2", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "http://dev2-indexer-apne1-lb-public-2076363889.ap-northeast-1.elb.amazonaws.com", + "socket": "ws://dev2-indexer-apne1-lb-public-2076363889.ap-northeast-1.elb.amazonaws.com" + } + ], + "validators": [ + "http://54.92.118.111" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-dev-4": { + "name": "v4 Dev 4", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4dev4.dydx.exchange", + "socket": "wss://indexer.v4dev4.dydx.exchange" + } + ], + "validators": [ + "https://validator.v4dev4.dydx.exchange" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4dev4.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-dev-5": { + "name": "v4 Dev 5", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "http://dev5-indexer-apne1-lb-public-1721328151.ap-northeast-1.elb.amazonaws.com", + "socket": "ws://dev5-indexer-apne1-lb-public-1721328151.ap-northeast-1.elb.amazonaws.com" + } + ], + "validators": [ + "http://18.223.78.50" + ], + "0xsquid": "https://testnet.api.0xsquid.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-staging": { + "name": "v4 Staging", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4staging.dydx.exchange", + "socket": "wss://indexer.v4staging.dydx.exchange" + } + ], + "faucet": "https://faucet.v4staging.dydx.exchange", + "validators": [ + "https://validator.v4staging.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-staging-forced-update": { + "name": "v4 Staging Forced Update", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4staging.dydx.exchange", + "socket": "wss://indexer.v4staging.dydx.exchange" + } + ], + "faucet": "https://faucet.v4staging.dydx.exchange", + "validators": [ + "https://validator.v4staging.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "apps": { + "ios": { + "minimalVersion": "1.0", + "build": 40000, + "url": "https://apps.apple.com/app/dydx/id1564787350" + } + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-staging-west": { + "name": "v4 Staging West", + "ethereumChainId": "11155111", + "dydxChainId": "dydxprotocol-testnet", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4staging.dydx.exchange", + "socket": "wss://indexer.v4staging.dydx.exchange" + } + ], + "faucet": "https://faucet.v4staging.dydx.exchange", + "validators": [ + "https://validator-uswest1.v4staging.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/" + }, + "featureFlags": { + "reduceOnlySupported": true + } + }, + "dydxprotocol-testnet": { + "name": "v4 Public Testnet", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet-full-rpc.public.blastapi.io/", + "https://dydx-testnet-rpc.polkachu.com/", + "https://dydx-testnet.nodefleet.org", + "https://test-dydx.kingnodes.com", + "https://dydx-rpc.liquify.com/api=8878132/dydx" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-dydx": { + "name": "v4 Public Testnet/dYdX", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://validator.v4testnet.dydx.exchange" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-nodefleet": { + "name": "v4 Public Testnet/nodefleet", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet.nodefleet.org" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-kingnodes": { + "name": "v4 Public Testnet/KingNodes", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://test-dydx.kingnodes.com" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-liquify": { + "name": "v4 Public Testnet/Liquify", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-rpc.liquify.com/api=8878132/dydx" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-polkachu": { + "name": "v4 Public Testnet/Polkahcu", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet-rpc.polkachu.com/" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-testnet-bware": { + "name": "v4 Public Testnet/BWare", + "ethereumChainId": "11155111", + "dydxChainId": "dydx-testnet-4", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "dYdX-api", + "isMainNet": false, + "endpoints": { + "indexers": [ + { + "api": "https://indexer.v4testnet.dydx.exchange", + "socket": "wss://indexer.v4testnet.dydx.exchange" + } + ], + "validators": [ + "https://dydx-testnet-full-rpc.public.blastapi.io/" + ], + "0xsquid": "https://testnet.api.squidrouter.com", + "nobleValidator": "https://noble-testnet-rpc.polkachu.com/", + "faucet": "https://faucet.v4testnet.dydx.exchange" + }, + "featureFlags": { + "reduceOnlySupported": false + } + }, + "dydxprotocol-mainnet": { + "name": "v4", + "ethereumChainId": "1", + "dydxChainId": "[mainnet chain id]", + "chainName": "dYdX Chain", + "chainLogo": "/dydx-chain.png", + "squidIntegratorId": "[mainnet squid integrator id]", + "isMainNet": true, + "endpoints": { + "indexers": [ + { + "api": "[REST endpoint]", + "socket": "[Websocket endpoint]" + } + ], + "validators": [ + "[Validator endpoint 1", + "[Validator endpoint n]" + ], + "0xsquid": "[0xSquid endpoint for mainnet]", + "nobleValidator": "[noble validator endpoint for mainnet]" + }, + "featureFlags": { + "reduceOnlySupported": false + } + } + } +} \ No newline at end of file diff --git a/public/currencies/agix.png b/public/currencies/agix.png new file mode 100644 index 0000000..1ec65e8 Binary files /dev/null and b/public/currencies/agix.png differ diff --git a/public/currencies/bnb.png b/public/currencies/bnb.png new file mode 100644 index 0000000..f7f549a Binary files /dev/null and b/public/currencies/bnb.png differ diff --git a/public/currencies/chz.png b/public/currencies/chz.png new file mode 100644 index 0000000..a08a912 Binary files /dev/null and b/public/currencies/chz.png differ diff --git a/public/currencies/dym.png b/public/currencies/dym.png new file mode 100644 index 0000000..b8e4cca Binary files /dev/null and b/public/currencies/dym.png differ diff --git a/public/currencies/ens.png b/public/currencies/ens.png new file mode 100644 index 0000000..e9f5408 Binary files /dev/null and b/public/currencies/ens.png differ diff --git a/public/currencies/fet.png b/public/currencies/fet.png new file mode 100644 index 0000000..a6d3b03 Binary files /dev/null and b/public/currencies/fet.png differ diff --git a/public/currencies/ftm.png b/public/currencies/ftm.png new file mode 100644 index 0000000..40fb7e5 Binary files /dev/null and b/public/currencies/ftm.png differ diff --git a/public/currencies/gala.png b/public/currencies/gala.png new file mode 100644 index 0000000..4f1e382 Binary files /dev/null and b/public/currencies/gala.png differ diff --git a/public/currencies/gmt.png b/public/currencies/gmt.png new file mode 100644 index 0000000..33926c1 Binary files /dev/null and b/public/currencies/gmt.png differ diff --git a/public/currencies/grt.png b/public/currencies/grt.png new file mode 100644 index 0000000..996331b Binary files /dev/null and b/public/currencies/grt.png differ diff --git a/public/currencies/hbar.png b/public/currencies/hbar.png new file mode 100644 index 0000000..497626f Binary files /dev/null and b/public/currencies/hbar.png differ diff --git a/public/currencies/imx.png b/public/currencies/imx.png new file mode 100644 index 0000000..a50d671 Binary files /dev/null and b/public/currencies/imx.png differ diff --git a/public/currencies/inj.png b/public/currencies/inj.png new file mode 100644 index 0000000..c4d8b92 Binary files /dev/null and b/public/currencies/inj.png differ diff --git a/public/currencies/jto.png b/public/currencies/jto.png new file mode 100644 index 0000000..491886e Binary files /dev/null and b/public/currencies/jto.png differ diff --git a/public/currencies/jup.png b/public/currencies/jup.png new file mode 100644 index 0000000..82e518e Binary files /dev/null and b/public/currencies/jup.png differ diff --git a/public/currencies/kava.png b/public/currencies/kava.png new file mode 100644 index 0000000..5973bca Binary files /dev/null and b/public/currencies/kava.png differ diff --git a/public/currencies/mana.png b/public/currencies/mana.png new file mode 100644 index 0000000..82850f4 Binary files /dev/null and b/public/currencies/mana.png differ diff --git a/public/currencies/mask.png b/public/currencies/mask.png new file mode 100644 index 0000000..6d52252 Binary files /dev/null and b/public/currencies/mask.png differ diff --git a/public/currencies/mina.png b/public/currencies/mina.png new file mode 100644 index 0000000..4e579dd Binary files /dev/null and b/public/currencies/mina.png differ diff --git a/public/currencies/ordi.png b/public/currencies/ordi.png new file mode 100644 index 0000000..a931aac Binary files /dev/null and b/public/currencies/ordi.png differ diff --git a/public/currencies/pyth.png b/public/currencies/pyth.png new file mode 100644 index 0000000..0495d51 Binary files /dev/null and b/public/currencies/pyth.png differ diff --git a/public/currencies/rndr.png b/public/currencies/rndr.png new file mode 100644 index 0000000..500ced3 Binary files /dev/null and b/public/currencies/rndr.png differ diff --git a/public/currencies/sand.png b/public/currencies/sand.png new file mode 100644 index 0000000..63abd4e Binary files /dev/null and b/public/currencies/sand.png differ diff --git a/public/currencies/stx.png b/public/currencies/stx.png new file mode 100644 index 0000000..56e6580 Binary files /dev/null and b/public/currencies/stx.png differ diff --git a/public/currencies/woo.png b/public/currencies/woo.png new file mode 100644 index 0000000..44aeb72 Binary files /dev/null and b/public/currencies/woo.png differ diff --git a/public/currencies/zeta.png b/public/currencies/zeta.png new file mode 100644 index 0000000..e414137 Binary files /dev/null and b/public/currencies/zeta.png differ diff --git a/public/libs/amplitude-analytics-browser-2.0.0-min.js b/public/libs/amplitude-analytics-browser-2.0.0-min.js new file mode 100644 index 0000000..80b8ab7 --- /dev/null +++ b/public/libs/amplitude-analytics-browser-2.0.0-min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};function t(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var n=function(){return n=Object.assign||function(e){for(var t,n=1,i=arguments.length;n0&&r[r.length-1])||6!==u[0]&&2!==u[0])){s=0;continue}if(3===u[0]&&(!r||u[1]>r[0]&&u[1]=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function u(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,r,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(i=o.next()).done;)s.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return s}function a(e,t,n){if(n||2===arguments.length)for(var i,r=0,o=t.length;r1e3)return!1;for(var t in e){var n=e[t];if(!A(t,n))return!1}return!0},A=function(e,t){var n,i;if("string"!=typeof e)return!1;if(Array.isArray(t)){var r=!0;try{for(var o=s(t),u=o.next();!u.done;u=o.next()){var a=u.value;if(Array.isArray(a))return!1;if("object"==typeof a)r=r&&L(a);else if(!["number","string"].includes(typeof a))return!1;if(!r)return!1}}catch(e){n={error:e}}finally{try{u&&!u.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}}else{if(null==t)return!1;if("object"==typeof t)return L(t);if(!["number","string","boolean"].includes(typeof t))return!1}return!0},j=function(){function e(){this._propertySet=new Set,this._properties={}}return e.prototype.getUserProperties=function(){return n({},this._properties)},e.prototype.set=function(e,t){return this._safeSet(c.SET,e,t),this},e.prototype.setOnce=function(e,t){return this._safeSet(c.SET_ONCE,e,t),this},e.prototype.append=function(e,t){return this._safeSet(c.APPEND,e,t),this},e.prototype.prepend=function(e,t){return this._safeSet(c.PREPEND,e,t),this},e.prototype.postInsert=function(e,t){return this._safeSet(c.POSTINSERT,e,t),this},e.prototype.preInsert=function(e,t){return this._safeSet(c.PREINSERT,e,t),this},e.prototype.remove=function(e,t){return this._safeSet(c.REMOVE,e,t),this},e.prototype.add=function(e,t){return this._safeSet(c.ADD,e,t),this},e.prototype.unset=function(e){return this._safeSet(c.UNSET,e,"-"),this},e.prototype.clearAll=function(){return this._properties={},this._properties[c.CLEAR_ALL]="-",this},e.prototype._safeSet=function(e,t,n){if(this._validate(e,t,n)){var i=this._properties[e];return void 0===i&&(i={},this._properties[e]=i),i[t]=n,this._propertySet.add(t),!0}return!1},e.prototype._validate=function(e,t,n){return void 0===this._properties[c.CLEAR_ALL]&&(!this._propertySet.has(t)&&(e===c.ADD?"number"==typeof n:e===c.UNSET||e===c.REMOVE||A(t,n)))},e}(),C=function(e,t){return n(n({},t),{event_type:d.IDENTIFY,user_properties:e.getUserProperties()})},M=function(e,t,n){return void 0===t&&(t=0),void 0===n&&(n=v.Unknown),{event:e,code:t,message:n}},V=function(e){return e?(e^16*Math.random()>>e/4).toString(16):(String(1e7)+String(-1e3)+String(-4e3)+String(-8e3)+String(-1e11)).replace(/[018]/g,V)},F=function(){function e(e){this.client=e,this.queue=[],this.applying=!1,this.plugins=[]}return e.prototype.register=function(e,t){var n,i,s;return r(this,void 0,void 0,(function(){return o(this,(function(r){switch(r.label){case 0:return e.name=null!==(n=e.name)&&void 0!==n?n:V(),e.type=null!==(i=e.type)&&void 0!==i?i:"enrichment",[4,null===(s=e.setup)||void 0===s?void 0:s.call(e,t,this.client)];case 1:return r.sent(),this.plugins.push(e),[2]}}))}))},e.prototype.deregister=function(e){return this.plugins.splice(this.plugins.findIndex((function(t){return t.name===e})),1),Promise.resolve()},e.prototype.reset=function(e){this.applying=!1,this.plugins=[],this.client=e},e.prototype.push=function(e){var t=this;return new Promise((function(n){t.queue.push([e,n]),t.scheduleApply(0)}))},e.prototype.scheduleApply=function(e){var t=this;this.applying||(this.applying=!0,setTimeout((function(){t.apply(t.queue.shift()).then((function(){t.applying=!1,t.queue.length>0&&t.scheduleApply(0)}))}),e))},e.prototype.apply=function(e){return r(this,void 0,void 0,(function(){var t,i,r,a,c,l,d,f,p,v,h,g,y,m,b,_,I,S,w,E;return o(this,(function(o){switch(o.label){case 0:if(!e)return[2];t=u(e,1),i=t[0],r=u(e,2),a=r[1],c=this.plugins.filter((function(e){return"before"===e.type})),o.label=1;case 1:o.trys.push([1,6,7,8]),l=s(c),d=l.next(),o.label=2;case 2:return d.done?[3,5]:(g=d.value).execute?[4,g.execute(n({},i))]:[3,4];case 3:if(null===(y=o.sent()))return a({event:i,code:0,message:""}),[2];i=y,o.label=4;case 4:return d=l.next(),[3,2];case 5:return[3,8];case 6:return f=o.sent(),I={error:f},[3,8];case 7:try{d&&!d.done&&(S=l.return)&&S.call(l)}finally{if(I)throw I.error}return[7];case 8:p=this.plugins.filter((function(e){return"enrichment"===e.type||void 0===e.type})),o.label=9;case 9:o.trys.push([9,14,15,16]),v=s(p),h=v.next(),o.label=10;case 10:return h.done?[3,13]:(g=h.value).execute?[4,g.execute(n({},i))]:[3,12];case 11:if(null===(y=o.sent()))return a({event:i,code:0,message:""}),[2];i=y,o.label=12;case 12:return h=v.next(),[3,10];case 13:return[3,16];case 14:return m=o.sent(),w={error:m},[3,16];case 15:try{h&&!h.done&&(E=v.return)&&E.call(v)}finally{if(w)throw w.error}return[7];case 16:return b=this.plugins.filter((function(e){return"destination"===e.type})),_=b.map((function(e){var t=n({},i);return e.execute(t).catch((function(e){return M(t,0,String(e))}))})),Promise.all(_).then((function(e){var t=u(e,1)[0];a(t)})),[2]}}))}))},e.prototype.flush=function(){return r(this,void 0,void 0,(function(){var e,t,n,i=this;return o(this,(function(r){switch(r.label){case 0:return e=this.queue,this.queue=[],[4,Promise.all(e.map((function(e){return i.apply(e)})))];case 1:return r.sent(),t=this.plugins.filter((function(e){return"destination"===e.type})),n=t.map((function(e){return e.flush&&e.flush()})),[4,Promise.all(n)];case 2:return r.sent(),[2]}}))}))},e}(),Q="Event rejected due to exceeded retry count",$=function(e){return{promise:e||Promise.resolve()}},K=function(){function e(e){void 0===e&&(e="$default"),this.initializing=!1,this.q=[],this.dispatchQ=[],this.logEvent=this.track.bind(this),this.timeline=new F(this),this.name=e}return e.prototype._init=function(e){return r(this,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return this.config=e,this.timeline.reset(this),[4,this.runQueuedFunctions("q")];case 1:return t.sent(),[2]}}))}))},e.prototype.runQueuedFunctions=function(e){return r(this,void 0,void 0,(function(){var t,n,i,r,u,a;return o(this,(function(o){switch(o.label){case 0:t=this[e],this[e]=[],o.label=1;case 1:o.trys.push([1,6,7,8]),n=s(t),i=n.next(),o.label=2;case 2:return i.done?[3,5]:[4,(0,i.value)()];case 3:o.sent(),o.label=4;case 4:return i=n.next(),[3,2];case 5:return[3,8];case 6:return r=o.sent(),u={error:r},[3,8];case 7:try{i&&!i.done&&(a=n.return)&&a.call(n)}finally{if(u)throw u.error}return[7];case 8:return[2]}}))}))},e.prototype.track=function(e,t,i){var r=function(e,t,i){return n(n(n({},"string"==typeof e?{event_type:e}:e),i),t&&{event_properties:t})}(e,t,i);return $(this.dispatch(r))},e.prototype.identify=function(e,t){var n=C(e,t);return $(this.dispatch(n))},e.prototype.groupIdentify=function(e,t,i,r){var o=function(e,t,i,r){var o;return n(n({},r),{event_type:d.GROUP_IDENTIFY,group_properties:i.getUserProperties(),groups:(o={},o[e]=t,o)})}(e,t,i,r);return $(this.dispatch(o))},e.prototype.setGroup=function(e,t,i){var r=function(e,t,i){var r,o=new j;return o.set(e,t),n(n({},i),{event_type:d.IDENTIFY,user_properties:o.getUserProperties(),groups:(r={},r[e]=t,r)})}(e,t,i);return $(this.dispatch(r))},e.prototype.revenue=function(e,t){var i=function(e,t){return n(n({},t),{event_type:d.REVENUE,event_properties:e.getEventProperties()})}(e,t);return $(this.dispatch(i))},e.prototype.add=function(e){return this.config?$(this.timeline.register(e,this.config)):(this.q.push(this.add.bind(this,e)),$())},e.prototype.remove=function(e){return this.config?$(this.timeline.deregister(e)):(this.q.push(this.remove.bind(this,e)),$())},e.prototype.dispatchWithCallback=function(e,t){if(!this.config)return t(M(e,0,"Client not initialized"));this.process(e).then(t)},e.prototype.dispatch=function(e){return r(this,void 0,void 0,(function(){var t=this;return o(this,(function(n){return this.config?[2,this.process(e)]:[2,new Promise((function(n){t.dispatchQ.push(t.dispatchWithCallback.bind(t,e,n))}))]}))}))},e.prototype.process=function(e){return r(this,void 0,void 0,(function(){var t,n,i;return o(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),this.config.optOut?[2,M(e,0,"Event skipped due to optOut config")]:[4,this.timeline.push(e)];case 1:return 200===(i=r.sent()).code?this.config.loggerProvider.log(i.message):this.config.loggerProvider.error(i.message),[2,i];case 2:return t=r.sent(),n=String(t),this.config.loggerProvider.error(n),[2,i=M(e,0,n)];case 3:return[2]}}))}))},e.prototype.setOptOut=function(e){this.config?this.config.optOut=Boolean(e):this.q.push(this.setOptOut.bind(this,Boolean(e)))},e.prototype.flush=function(){return $(this.timeline.flush())},e}(),B=function(){function e(){this.productId="",this.quantity=1,this.price=0}return e.prototype.setProductId=function(e){return this.productId=e,this},e.prototype.setQuantity=function(e){return e>0&&(this.quantity=e),this},e.prototype.setPrice=function(e){return this.price=e,this},e.prototype.setRevenueType=function(e){return this.revenueType=e,this},e.prototype.setRevenue=function(e){return this.revenue=e,this},e.prototype.setEventProperties=function(e){return L(e)&&(this.properties=e),this},e.prototype.getEventProperties=function(){var e=this.properties?n({},this.properties):{};return e[l.REVENUE_PRODUCT_ID]=this.productId,e[l.REVENUE_QUANTITY]=this.quantity,e[l.REVENUE_PRICE]=this.price,e[l.REVENUE_TYPE]=this.revenueType,e[l.REVENUE]=this.revenue,e},e}(),z="Amplitude Logger ",W=function(){function e(){this.logLevel=f.None}return e.prototype.disable=function(){this.logLevel=f.None},e.prototype.enable=function(e){void 0===e&&(e=f.Warn),this.logLevel=e},e.prototype.log=function(){for(var e=[],t=0;t0&&Promise.all(n.map((function(e){return i.execute(e)}))).catch(),[2,Promise.resolve(void 0)]}}))}))},e.prototype.execute=function(e){var t=this;return new Promise((function(n){var i={event:e,attempts:0,callback:function(e){return n(e)},timeout:0};t.addToQueue(i)}))},e.prototype.addToQueue=function(){for(var e=this,t=[],n=0;n0&&t.schedule(e)}))}),e))},e.prototype.flush=function(e){return void 0===e&&(e=!1),r(this,void 0,void 0,(function(){var t,n,i,r=this;return o(this,(function(o){switch(o.label){case 0:return t=[],n=[],this.queue.forEach((function(e){return 0===e.timeout?t.push(e):n.push(e)})),this.queue=n,this.scheduled&&(clearTimeout(this.scheduled),this.scheduled=null),s=t,u=this.config.flushQueueSize,a=Math.max(u,1),i=s.reduce((function(e,t,n){var i=Math.floor(n/a);return e[i]||(e[i]=[]),e[i].push(t),e}),[]),[4,Promise.all(i.map((function(t){return r.send(t,e)})))];case 1:return o.sent(),[2]}var s,u,a}))}))},e.prototype.send=function(e,t){return void 0===t&&(t=!0),r(this,void 0,void 0,(function(){var n,r,s,u,a;return o(this,(function(o){switch(o.label){case 0:if(!this.config.apiKey)return[2,this.fulfillRequest(e,400,"Event rejected due to missing API key")];n={api_key:this.config.apiKey,events:e.map((function(e){var t=e.event;return t.extra,i(t,["extra"])})),options:{min_id_length:this.config.minIdLength}},o.label=1;case 1:return o.trys.push([1,3,,4]),r=Y(this.config.serverUrl,this.config.serverZone,this.config.useBatch).serverUrl,[4,this.config.transportProvider.send(r,n)];case 2:return null===(s=o.sent())?(this.fulfillRequest(e,0,"Unexpected error occurred"),[2]):t?(this.handleResponse(s,e),[3,4]):("body"in s?this.fulfillRequest(e,s.statusCode,"".concat(s.status,": ").concat(H(s))):this.fulfillRequest(e,s.statusCode,s.status),[2]);case 3:return u=o.sent(),a=(c=u)instanceof Error?c.message:String(c),this.config.loggerProvider.error(a),this.fulfillRequest(e,0,a),[3,4];case 4:return[2]}var c}))}))},e.prototype.handleResponse=function(e,t){var n=e.status;switch(n){case v.Success:this.handleSuccessResponse(e,t);break;case v.Invalid:this.handleInvalidResponse(e,t);break;case v.PayloadTooLarge:this.handlePayloadTooLargeResponse(e,t);break;case v.RateLimit:this.handleRateLimitResponse(e,t);break;default:this.config.loggerProvider.warn("{code: 0, error: \"Status '".concat(n,"' provided for ").concat(t.length,' events"}')),this.handleOtherResponse(t)}},e.prototype.handleSuccessResponse=function(e,t){this.fulfillRequest(t,e.statusCode,"Event tracked successfully")},e.prototype.handleInvalidResponse=function(e,t){var n=this;if(e.body.missingField||e.body.error.startsWith("Invalid API key"))this.fulfillRequest(t,e.statusCode,e.body.error);else{var i=a(a(a(a([],u(Object.values(e.body.eventsWithInvalidFields)),!1),u(Object.values(e.body.eventsWithMissingFields)),!1),u(Object.values(e.body.eventsWithInvalidIdLengths)),!1),u(e.body.silencedEvents),!1).flat(),r=new Set(i),o=t.filter((function(t,i){if(!r.has(i))return!0;n.fulfillRequest([t],e.statusCode,e.body.error)}));o.length>0&&this.config.loggerProvider.warn(H(e)),this.addToQueue.apply(this,a([],u(o),!1))}},e.prototype.handlePayloadTooLargeResponse=function(e,t){1!==t.length?(this.config.loggerProvider.warn(H(e)),this.config.flushQueueSize/=2,this.addToQueue.apply(this,a([],u(t),!1))):this.fulfillRequest(t,e.statusCode,e.body.error)},e.prototype.handleRateLimitResponse=function(e,t){var n=this,i=Object.keys(e.body.exceededDailyQuotaUsers),r=Object.keys(e.body.exceededDailyQuotaDevices),o=e.body.throttledEvents,s=new Set(i),c=new Set(r),l=new Set(o),d=t.filter((function(t,i){if(!(t.event.user_id&&s.has(t.event.user_id)||t.event.device_id&&c.has(t.event.device_id)))return l.has(i)&&(t.timeout=n.throttleTimeout),!0;n.fulfillRequest([t],e.statusCode,e.body.error)}));d.length>0&&this.config.loggerProvider.warn(H(e)),this.addToQueue.apply(this,a([],u(d),!1))},e.prototype.handleOtherResponse=function(e){var t=this;this.addToQueue.apply(this,a([],u(e.map((function(e){return e.timeout=e.attempts*t.retryTimeout,e}))),!1))},e.prototype.fulfillRequest=function(e,t,n){this.saveEvents(),e.forEach((function(e){return e.callback(M(e.event,t,n))}))},e.prototype.saveEvents=function(){if(this.config.storageProvider){var e=Array.from(this.queue.map((function(e){return e.event})));this.config.storageProvider.set(this.storageKey,e)}},e}(),ee=function(e){return void 0===e&&(e=0),((new Error).stack||"").split("\n").slice(2+e).map((function(e){return e.trim()}))},te=function(e){return function(){var t=n({},e.config);return{logger:t.loggerProvider,logLevel:t.logLevel}}},ne=function(e,t){var n,i;t=(t=t.replace(/\[(\w+)\]/g,".$1")).replace(/^\./,"");try{for(var r=s(t.split(".")),o=r.next();!o.done;o=r.next()){var u=o.value;if(!(u in e))return;e=e[u]}}catch(e){n={error:e}}finally{try{o&&!o.done&&(i=r.return)&&i.call(r)}finally{if(n)throw n.error}}return e},ie=function(e,t){return function(){var n,i,r={};try{for(var o=s(t),u=o.next();!u.done;u=o.next()){var a=u.value;r[a]=ne(e,a)}}catch(e){n={error:e}}finally{try{u&&!u.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}return r}},re=function(e,t,n,i,r){return void 0===r&&(r=null),function(){for(var o=[],s=0;s=200&&e<300?v.Success:429===e?v.RateLimit:413===e?v.PayloadTooLarge:408===e?v.Timeout:e>=400&&e<500?v.Invalid:e>=500?v.Failed:v.Unknown},e}(),ue=function(e,t,n){return void 0===t&&(t=""),void 0===n&&(n=10),[q,t,e.substring(0,n)].filter(Boolean).join("_")},ae=function(){function e(e){this.options=n({},e)}return e.prototype.isEnabled=function(){return r(this,void 0,void 0,(function(){var t,n,i;return o(this,(function(r){switch(r.label){case 0:if(!h())return[2,!1];t=String(Date.now()),n=new e(this.options),i="AMP_TEST",r.label=1;case 1:return r.trys.push([1,4,5,7]),[4,n.set(i,t)];case 2:return r.sent(),[4,n.get(i)];case 3:return[2,r.sent()===t];case 4:return r.sent(),[2,!1];case 5:return[4,n.remove(i)];case 6:return r.sent(),[7];case 7:return[2]}}))}))},e.prototype.get=function(e){return r(this,void 0,void 0,(function(){var t;return o(this,(function(n){switch(n.label){case 0:return[4,this.getRaw(e)];case 1:if(!(t=n.sent()))return[2,void 0];try{try{t=decodeURIComponent(atob(t))}catch(e){}return[2,JSON.parse(t)]}catch(e){return[2,void 0]}return[2]}}))}))},e.prototype.getRaw=function(e){var t;return r(this,void 0,void 0,(function(){var n,i,r;return o(this,(function(o){return n=h(),i=null!==(t=null==n?void 0:n.document.cookie.split("; "))&&void 0!==t?t:[],(r=i.find((function(t){return 0===t.indexOf(e+"=")})))?[2,r.substring(e.length+1)]:[2,void 0]}))}))},e.prototype.set=function(e,t){var n;return r(this,void 0,void 0,(function(){var i,r,s,u,a,c;return o(this,(function(o){try{i=null!==(n=this.options.expirationDays)&&void 0!==n?n:0,s=void 0,(r=null!==t?i:-1)&&((u=new Date).setTime(u.getTime()+24*r*60*60*1e3),s=u),a="".concat(e,"=").concat(btoa(encodeURIComponent(JSON.stringify(t)))),s&&(a+="; expires=".concat(s.toUTCString())),a+="; path=/",this.options.domain&&(a+="; domain=".concat(this.options.domain)),this.options.secure&&(a+="; Secure"),this.options.sameSite&&(a+="; SameSite=".concat(this.options.sameSite)),(c=h())&&(c.document.cookie=a)}catch(e){}return[2]}))}))},e.prototype.remove=function(e){return r(this,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,this.set(e,null)];case 1:return t.sent(),[2]}}))}))},e.prototype.reset=function(){return r(this,void 0,void 0,(function(){return o(this,(function(e){return[2]}))}))},e}(),ce=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return t(n,e),n.prototype.send=function(e,t){return r(this,void 0,void 0,(function(){var n,i;return o(this,(function(r){switch(r.label){case 0:if("undefined"==typeof fetch)throw new Error("FetchTransport is not supported");return n={headers:{"Content-Type":"application/json",Accept:"*/*"},body:JSON.stringify(t),method:"POST"},[4,fetch(e,n)];case 1:return[4,r.sent().json()];case 2:return i=r.sent(),[2,this.buildResponse(i)]}}))}))},n}(se),le=function(){function e(){}return e.prototype.getApplicationContext=function(){return{versionName:this.versionName,language:de(),platform:"Web",os:void 0,deviceModel:void 0}},e}(),de=function(){return"undefined"!=typeof navigator&&(navigator.languages&&navigator.languages[0]||navigator.language)||""},fe=function(){function e(){this.queue=[]}return e.prototype.logEvent=function(e){this.receiver?this.receiver(e):this.queue.length<512&&this.queue.push(e)},e.prototype.setEventReceiver=function(e){this.receiver=e,this.queue.length>0&&(this.queue.forEach((function(t){e(t)})),this.queue=[])},e}(),pe=function(){return pe=Object.assign||function(e){for(var t,n=1,i=arguments.length;n=0;--s)i.push(n.slice(s).join("."));s=0,o.label=2;case 2:return s2?(r=t,o=i):"string"==typeof t?(r=t,o=void 0):(r=null==t?void 0:t.userId,o=t),$(this._init(n(n({},o),{userId:r,apiKey:e})))},i.prototype._init=function(t){var i,s;return r(this,void 0,void 0,(function(){var u,a,c,l,d=this;return o(this,(function(f){switch(f.label){case 0:return this.initializing?[2]:(this.initializing=!0,[4,Ge(t.apiKey,t,this)]);case 1:return u=f.sent(),[4,e.prototype._init.call(this,u)];case 2:return f.sent(),this.setSessionId(null!==(s=null!==(i=t.sessionId)&&void 0!==i?i:this.config.sessionId)&&void 0!==s?s:Date.now()),(a=me(t.instanceName)).identityStore.setIdentity({userId:this.config.userId,deviceId:this.config.deviceId}),[4,this.add(new X).promise];case 3:return f.sent(),[4,this.add(new ke).promise];case 4:return f.sent(),[4,this.add(new be).promise];case 5:return f.sent(),v=this.config.defaultTracking,Ie(v,"fileDownloads")?[4,this.add({name:"@amplitude/plugin-file-download-tracking-browser",type:"enrichment",setup:function(e,t){return r(void 0,void 0,void 0,(function(){var n,i;return o(this,(function(r){return t?(n=function(e){var n;try{n=new URL(e.href,window.location.href)}catch(e){return}var r=i.exec(n.href),o=null==r?void 0:r[1];o&&e.addEventListener("click",(function(){var i;o&&t.track(je,((i={})[Ve]=o,i[Fe]=n.pathname,i[Qe]=e.id,i[$e]=e.text,i[Ke]=e.href,i))}))},i=/\.(pdf|xlsx?|docx?|txt|rtf|csv|exe|key|pp(s|t|tx)|7z|pkg|rar|gz|zip|avi|mov|mp4|mpe?g|wmv|midi?|mp3|wav|wma)$/,Array.from(document.getElementsByTagName("a")).forEach(n),"undefined"!=typeof MutationObserver&&new MutationObserver((function(e){e.forEach((function(e){e.addedNodes.forEach((function(e){"A"===e.nodeName&&n(e),"querySelectorAll"in e&&"function"==typeof e.querySelectorAll&&Array.from(e.querySelectorAll("a")).map(n)}))}))})).observe(document.body,{subtree:!0,childList:!0}),[2]):(e.loggerProvider.warn("File download tracking requires a later version of @amplitude/analytics-browser. File download events are not tracked."),[2])}))}))},execute:function(e){return r(void 0,void 0,void 0,(function(){return o(this,(function(t){return[2,e]}))}))}}).promise]:[3,7];case 6:f.sent(),f.label=7;case 7:return function(e){return Ie(e,"formInteractions")}(this.config.defaultTracking)?[4,this.add({name:"@amplitude/plugin-form-interaction-tracking-browser",type:"enrichment",setup:function(e,t){return r(void 0,void 0,void 0,(function(){var n;return o(this,(function(i){return t?(n=function(e){var n=!1;e.addEventListener("change",(function(){var i;n||t.track(Le,((i={})[Be]=e.id,i[ze]=e.name,i[We]=e.action,i)),n=!0}),{}),e.addEventListener("submit",(function(){var i,r;n||t.track(Le,((i={})[Be]=e.id,i[ze]=e.name,i[We]=e.action,i)),t.track(Ae,((r={})[Be]=e.id,r[ze]=e.name,r[We]=e.action,r)),n=!1}))},Array.from(document.getElementsByTagName("form")).forEach(n),"undefined"!=typeof MutationObserver&&new MutationObserver((function(e){e.forEach((function(e){e.addedNodes.forEach((function(e){"FORM"===e.nodeName&&n(e),"querySelectorAll"in e&&"function"==typeof e.querySelectorAll&&Array.from(e.querySelectorAll("form")).map(n)}))}))})).observe(document.body,{subtree:!0,childList:!0}),[2]):(e.loggerProvider.warn("Form interaction tracking requires a later version of @amplitude/analytics-browser. Form interaction events are not tracked."),[2])}))}))},execute:function(e){return r(void 0,void 0,void 0,(function(){return o(this,(function(t){return[2,e]}))}))}}).promise]:[3,9];case 8:f.sent(),f.label=9;case 9:return Se(this.config.defaultTracking)?(p=this.config,c=Se(p.defaultTracking)&&p.defaultTracking&&"object"==typeof p.defaultTracking&&p.defaultTracking.attribution&&"object"==typeof p.defaultTracking.attribution?n({},p.defaultTracking.attribution):{},l=nt(c),[4,this.add(l).promise]):[3,11];case 10:f.sent(),f.label=11;case 11:return[4,this.add(rt(we(this.config))).promise];case 12:return f.sent(),this.initializing=!1,[4,this.runQueuedFunctions("dispatchQ")];case 13:return f.sent(),a.eventBridge.setEventReceiver((function(e){d.track(e.eventType,e.eventProperties)})),[2]}var p,v}))}))},i.prototype.getUserId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.userId},i.prototype.setUserId=function(e){this.config?e===this.config.userId&&void 0!==e||(this.config.userId=e,function(e,t){me(t).identityStore.editIdentity().setUserId(e).commit()}(e,this.config.instanceName)):this.q.push(this.setUserId.bind(this,e))},i.prototype.getDeviceId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.deviceId},i.prototype.setDeviceId=function(e){this.config?(this.config.deviceId=e,function(e,t){me(t).identityStore.editIdentity().setDeviceId(e).commit()}(e,this.config.instanceName)):this.q.push(this.setDeviceId.bind(this,e))},i.prototype.reset=function(){this.setDeviceId(V()),this.setUserId(void 0)},i.prototype.getSessionId=function(){var e;return null===(e=this.config)||void 0===e?void 0:e.sessionId},i.prototype.setSessionId=function(e){var t;if(this.config){if(e!==this.config.sessionId){var n,i=this.getSessionId(),r=this.config.lastEventTime,o=null!==(t=this.config.lastEventId)&&void 0!==t?t:-1;this.config.sessionId=e,this.config.lastEventTime=void 0,n=this.config.defaultTracking,Ie(n,"sessions")&&(i&&r&&this.track(Me,void 0,{device_id:this.previousSessionDeviceId,event_id:++o,session_id:i,time:r+1,user_id:this.previousSessionUserId}),this.config.lastEventTime=this.config.sessionId,this.track(Ce,void 0,{event_id:++o,session_id:this.config.sessionId,time:this.config.lastEventTime})),this.previousSessionDeviceId=this.config.deviceId,this.previousSessionUserId=this.config.userId}}else this.q.push(this.setSessionId.bind(this,e))},i.prototype.extendSession=function(){this.config?this.config.lastEventTime=Date.now():this.q.push(this.extendSession.bind(this))},i.prototype.setTransport=function(e){this.config?this.config.transportProvider=He(e):this.q.push(this.setTransport.bind(this,e))},i.prototype.identify=function(t,n){if(Te(t)){var i=t._q;t._q=[],t=Oe(new j,i)}return(null==n?void 0:n.user_id)&&this.setUserId(n.user_id),(null==n?void 0:n.device_id)&&this.setDeviceId(n.device_id),e.prototype.identify.call(this,t,n)},i.prototype.groupIdentify=function(t,n,i,r){if(Te(i)){var o=i._q;i._q=[],i=Oe(new j,o)}return e.prototype.groupIdentify.call(this,t,n,i,r)},i.prototype.revenue=function(t,n){if(Te(t)){var i=t._q;t._q=[],t=Oe(new B,i)}return e.prototype.revenue.call(this,t,n)},i.prototype.process=function(t){return r(this,void 0,void 0,(function(){var n,i,r;return o(this,(function(o){return n=Date.now(),i=this.config.lastEventTime||Date.now(),r=n-i,t.event_type!==Ce&&t.event_type!==Me&&(!t.session_id||t.session_id===this.getSessionId())&&r>this.config.sessionTimeout&&this.setSessionId(n),[2,e.prototype.process.call(this,t)]}))}))},i}(K),ct=function(){var e=new at;return{init:re(e.init.bind(e),"init",te(e),ie(e,["config"])),add:re(e.add.bind(e),"add",te(e),ie(e,["config.apiKey","timeline.plugins"])),remove:re(e.remove.bind(e),"remove",te(e),ie(e,["config.apiKey","timeline.plugins"])),track:re(e.track.bind(e),"track",te(e),ie(e,["config.apiKey","timeline.queue.length"])),logEvent:re(e.logEvent.bind(e),"logEvent",te(e),ie(e,["config.apiKey","timeline.queue.length"])),identify:re(e.identify.bind(e),"identify",te(e),ie(e,["config.apiKey","timeline.queue.length"])),groupIdentify:re(e.groupIdentify.bind(e),"groupIdentify",te(e),ie(e,["config.apiKey","timeline.queue.length"])),setGroup:re(e.setGroup.bind(e),"setGroup",te(e),ie(e,["config.apiKey","timeline.queue.length"])),revenue:re(e.revenue.bind(e),"revenue",te(e),ie(e,["config.apiKey","timeline.queue.length"])),flush:re(e.flush.bind(e),"flush",te(e),ie(e,["config.apiKey","timeline.queue.length"])),getUserId:re(e.getUserId.bind(e),"getUserId",te(e),ie(e,["config","config.userId"])),setUserId:re(e.setUserId.bind(e),"setUserId",te(e),ie(e,["config","config.userId"])),getDeviceId:re(e.getDeviceId.bind(e),"getDeviceId",te(e),ie(e,["config","config.deviceId"])),setDeviceId:re(e.setDeviceId.bind(e),"setDeviceId",te(e),ie(e,["config","config.deviceId"])),reset:re(e.reset.bind(e),"reset",te(e),ie(e,["config","config.userId","config.deviceId"])),getSessionId:re(e.getSessionId.bind(e),"getSessionId",te(e),ie(e,["config"])),setSessionId:re(e.setSessionId.bind(e),"setSessionId",te(e),ie(e,["config"])),extendSession:re(e.extendSession.bind(e),"extendSession",te(e),ie(e,["config"])),setOptOut:re(e.setOptOut.bind(e),"setOptOut",te(e),ie(e,["config"])),setTransport:re(e.setTransport.bind(e),"setTransport",te(e),ie(e,["config"]))}},lt=ct(),dt=lt.add,ft=lt.extendSession,pt=lt.flush,vt=lt.getDeviceId,ht=lt.getSessionId,gt=lt.getUserId,yt=lt.groupIdentify,mt=lt.identify,bt=lt.init,_t=lt.logEvent,It=lt.remove,St=lt.reset,wt=lt.revenue,Et=lt.setDeviceId,Ot=lt.setGroup,Tt=lt.setOptOut,kt=lt.setSessionId,Pt=lt.setTransport,Rt=lt.setUserId,xt=lt.track,Ut=Object.freeze({__proto__:null,add:dt,extendSession:ft,flush:pt,getDeviceId:vt,getSessionId:ht,getUserId:gt,groupIdentify:yt,identify:mt,init:bt,logEvent:_t,remove:It,reset:St,revenue:wt,setDeviceId:Et,setGroup:Ot,setOptOut:Tt,setSessionId:kt,setTransport:Pt,setUserId:Rt,track:xt,Types:U,createInstance:ct,runQueuedFunctions:Ee,Revenue:B,Identify:j});!function(){var e=h();if(e){var t=function(e){var t=ct(),n=h();return n&&n.amplitude&&n.amplitude._iq&&e&&(n.amplitude._iq[e]=t),t};if(e.amplitude=Object.assign(e.amplitude||{},Ut,{createInstance:t}),e.amplitude.invoked){var n=e.amplitude._q;e.amplitude._q=[],Ee(Ut,n);for(var i=Object.keys(e.amplitude._iq)||[],r=0;r \ No newline at end of file diff --git a/public/smartbanner.html b/public/smartbanner.html new file mode 100644 index 0000000..b9c3159 --- /dev/null +++ b/public/smartbanner.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/third-party/keplr.png b/public/third-party/keplr.png new file mode 100644 index 0000000..3f765e2 Binary files /dev/null and b/public/third-party/keplr.png differ diff --git a/public/third-party/stride.png b/public/third-party/stride.png new file mode 100644 index 0000000..b950ab3 Binary files /dev/null and b/public/third-party/stride.png differ diff --git a/scripts/README.md b/scripts/README.md index dea4d27..242dc6f 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -36,3 +36,17 @@ Customize Intercom Messenger by adding logo and brand colors 3. Add API key in Github > Secrets and Variables > Actions as `INTERCOM_APP_ID` 4. In your deploy scripts add `pnpm run build:inject-intercom` after your pnpm build / vite build command. 5. If you are using with the Amplitude deployment scripts, your build command may look like the following: `pnpm build && pnpm run build:inject-amplitude && pnpm run build:inject-intercom` + +### Smartbanner +Smartbanner to show download links to iOS and/or Android native apps on mobile devices. + +To use with dydxprotocol/v4-web: +1. iOS app App Store link or Android app Google Play link. +2. Add configurations in Github > Secrets and Variables > Actions as + `SMARTBANNER_APP_NAME` for app name + `SMARTBANNER_ORG_NAME` for organization name + `SMARTBANNER_ICON_URL` for icon image + `SMARTBANNER_APPSTORE_URL` for iOS App Store link + `SMARTBANNER_GOOGLEPLAY_URL` for Android Google Play link +3. In your deploy scripts add `pnpm run build:inject-smartbanner` after your pnpm build / vite build command. +4. If you are using with the Amplitude deployment scripts, your build command may look like the following: `pnpm build && pnpm run build:inject-smartbanner` diff --git a/scripts/inject-amplitude.js b/scripts/inject-amplitude.js index 6848b45..b1bdc79 100644 --- a/scripts/inject-amplitude.js +++ b/scripts/inject-amplitude.js @@ -3,23 +3,50 @@ import path from 'path'; import { fileURLToPath } from 'url'; const AMPLITUDE_API_KEY = process.env.AMPLITUDE_API_KEY; +const AMPLITUDE_SERVER_URL = process.env.AMPLITUDE_SERVER_URL; const currentPath = fileURLToPath(import.meta.url); const projectRoot = path.dirname(currentPath); const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); -if(AMPLITUDE_API_KEY){ +if (AMPLITUDE_API_KEY) { try { const html = await fs.readFile(htmlFilePath, 'utf-8'); const amplitudeCdnScript = ` `; const amplitudeListenerScript = ``; + !(function () { + var e = "${AMPLITUDE_API_KEY}"; + e && + (globalThis.amplitude.init(e${ + AMPLITUDE_SERVER_URL + ? `, undefined, { + serverUrl: "${AMPLITUDE_SERVER_URL}" + }` + : '' + }), + globalThis.amplitude.setOptOut(!1), + globalThis.addEventListener("dydx:track", function (e) { + var t = e.detail.eventType, + d = e.detail.eventData; + globalThis.amplitude.track(t, d); + }), + globalThis.addEventListener("dydx:identify", function (e) { + var t = e.detail.property, + d = e.detail.propertyValue; + if ("walletAddress" === t) globalThis.amplitude.setUserId(d); + else { + var i = new globalThis.amplitude.Identify(); + i.set(t, d), globalThis.amplitude.identify(i); + } + }), + console.log("Amplitude enabled.")); + })(); + `; const injectedHtml = html.replace( '
', diff --git a/scripts/inject-smartbanner.js b/scripts/inject-smartbanner.js new file mode 100644 index 0000000..b5f4767 --- /dev/null +++ b/scripts/inject-smartbanner.js @@ -0,0 +1,60 @@ +/* eslint-disable no-console */ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const SMARTBANNER_APP_NAME = process.env.SMARTBANNER_APP_NAME; +const SMARTBANNER_ORG_NAME = process.env.SMARTBANNER_ORG_NAME; +const SMARTBANNER_ICON_URL = process.env.SMARTBANNER_ICON_URL; +const SMARTBANNER_APPSTORE_URL = process.env.SMARTBANNER_APPSTORE_URL; +const SMARTBANNER_GOOGLEPLAY_URL = process.env.SMARTBANNER_GOOGLEPLAY_URL; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); +const smartbannerFilePath = path.resolve(projectRoot, '../dist/smartbanner.html'); + +if ( + SMARTBANNER_APP_NAME && + SMARTBANNER_ORG_NAME && + SMARTBANNER_ICON_URL && + (SMARTBANNER_APPSTORE_URL || SMARTBANNER_GOOGLEPLAY_URL) +) { + try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + let smartbanner = await fs.readFile(smartbannerFilePath, 'utf-8'); + smartbanner = smartbanner + .replace('SMARTBANNER_APP_NAME', SMARTBANNER_APP_NAME) + .replace('SMARTBANNER_ORG_NAME', SMARTBANNER_ORG_NAME) + .replace('SMARTBANNER_ICON_URL', SMARTBANNER_ICON_URL) + .replace('SMARTBANNER_ICON_URL', SMARTBANNER_ICON_URL); + + /* hardcoded injection depending on whether the app is available on App Store and/or Google Play */ + + if (SMARTBANNER_APPSTORE_URL) { + smartbanner = `\t\n` + smartbanner; + } + if (SMARTBANNER_GOOGLEPLAY_URL) { + smartbanner = `\t\n` + smartbanner; + } + if (SMARTBANNER_APPSTORE_URL) { + if (SMARTBANNER_GOOGLEPLAY_URL) { + smartbanner = `\t\n` + smartbanner; + } else { + smartbanner = `\t\n` + smartbanner; + } + } else { + if (SMARTBANNER_GOOGLEPLAY_URL) { + smartbanner = `\t\n` + smartbanner; + } + } + + const injectedHtml = html.replace('', `${smartbanner}\n`); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('Smartbanner scripts successfully injected.'); + } catch (err) { + console.error('Error injecting Smartbanner scripts:', err); + } +} diff --git a/src/App.tsx b/src/App.tsx index 23d1a39..d1093e5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -16,7 +16,7 @@ import { } from '@/hooks'; import { DydxProvider } from '@/hooks/useDydxClient'; import { AccountsProvider } from '@/hooks/useAccounts'; -import { AppThemeProvider } from '@/hooks/useAppTheme'; +import { AppThemeAndColorModeProvider } from '@/hooks/useAppThemeAndColorMode'; import { DialogAreaProvider, useDialogArea } from '@/hooks/useDialogArea'; import { LocaleProvider } from '@/hooks/useLocaleSeparators'; import { NotificationsProvider } from '@/hooks/useNotifications'; @@ -52,9 +52,9 @@ const AlertsPage = lazy(() => import('@/pages/AlertsPage')); const ProfilePage = lazy(() => import('@/pages/Profile')); const SettingsPage = lazy(() => import('@/pages/settings/Settings')); const TradePage = lazy(() => import('@/pages/trade/Trade')); -const RewardsPage = lazy(() => import('@/pages/rewards/RewardsPage')); const TermsOfUsePage = lazy(() => import('@/pages/TermsOfUsePage')); const PrivacyPolicyPage = lazy(() => import('@/pages/PrivacyPolicyPage')); +const TokenPage = lazy(() => import('@/pages/token/Token')); const queryClient = new QueryClient(); @@ -87,7 +87,7 @@ const Content = () => { } /> } /> - } /> + } /> {isTablet && ( <> } /> @@ -142,7 +142,7 @@ const providers = [ wrapProvider(NotificationsProvider), wrapProvider(DialogAreaProvider), wrapProvider(PotentialMarketsProvider), - wrapProvider(AppThemeProvider), + wrapProvider(AppThemeAndColorModeProvider), ]; const App = () => { @@ -207,6 +207,7 @@ Styled.Content = styled.div<{ isShowingHeader: boolean; isShowingFooter: boolean Styled.Main = styled.main` ${layoutMixins.contentSectionAttached} + box-shadow: none; grid-area: Main; diff --git a/src/components/Accordion.tsx b/src/components/Accordion.tsx index a3b5dee..1bdad5c 100644 --- a/src/components/Accordion.tsx +++ b/src/components/Accordion.tsx @@ -85,7 +85,7 @@ Styled.Trigger = styled(Trigger)` &:hover { ${Styled.Icon} { color: var(--color-text-2); - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); } } diff --git a/src/components/AlertMessage.tsx b/src/components/AlertMessage.tsx index ba30b00..7fdc001 100644 --- a/src/components/AlertMessage.tsx +++ b/src/components/AlertMessage.tsx @@ -40,9 +40,6 @@ const AlertContainer = styled.div` case AlertType.Info: { return css` --alert-accent-color: var(--color-text-1); - - --alert-default-background-opacity: 0.133; // Relative - // --alert-background: var(--color-layer-6); // Absolute `; } case AlertType.Success: { diff --git a/src/components/AssetIcon.tsx b/src/components/AssetIcon.tsx index 9d30239..c7ac58b 100644 --- a/src/components/AssetIcon.tsx +++ b/src/components/AssetIcon.tsx @@ -8,6 +8,7 @@ const assetIcons = { '1INCH': '/currencies/1inch.png', AAVE: '/currencies/aave.png', ADA: '/currencies/ada.png', + AGIX: '/currencies/agix.png', ALGO: '/currencies/algo.png', APE: '/currencies/ape.png', APT: '/currencies/apt.png', @@ -16,34 +17,57 @@ const assetIcons = { AVAX: '/currencies/avax.png', BCH: '/currencies/bch.png', BLUR: '/currencies/blur.png', + BNB: '/currencies/bnb.png', BONK: '/currencies/bonk.png', BTC: '/currencies/btc.png', CELO: '/currencies/celo.png', + CHZ: '/currencies/chz.png', COMP: '/currencies/comp.png', CRV: '/currencies/crv.png', DAI: '/currencies/dai.png', DOGE: '/currencies/doge.png', DOT: '/currencies/dot.png', DYDX: '/currencies/dydx.png', + DYM: '/currencies/dym.png', ENJ: '/currencies/enj.png', + ENS: '/currencies/ens.png', EOS: '/currencies/eos.png', ETC: '/currencies/etc.png', ETH: '/currencies/eth.png', + FET: '/currencies/fet.png', FIL: '/currencies/fil.png', + FTM: '/currencies/ftm.png', + GALA: "/currencies/gala.png", + GMT: "/currencies/gmt.png", + GRT: "/currencies/grt.png", + HBAR: "/currencies/hbar.png", ICP: '/currencies/icp.png', + IMX: '/currencies/imx.png', + INJ: '/currencies/inj.png', + JTO: '/currencies/jto.png', + JUP: '/currencies/jup.png', + KAVA: '/currencies/kava.png', LDO: '/currencies/ldo.png', LINK: '/currencies/link.png', LTC: '/currencies/ltc.png', + MANA: '/currencies/mana.png', MATIC: '/currencies/matic.png', + MASK: '/currencies/mask.png', + MINA: '/currencies/mina.png', MKR: '/currencies/mkr.png', NEAR: '/currencies/near.png', + ORDI: "/currencies/ordi.png", OP: '/currencies/op.png', PEPE: '/currencies/pepe.png', + PYTH: '/currencies/pyth.png', + RNDR: '/currencies/rndr.png', RUNE: '/currencies/rune.png', + SAND: '/currencies/sand.png', SEI: '/currencies/sei.png', SHIB: '/currencies/shib.png', SNX: '/currencies/snx.png', SOL: '/currencies/sol.png', + STX: '/currencies/stx.png', SUI: '/currencies/sui.png', SUSHI: '/currencies/sushi.png', TIA: '/currencies/tia.png', @@ -54,6 +78,7 @@ const assetIcons = { USDT: '/currencies/usdt.png', WBTC: '/currencies/wbtc.png', WETH: '/currencies/weth.png', + WOO: '/currencies/woo.png', WLD: '/currencies/wld.png', XLM: '/currencies/xlm.png', XMR: '/currencies/xmr.png', @@ -61,6 +86,7 @@ const assetIcons = { XTZ: '/currencies/xtz.png', YFI: '/currencies/yfi.png', ZEC: '/currencies/zec.png', + ZETA: '/currencies/zeta.png', ZRX: '/currencies/zrx.png', } as const; diff --git a/src/components/BaseButton.tsx b/src/components/BaseButton.tsx index c8cf630..25b4247 100644 --- a/src/components/BaseButton.tsx +++ b/src/components/BaseButton.tsx @@ -134,8 +134,8 @@ const ButtonStyle = css` --button-textColor: var(--color-text-0); --button-backgroundColor: transparent; - --button-active-filter: brightness(0.9); - --button-hover-filter: brightness(1.1); + --button-active-filter: brightness(var(--active-filter)); + --button-hover-filter: brightness(var(--hover-filter-base)); --button-hover-textColor: var(--button-textColor); --button-radius: 0.5em; diff --git a/src/components/Button.tsx b/src/components/Button.tsx index dff6cdb..b86ae4c 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -89,9 +89,10 @@ const buttonActionVariants = { --button-border: solid var(--border-width) var(--color-border); `, [ButtonAction.Primary]: css` - --button-textColor: var(--color-text-2); + --button-textColor: var(--color-text-button); --button-backgroundColor: var(--color-accent); --button-border: solid var(--border-width) var(--color-border-white); + --button-hover-filter: brightness(var(--hover-filter-variant)); `, [ButtonAction.Secondary]: css` @@ -101,15 +102,17 @@ const buttonActionVariants = { `, [ButtonAction.Create]: css` - --button-textColor: var(--color-text-2); - --button-backgroundColor: var(--color-positive); + --button-textColor: var(--color-text-button); + --button-backgroundColor: var(--color-green); --button-border: solid var(--border-width) var(--color-border-white); + --button-hover-filter: brightness(var(--hover-filter-variant)); `, [ButtonAction.Destroy]: css` - --button-textColor: var(--color-text-2); - --button-backgroundColor: var(--color-negative); + --button-textColor: var(--color-text-button); + --button-backgroundColor: var(--color-red); --button-border: solid var(--border-width) var(--color-border-white); + --button-hover-filter: brightness(var(--hover-filter-variant)); `, [ButtonAction.Navigation]: css` @@ -119,9 +122,10 @@ const buttonActionVariants = { `, [ButtonAction.Reset]: css` - --button-textColor: var(--color-negative); + --button-textColor: var(--color-red); --button-backgroundColor: var(--color-layer-3); --button-border: solid var(--border-width) var(--color-border-red); + --button-hover-filter: brightness(var(--hover-filter-variant)); `, }; diff --git a/src/components/Checkbox.tsx b/src/components/Checkbox.tsx index 941aa2f..091ebf2 100644 --- a/src/components/Checkbox.tsx +++ b/src/components/Checkbox.tsx @@ -80,7 +80,7 @@ Styled.Indicator = styled(Indicator)` align-items: center; justify-content: center; - color: var(--color-text-2); + color: var(--color-text-button); `; Styled.Label = styled.label<{ disabled?: boolean }>` diff --git a/src/components/ComboboxMenu.tsx b/src/components/ComboboxMenu.tsx index e322047..92be2db 100644 --- a/src/components/ComboboxMenu.tsx +++ b/src/components/ComboboxMenu.tsx @@ -50,11 +50,11 @@ export const ComboboxMenu = { + filter={(value: string, search: string) => value.replace(/ /g, '').toLowerCase().includes(search.replace(/ /g, '').toLowerCase()) ? 1 - : 0; - }} + : 0 + } className={className} $withStickyLayout={withStickyLayout} > diff --git a/src/components/ContentSectionHeader.tsx b/src/components/ContentSectionHeader.tsx index 4582cf5..5f1e2db 100644 --- a/src/components/ContentSectionHeader.tsx +++ b/src/components/ContentSectionHeader.tsx @@ -6,6 +6,7 @@ import { layoutMixins } from '@/styles/layoutMixins'; type ElementProps = { title: string; subtitle?: React.ReactNode; + slotLeft?: React.ReactNode; slotRight?: React.ReactNode; }; @@ -16,14 +17,16 @@ type StyleProps = { export const ContentSectionHeader = ({ title, subtitle, + slotLeft, slotRight, className, }: ElementProps & StyleProps) => ( -
+ {slotLeft} + {title &&

{title}

} {subtitle &&

{subtitle}

} -
+ {slotRight}
); @@ -40,9 +43,15 @@ Styled.ContentSectionHeader = styled.header` padding: 1rem var(--header-horizontal-padding); - > div { - ${layoutMixins.column} + @media ${breakpoints.tablet} { + flex-wrap: wrap; + --header-horizontal-padding: 1.25rem; } +`; + +Styled.Header = styled.div` + ${layoutMixins.column} + flex: 1; h3 { color: var(--color-text-2); @@ -54,9 +63,4 @@ Styled.ContentSectionHeader = styled.header` font: var(--font-small-book); margin-top: 0.25rem; } - - @media ${breakpoints.tablet} { - flex-wrap: wrap; - --header-horizontal-padding: 1.25rem; - } `; diff --git a/src/components/CopyButton.tsx b/src/components/CopyButton.tsx index bff3368..f5babf1 100644 --- a/src/components/CopyButton.tsx +++ b/src/components/CopyButton.tsx @@ -77,7 +77,7 @@ Styled.InlineRow = styled.div<{ copied: boolean }>` ` : css` &:hover { - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); text-decoration: underline; } `} @@ -87,7 +87,7 @@ Styled.Icon = styled(Icon)<{ copied: boolean }>` ${({ copied }) => copied && css` - color: var(--color-positive); + color: var(--color-success); `} `; @@ -96,7 +96,7 @@ Styled.IconButton = styled(IconButton)<{ copied: boolean }>` copied && css` svg { - color: var(--color-positive); + color: var(--color-success); } `} `; diff --git a/src/components/Details.stories.tsx b/src/components/Details.stories.tsx index 58707b8..ed086fb 100644 --- a/src/components/Details.stories.tsx +++ b/src/components/Details.stories.tsx @@ -7,35 +7,50 @@ import { StoryWrapper } from '.ladle/components'; import styled, { type AnyStyledComponent } from 'styled-components'; import { layoutMixins } from '@/styles/layoutMixins'; -export const DetailsStory: Story> = () => ( +export const DetailsStory: Story[0]> = (args) => ( -
+
); +DetailsStory.args = { + items: [ + { + key: 'item-1', + label: 'Item 1', + tooltip: 'leverage', + value: 'Value 1', + }, + { + key: 'item-2', + label: 'Really really really long item name 2', + tooltip: 'liquidation-price', + value: 'Value 2', + }, + { + key: 'item-3', + label: 'Item 3', + tooltip: 'realized-pnl', + value: 'Value 3', + }, + ], + showSubitems: false, + isLoading: false, + withOverflow: false, + withSeparators: false, +}; + +DetailsStory.argTypes = { + justifyItems: { options: ['start', 'end'], control: { type: 'select' }, defaultValue: 'start' }, + layout: { + options: ['column', 'row', 'rowColumns', 'grid', 'stackColumn'], + control: { type: 'select' }, + defaultValue: 'column', + }, +}; + const Styled: Record = {}; Styled.Resizable = styled.section` diff --git a/src/components/Details.tsx b/src/components/Details.tsx index f530765..3a57293 100644 --- a/src/components/Details.tsx +++ b/src/components/Details.tsx @@ -133,6 +133,7 @@ const detailsLayoutVariants = { row: css` ${layoutMixins.row} align-self: stretch; + white-space: nowrap; `, rowColumns: css` @@ -159,12 +160,16 @@ const itemLayoutVariants: Record>> ${layoutMixins.spacedRow} gap: 0.5rem; + align-items: start; + padding: 0.5rem 0; min-height: var(--details-item-height); - > :last-child { - align-self: stretch; + > :first-child > abbr { + min-width: auto; + } + > :last-child { ${layoutMixins.row} ${layoutMixins.stickyRight} @@ -217,8 +222,6 @@ Styled.Details = styled.dl<{ --details-grid-numColumns: 2; ${({ layout }) => layout && detailsLayoutVariants[layout]} - - white-space: nowrap; `; Styled.Item = styled.div<{ @@ -231,7 +234,7 @@ Styled.Item = styled.div<{ ${({ justifyItems }) => justifyItems === 'end' && css` - &:nth-child(even) { + > :nth-child(even) { justify-items: end; text-align: end; } @@ -243,6 +246,7 @@ Styled.Item = styled.div<{ { column: css` &:not(:hover) > :first-child { + white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; } diff --git a/src/components/DetailsDialog.tsx b/src/components/DetailsDialog.tsx index 2a55833..87c186d 100644 --- a/src/components/DetailsDialog.tsx +++ b/src/components/DetailsDialog.tsx @@ -26,7 +26,7 @@ export const DetailsDialog = ({ slotIcon, title, items, slotFooter, setIsOpen }: placement={isTablet ? DialogPlacement.Default : DialogPlacement.Sidebar} > - + {slotFooter} diff --git a/src/components/DiffArrow.tsx b/src/components/DiffArrow.tsx index b140042..6007683 100644 --- a/src/components/DiffArrow.tsx +++ b/src/components/DiffArrow.tsx @@ -62,6 +62,6 @@ Styled.DiffArrowContainer = styled.span` `, down: css` transform: rotate(90deg); - ` + `, }[direction || 'right'])} `; diff --git a/src/components/DiffOutput.tsx b/src/components/DiffOutput.tsx index f6f52e4..665aacf 100644 --- a/src/components/DiffOutput.tsx +++ b/src/components/DiffOutput.tsx @@ -75,7 +75,7 @@ Styled.DiffValue = styled.div<{ hasInvalidNewValue?: boolean }>` ${({ hasInvalidNewValue }) => hasInvalidNewValue && css` - color: var(--color-negative); + color: var(--color-error); `} `; diff --git a/src/components/DropdownHeaderMenu.tsx b/src/components/DropdownHeaderMenu.tsx index f251cbf..cbc8b1d 100644 --- a/src/components/DropdownHeaderMenu.tsx +++ b/src/components/DropdownHeaderMenu.tsx @@ -35,8 +35,8 @@ export const DropdownHeaderMenu = ({
- {children} - + {children} +
@@ -87,7 +87,7 @@ Styled.Trigger = styled(Trigger)` outline: none; :hover { - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); } `; diff --git a/src/components/DropdownMenu.stories.tsx b/src/components/DropdownMenu.stories.tsx index bee3c62..abe57cf 100644 --- a/src/components/DropdownMenu.stories.tsx +++ b/src/components/DropdownMenu.stories.tsx @@ -4,38 +4,43 @@ import { DropdownMenu } from '@/components/DropdownMenu'; import { StoryWrapper } from '.ladle/components'; -export const DropdownMenuStory: Story> = (args) => { - const exampleItems = [ - { - value: '1', - label: 'Item 1', - onSelect: () => alert('Item 1 action'), - }, - { - value: '2', - label: 'Item 2', - onSelect: () => alert('Item 2 action'), - }, - { - value: '3', - label: 'Item 3', - onSelect: () => alert('Item 3 action'), - }, - ]; - +export const DropdownMenuStory: Story[0]> = (args) => { return ( - + Menu ); }; -DropdownMenuStory.args = {}; +DropdownMenuStory.args = { + items: [ + { + value: '0', + label: 'Item 0', + onSelect: () => alert('Item 0 action'), + }, + { + value: '1', + label: 'Item 1 (accent)', + onSelect: () => alert('Item 1 action'), + highlightColor: 'accent', + }, + { + value: '2', + label: 'Item 2 (create)', + onSelect: () => alert('Item 2 action'), + highlightColor: 'create', + }, + { + value: '3', + label: 'Item 3 (destroy)', + onSelect: () => alert('Item 3 action'), + highlightColor: 'destroy', + }, + ], +}; DropdownMenuStory.argTypes = { align: { diff --git a/src/components/DropdownMenu.tsx b/src/components/DropdownMenu.tsx index 6b74602..5d19be8 100644 --- a/src/components/DropdownMenu.tsx +++ b/src/components/DropdownMenu.tsx @@ -13,7 +13,7 @@ export type DropdownMenuItem = { label: React.ReactNode; onSelect?: () => void; separator?: boolean; - highlightColor?: 'accent' | 'positive' | 'negative'; + highlightColor?: 'accent' | 'create' | 'destroy'; }; type StyleProps = { @@ -82,7 +82,7 @@ Styled.Separator = styled(Separator)` margin: 0.25rem 1rem; `; -Styled.Item = styled(Item)<{ $highlightColor: 'accent' | 'positive' | 'negative' }>` +Styled.Item = styled(Item)<{ $highlightColor: 'accent' | 'create' | 'destroy' }>` ${popoverMixins.item} --item-font-size: var(--dropdownMenu-item-font-size); ${({ $highlightColor }) => @@ -90,11 +90,11 @@ Styled.Item = styled(Item)<{ $highlightColor: 'accent' | 'positive' | 'negative' ['accent']: ` --item-highlighted-textColor: var(--color-accent); `, - ['positive']: ` - --item-highlighted-textColor: var(--color-positive); + ['create']: ` + --item-highlighted-textColor: var(--color-green); `, - ['negative']: ` - --item-highlighted-textColor: var(--color-negative); + ['destroy']: ` + --item-highlighted-textColor: var(--color-red); `, }[$highlightColor])} diff --git a/src/components/DropdownSelectMenu.stories.tsx b/src/components/DropdownSelectMenu.stories.tsx index 9108562..2262d10 100644 --- a/src/components/DropdownSelectMenu.stories.tsx +++ b/src/components/DropdownSelectMenu.stories.tsx @@ -28,21 +28,22 @@ const exampleItems = [ }, ]; -export const DropdownSelectMenuStory: Story> = (args) => { +export const DropdownSelectMenuStory: Story< + Pick[0], 'items' | 'align' | 'sideOffset' | 'disabled'> +> = (args) => { const [item, setItem] = useState(exampleItems[0].value); return ( - setItem(value)} - {...args} - /> + setItem(value)} {...args} /> ); }; -DropdownSelectMenuStory.args = {}; +DropdownSelectMenuStory.args = { + items: exampleItems, + sideOffset: 1, + disabled: false, +}; DropdownSelectMenuStory.argTypes = { align: { diff --git a/src/components/Icon.stories.tsx b/src/components/Icon.stories.tsx index 808ef50..e0e1392 100644 --- a/src/components/Icon.stories.tsx +++ b/src/components/Icon.stories.tsx @@ -4,7 +4,7 @@ import { Icon, IconName } from '@/components/Icon'; import { StoryWrapper } from '.ladle/components'; -export const IconStory: Story> = (args) => { +export const IconStory: Story[0]> = (args) => { return ( diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index 045bb5a..81427ad 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -13,6 +13,7 @@ import { CaretIcon, CautionCircleStrokeIcon, CautionCircleIcon, + ChaosLabsIcon, ChatIcon, CheckIcon, CheckCircleIcon, @@ -24,6 +25,7 @@ import { CoinsIcon, CommentIcon, CopyIcon, + CurrencySignIcon, DepositIcon, DepthChartIcon, DiscordIcon, @@ -34,6 +36,7 @@ import { FundingChartIcon, GearIcon, GiftboxIcon, + GovernanceIcon, HelpCircleIcon, HideIcon, HistoryIcon, @@ -69,6 +72,7 @@ import { StarIcon, SunIcon, TerminalIcon, + TokenIcon, TradeIcon, TransferIcon, TriangleIcon, @@ -90,6 +94,7 @@ export enum IconName { Caret = 'Caret', CautionCircle = 'CautionCircle', CautionCircleStroked = 'CautionCircleStroked', + ChaosLabs = 'ChaosLabs', Chat = 'Chat', Check = 'Check', CheckCircle = 'CheckCircle', @@ -101,6 +106,7 @@ export enum IconName { Coins = 'Coins', Comment = 'Comment', Copy = 'Copy', + CurrencySign = 'CurrencySign', Deposit = 'Deposit', DepthChart = 'DepthChart', Discord = 'Discord', @@ -111,6 +117,7 @@ export enum IconName { FundingChart = 'FundingChart', Gear = 'Gear', Giftbox = 'Giftbox', + Governance = 'Governance', HelpCircle = 'HelpCircle', Hide = 'Hide', History = 'History', @@ -147,6 +154,7 @@ export enum IconName { Sun = 'Sun', Terminal = 'Terminal', TogglesMenu = 'TogglesMenu', + Token = 'Token', Trade = 'Trade', Transfer = 'Transfer', Triangle = 'Triangle', @@ -168,6 +176,7 @@ const icons = { [IconName.Caret]: CaretIcon, [IconName.CautionCircle]: CautionCircleIcon, [IconName.CautionCircleStroked]: CautionCircleStrokeIcon, + [IconName.ChaosLabs]: ChaosLabsIcon, [IconName.Chat]: ChatIcon, [IconName.Check]: CheckIcon, [IconName.CheckCircle]: CheckCircleIcon, @@ -179,6 +188,7 @@ const icons = { [IconName.Coins]: CoinsIcon, [IconName.Comment]: CommentIcon, [IconName.Copy]: CopyIcon, + [IconName.CurrencySign]: CurrencySignIcon, [IconName.Deposit]: DepositIcon, [IconName.DepthChart]: DepthChartIcon, [IconName.Discord]: DiscordIcon, @@ -189,6 +199,7 @@ const icons = { [IconName.FundingChart]: FundingChartIcon, [IconName.Gear]: GearIcon, [IconName.Giftbox]: GiftboxIcon, + [IconName.Governance]: GovernanceIcon, [IconName.HelpCircle]: HelpCircleIcon, [IconName.Hide]: HideIcon, [IconName.History]: HistoryIcon, @@ -224,6 +235,7 @@ const icons = { [IconName.Sun]: SunIcon, [IconName.Terminal]: TerminalIcon, [IconName.TogglesMenu]: TogglesMenuIcon, + [IconName.Token]: TokenIcon, [IconName.Trade]: TradeIcon, [IconName.Transfer]: TransferIcon, [IconName.Triangle]: TriangleIcon, diff --git a/src/components/Link.stories.tsx b/src/components/Link.stories.tsx index 46721c6..2042b51 100644 --- a/src/components/Link.stories.tsx +++ b/src/components/Link.stories.tsx @@ -6,7 +6,7 @@ import { Link } from '@/components/Link'; import { StoryWrapper } from '.ladle/components'; import { layoutMixins } from '@/styles/layoutMixins'; -export const LinkStory: Story> = (args) => { +export const LinkStory: Story[0]> = (args) => { return ( diff --git a/src/components/NavigationMenu.stories.tsx b/src/components/NavigationMenu.stories.tsx index 290b0fa..10929f8 100644 --- a/src/components/NavigationMenu.stories.tsx +++ b/src/components/NavigationMenu.stories.tsx @@ -5,8 +5,24 @@ import { HashRouter } from 'react-router-dom'; import { StoryWrapper } from '.ladle/components'; -export const NavigationMenuStory: Story> = (args) => { - const exampleItems = [ +export const NavigationMenuStory: Story< + Pick[0], 'items' | 'orientation' | 'submenuPlacement'> +> = (args) => { + return ( + + + Menu + + } + /> + + ); +}; + +NavigationMenuStory.args = { + items: [ { group: 'navigation', groupLabel: 'Views', @@ -93,23 +109,9 @@ export const NavigationMenuStory: Story> = (ar }, ], }, - ]; - - return ( - - - Menu - - } - /> - - ); + ], }; -NavigationMenuStory.args = {}; - NavigationMenuStory.argTypes = { orientation: { options: ['vertical', 'horizontal'], diff --git a/src/components/Output.tsx b/src/components/Output.tsx index 8df09d2..ec55d8f 100644 --- a/src/components/Output.tsx +++ b/src/components/Output.tsx @@ -65,6 +65,9 @@ type ElementProps = { resolution?: number; stripRelativeWords?: boolean; }; + timeOptions?: { + useUTC?: boolean; + }; tag?: React.ReactNode; withParentheses?: boolean; locale?: string; @@ -89,6 +92,7 @@ export const Output = ({ relativeTimeFormatOptions = { format: 'singleCharacter', }, + timeOptions, tag, withParentheses, locale = navigator.language || 'en-US', @@ -166,16 +170,21 @@ export const Output = ({ if ((typeof value !== 'string' && typeof value !== 'number') || !value) return null; const date = new Date(value); const dateString = { - [OutputType.Date]: date.toLocaleString(selectedLocale, { dateStyle: 'medium' }), + [OutputType.Date]: date.toLocaleString(selectedLocale, { + dateStyle: 'medium', + timeZone: timeOptions?.useUTC ? 'UTC' : undefined, + }), [OutputType.DateTime]: date.toLocaleString(selectedLocale, { dateStyle: 'short', timeStyle: 'short', + timeZone: timeOptions?.useUTC ? 'UTC' : undefined, }), [OutputType.Time]: date.toLocaleString(selectedLocale, { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit', + timeZone: timeOptions?.useUTC ? 'UTC' : undefined, }), }[type]; diff --git a/src/components/Panel.stories.tsx b/src/components/Panel.stories.tsx index ecdb993..1ef7d85 100644 --- a/src/components/Panel.stories.tsx +++ b/src/components/Panel.stories.tsx @@ -1,10 +1,10 @@ import type { Story } from '@ladle/react'; -import { Panel } from '@/components/Panel'; +import { Panel, PanelProps } from '@/components/Panel'; import { StoryWrapper } from '.ladle/components'; -export const PanelStory: Story<{ slotHeader: React.ReactNode, children?: React.ReactNode }> = (args) => { +export const PanelStory: Story = (args) => { return ( @@ -13,6 +13,8 @@ export const PanelStory: Story<{ slotHeader: React.ReactNode, children?: React.R }; PanelStory.args = { - slotHeader: 'Header', + slotHeaderContent: 'Header', children: 'Content', + slotRight: '1️⃣', + hasSeparator: true, }; diff --git a/src/components/Panel.tsx b/src/components/Panel.tsx index cebd1d7..1ea335f 100644 --- a/src/components/Panel.tsx +++ b/src/components/Panel.tsx @@ -6,7 +6,7 @@ import { Icon, IconName } from '@/components/Icon'; import { layoutMixins } from '@/styles/layoutMixins'; import { breakpoints } from '@/styles'; -type PanelProps = { +type ElementProps = { slotHeaderContent?: React.ReactNode; slotHeader?: React.ReactNode; slotRight?: React.ReactNode; @@ -16,11 +16,13 @@ type PanelProps = { onClick?: () => void; }; -type PanelStyleProps = { +type StyleProps = { className?: string; hasSeparator?: boolean; }; +export type PanelProps = ElementProps & StyleProps; + export const Panel = ({ slotHeaderContent, slotHeader, @@ -31,7 +33,7 @@ export const Panel = ({ onClick, hasSeparator, className, -}: PanelProps & PanelStyleProps) => ( +}: PanelProps) => ( {href ? ( diff --git a/src/components/SearchInput.stories.tsx b/src/components/SearchInput.stories.tsx index 8a8258e..67f06e7 100644 --- a/src/components/SearchInput.stories.tsx +++ b/src/components/SearchInput.stories.tsx @@ -7,7 +7,7 @@ import { StoryWrapper } from '.ladle/components'; import { layoutMixins } from '@/styles/layoutMixins'; import { InputType } from './Input'; -export const SearchInputStory: Story> = (args) => ( +export const SearchInputStory: Story[0]> = (args) => ( diff --git a/src/components/SearchSelectMenu.stories.tsx b/src/components/SearchSelectMenu.stories.tsx index 16a81d7..97ab8c7 100644 --- a/src/components/SearchSelectMenu.stories.tsx +++ b/src/components/SearchSelectMenu.stories.tsx @@ -6,7 +6,7 @@ import { SearchSelectMenu } from '@/components/SearchSelectMenu'; import { StoryWrapper } from '.ladle/components'; -export const SearchSelectMenuStory: Story> = (args) => { +export const SearchSelectMenuStory: Story[0]> = (args) => { const [selectedItem, setSelectedItem] = useState(); const exampleItems = [ @@ -24,10 +24,7 @@ export const SearchSelectMenuStory: Story> = return ( - + {!selectedItem ? Search and Select : {selectedItem}} diff --git a/src/components/SelectMenu.stories.tsx b/src/components/SelectMenu.stories.tsx index d6d50a7..168b9e8 100644 --- a/src/components/SelectMenu.stories.tsx +++ b/src/components/SelectMenu.stories.tsx @@ -26,7 +26,7 @@ const exampleItems: { value: string; label: string }[] = [ }, ]; -export const SelectMenuStory: Story> = (args) => { +export const SelectMenuStory: Story[0]> = (args) => { const [value, setValue] = useState(exampleItems[0].value); const [value2, setValue2] = useState(exampleItems[2].value); diff --git a/src/components/Switch.tsx b/src/components/Switch.tsx index cc8b149..103f933 100644 --- a/src/components/Switch.tsx +++ b/src/components/Switch.tsx @@ -47,7 +47,7 @@ Styled.Root = styled(Root)` --switch-thumb-backgroundColor: var(--color-layer-6); --switch-active-backgroundColor: var(--color-accent); - --switch-active-thumb-backgroundColor: ${({ theme }) => theme.switchThumbActiveBackground}; + --switch-active-thumb-backgroundColor: var(--color-white); position: relative; width: var(--switch-width); diff --git a/src/components/Table.tsx b/src/components/Table.tsx index e049f36..d9dc80a 100644 --- a/src/components/Table.tsx +++ b/src/components/Table.tsx @@ -68,7 +68,7 @@ export type TableItem = { onSelect?: (key: TableRowData) => void; }; -type ColumnDef = { +export type ColumnDef = { columnKey: string; label: React.ReactNode; tag?: React.ReactNode; @@ -95,7 +95,10 @@ export type ElementProps void; slotEmpty?: React.ReactNode; - initialNumRowsToShow?: number; + viewMoreConfig?: { + initialNumRowsToShow: number; + numRowsPerPage?: number; + }; // collection: TableCollection; // children: React.ReactNode; }; @@ -125,7 +128,7 @@ export const Table = ({ selectionMode = 'single', selectionBehavior = 'toggle', slotEmpty, - initialNumRowsToShow, + viewMoreConfig, // shouldRowRender, // collection, @@ -141,8 +144,18 @@ export const Table = ({ style, }: ElementProps & StyleProps) => { const [selectedKeys, setSelectedKeys] = useState(new Set()); - const [numRowsToShow, setNumRowsToShow] = useState(initialNumRowsToShow); - const enableViewMore = numRowsToShow !== undefined; + const [numRowsToShow, setNumRowsToShow] = useState(viewMoreConfig?.initialNumRowsToShow); + const enableViewMore = viewMoreConfig !== undefined; + + const onViewMoreClick = () => { + if (!viewMoreConfig) return; + const { numRowsPerPage } = viewMoreConfig; + if (numRowsPerPage) { + setNumRowsToShow((prev) => (prev ?? 0) + numRowsPerPage); + } else { + setNumRowsToShow(data.length); + } + }; const currentBreakpoints = useBreakpoints(); const shownColumns = columns.filter( @@ -218,9 +231,7 @@ export const Table = ({ } numColumns={shownColumns.length} onViewMoreClick={ - enableViewMore && numRowsToShow < data.length - ? () => setNumRowsToShow(data.length) - : undefined + enableViewMore && numRowsToShow! < data.length ? onViewMoreClick : undefined } // shouldRowRender={shouldRowRender} hideHeader={hideHeader} @@ -513,7 +524,7 @@ const TableColumnHeader = ({ export const ViewMoreRow = ({ colSpan, onClick }: { colSpan: number; onClick: () => void }) => { const stringGetter = useStringGetter(); return ( - + e.preventDefault()} @@ -523,7 +534,7 @@ export const ViewMoreRow = ({ colSpan, onClick }: { colSpan: number; onClick: () {stringGetter({ key: STRING_KEYS.VIEW_MORE })} - + ); }; @@ -673,6 +684,8 @@ Styled.TableWrapper = styled.div<{ --table-lastColumn-cell-align: end; // start | center | end | var(--table-cell-align) --tableCell-padding: 0 1rem; + --tableViewMore-borderColor: inherit; + // Rules flex: 1; @@ -782,7 +795,7 @@ Styled.Tr = styled.tr<{ &:focus-visible, &:focus-within { --tableRow-currentBackgroundColor: var(--tableRow-hover-backgroundColor); - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); } `}; @@ -984,3 +997,7 @@ Styled.ViewMoreButton = styled(Button)` margin-left: 0.5ch; } `; + +Styled.ViewMoreTr = styled(Styled.Tr)` + --border-color: var(--tableViewMore-borderColor); +`; diff --git a/src/components/Tabs.stories.tsx b/src/components/Tabs.stories.tsx index 6adb027..68fcf56 100644 --- a/src/components/Tabs.stories.tsx +++ b/src/components/Tabs.stories.tsx @@ -13,29 +13,11 @@ enum TabItem { Item3 = 'Item3', } -const TabItems = [ - { - value: TabItem.Item1, - label: 'Item 1', - content:
Item 1 Content
, - }, - { - value: TabItem.Item2, - label: 'Item 2', - content:
Item 2 Content
, - }, - { - value: TabItem.Item3, - label: 'Item 3', - content:
Item 3 Content
, - }, -]; - -export const TabsStory: Story> = (args) => { +export const TabsStory: Story[0]> = (args) => { return ( - + ); @@ -43,6 +25,23 @@ export const TabsStory: Story> = (args) => { TabsStory.args = { fullWidthTabs: false, + items: [ + { + value: TabItem.Item1, + label: 'Item 1', + content:
Item 1 Content
, + }, + { + value: TabItem.Item2, + label: 'Item 2', + content:
Item 2 Content
, + }, + { + value: TabItem.Item3, + label: 'Item 3', + content:
Item 3 Content
, + }, + ], }; TabsStory.argTypes = { diff --git a/src/components/Tag.stories.tsx b/src/components/Tag.stories.tsx index b83d740..a399da0 100644 --- a/src/components/Tag.stories.tsx +++ b/src/components/Tag.stories.tsx @@ -1,10 +1,10 @@ import type { Story } from '@ladle/react'; -import { Tag } from '@/components/Tag'; +import { Tag, TagSign, TagSize, TagType } from '@/components/Tag'; import { StoryWrapper } from '.ladle/components'; -export const TagStory: Story> = (args) => { +export const TagStory: Story[0]> = (args) => { return ( @@ -14,4 +14,28 @@ export const TagStory: Story> = (args) => { TagStory.args = { children: 'USDC', + isHighlighted: false, +}; + +TagStory.argTypes = { + size: { + options: Object.values(TagSize), + control: { type: 'select' }, + defaultValue: TagSize.Small, + }, + type: { + options: [...Object.values(TagType), undefined], + control: { type: 'select' }, + defaultValue: undefined, + }, + sign: { + options: [...Object.values(TagSign), undefined], + control: { type: 'select' }, + defaultValue: undefined, + }, + isHighlighted: { + options: [true, false], + control: { type: 'select' }, + defaultValue: false, + }, }; diff --git a/src/components/Tag.tsx b/src/components/Tag.tsx index 28ad37f..76a9246 100644 --- a/src/components/Tag.tsx +++ b/src/components/Tag.tsx @@ -1,20 +1,20 @@ import styled, { css } from 'styled-components'; export enum TagSize { - Small, - Medium, + Small = 'Small', + Medium = 'Medium', } export enum TagType { - Asset, - Side, - Number, + Asset = 'Asset', + Side = 'Side', + Number = 'Number', } export enum TagSign { - Positive, - Negative, - Neutral, + Positive = 'Positive', + Negative = 'Negative', + Neutral = 'Neutral', } type StyleProps = { @@ -76,5 +76,6 @@ export const Tag = styled.span` isHighlighted && css` background-color: var(--color-accent); + color: var(--color-text-button); `} `; diff --git a/src/components/ToggleButton.stories.tsx b/src/components/ToggleButton.stories.tsx index dd96fcc..339b3d1 100644 --- a/src/components/ToggleButton.stories.tsx +++ b/src/components/ToggleButton.stories.tsx @@ -5,7 +5,7 @@ import { ButtonShape, ButtonSize } from '@/constants/buttons'; import { StoryWrapper } from '.ladle/components'; import { ToggleButton } from './ToggleButton'; -export const ToggleButtonStory: Story> = (args) => ( +export const ToggleButtonStory: Story[0]> = (args) => ( Toggle me diff --git a/src/components/ToggleGroup.stories.tsx b/src/components/ToggleGroup.stories.tsx index 2e556cf..71ab558 100644 --- a/src/components/ToggleGroup.stories.tsx +++ b/src/components/ToggleGroup.stories.tsx @@ -21,16 +21,22 @@ const ToggleGroupItems = [ }, ]; -export const ToggleGroupStory: Story> = (args) => { +export const ToggleGroupStory: Story< + Pick[0], 'items' | 'size' | 'shape'> +> = (args) => { const [value, setValue] = useState('0'); return ( - + ); }; +ToggleGroupStory.args = { + items: ToggleGroupItems, +}; + ToggleGroupStory.argTypes = { size: { options: Object.values(ButtonSize), diff --git a/src/components/WithConfirmationPopover.tsx b/src/components/WithConfirmationPopover.tsx index f2aabcc..eaae610 100644 --- a/src/components/WithConfirmationPopover.tsx +++ b/src/components/WithConfirmationPopover.tsx @@ -117,7 +117,7 @@ Styled.ConfirmButton = styled(Styled.IconButton)` --button-backgroundColor: hsla(203, 25%, 19%, 1); svg { - color: var(--color-positive); + color: var(--color-green); } `; @@ -125,7 +125,7 @@ Styled.CancelButton = styled(Styled.IconButton)` --button-backgroundColor: hsla(296, 16%, 18%, 1); svg { - color: var(--color-negative); + color: var(--color-red); width: 0.8em; height: 0.8em; diff --git a/src/components/WithLabel.stories.tsx b/src/components/WithLabel.stories.tsx index fc8fa84..9e819bf 100644 --- a/src/components/WithLabel.stories.tsx +++ b/src/components/WithLabel.stories.tsx @@ -9,7 +9,7 @@ import { StoryWrapper } from '.ladle/components'; import styled, { type AnyStyledComponent } from 'styled-components'; import { layoutMixins } from '@/styles/layoutMixins'; -export const WithLabelStory: Story> = (args) => { +export const WithLabelStory: Story[0]> = (args) => { const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); diff --git a/src/components/WithReceipt.stories.tsx b/src/components/WithReceipt.stories.tsx index a14589a..e38f7c8 100644 --- a/src/components/WithReceipt.stories.tsx +++ b/src/components/WithReceipt.stories.tsx @@ -3,32 +3,29 @@ import type { Story } from '@ladle/react'; import { Button } from '@/components/Button'; import { WithReceipt } from '@/components/WithReceipt'; -import { type DetailsItem } from './Details'; import { StoryWrapper } from '.ladle/components'; -const items: DetailsItem[] = [ - { - key: 'item-1', - label: 'Item 1', - value: 'Value 1', - }, - { - key: 'item-2', - label: 'Item 2', - value: 'Value 2', - }, - { - key: 'item-3', - label: 'Item 3', - value: 'Value 3', - }, -]; - -export const WithReceiptStory: Story> = (args) => ( +export const WithReceiptStory: Story[0], 'slotReceipt'>> = ( + args +) => (
- + + Receipt Content +
+ } + {...args} + > @@ -36,7 +33,7 @@ export const WithReceiptStory: Story> = (args) => ( ); WithReceiptStory.args = { - items, + hideReceipt: false, }; WithReceiptStory.argTypes = { diff --git a/src/components/WithSidebar.tsx b/src/components/WithSidebar.tsx index 4e4c79a..676c634 100644 --- a/src/components/WithSidebar.tsx +++ b/src/components/WithSidebar.tsx @@ -106,8 +106,6 @@ Styled.Container = styled.div` --stickyArea1-leftGap: var(--border-width); min-height: var(--stickyArea-height); - ${layoutMixins.withOuterAndInnerBorders} - display: grid; grid-template: var(--withSidebar-gridTemplate); `; @@ -120,6 +118,7 @@ Styled.Side = styled.aside` ${layoutMixins.sticky} max-height: var(--stickyArea-height); backdrop-filter: none; + background-color: var(--color-layer-2); ${layoutMixins.stack} `; diff --git a/src/components/WithTooltip.stories.tsx b/src/components/WithTooltip.stories.tsx index 93bd2b3..5058d2c 100644 --- a/src/components/WithTooltip.stories.tsx +++ b/src/components/WithTooltip.stories.tsx @@ -6,7 +6,7 @@ import { tooltipStrings } from '@/constants/tooltips'; import { StoryWrapper } from '.ladle/components'; -export const Tooltip: Story> = (args) => { +export const Tooltip: Story[0]> = (args) => { return ( diff --git a/src/constants/abacus.ts b/src/constants/abacus.ts index 1cdbfcc..ac44cf3 100644 --- a/src/constants/abacus.ts +++ b/src/constants/abacus.ts @@ -119,6 +119,13 @@ export const InputSelectionOption = Abacus.exchange.dydx.abacus.output.input.Sel // ------ Wallet ------ // export type Wallet = Abacus.exchange.dydx.abacus.output.Wallet; export type AccountBalance = Abacus.exchange.dydx.abacus.output.AccountBalance; +export type TradingRewards = Abacus.exchange.dydx.abacus.output.TradingRewards; +export type HistoricalTradingReward = Abacus.exchange.dydx.abacus.output.HistoricalTradingReward; +export const HistoricalTradingRewardsPeriod = + Abacus.exchange.dydx.abacus.state.manager.HistoricalTradingRewardsPeriod; +const historicalTradingRewardsPeriod = [...HistoricalTradingRewardsPeriod.values()] as const; +export type HistoricalTradingRewardsPeriods = (typeof historicalTradingRewardsPeriod)[number]; + export type Subaccount = Abacus.exchange.dydx.abacus.output.Subaccount; export type SubaccountPosition = Abacus.exchange.dydx.abacus.output.SubaccountPosition; export type SubaccountOrder = Abacus.exchange.dydx.abacus.output.SubaccountOrder; @@ -202,6 +209,9 @@ export const RestrictionType = Abacus.exchange.dydx.abacus.output.Restriction; const restrictionTypes = [...RestrictionType.values()] as const; export type RestrictionTypes = (typeof restrictionTypes)[number]; +// ------ Api data ------ // +export const ApiData = Abacus.exchange.dydx.abacus.state.manager.ApiData; + // ------ Enum Conversions ------ // type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 ? A @@ -236,6 +246,15 @@ export const HISTORICAL_PNL_PERIODS: Record< [HistoricalPnlPeriod.Period90d.name]: HistoricalPnlPeriod.Period90d, }; +export const HISTORICAL_TRADING_REWARDS_PERIODS: Record< + KotlinIrEnumValues, + HistoricalTradingRewardsPeriods +> = { + [HistoricalTradingRewardsPeriod.MONTHLY.name]: HistoricalTradingRewardsPeriod.MONTHLY, + [HistoricalTradingRewardsPeriod.WEEKLY.name]: HistoricalTradingRewardsPeriod.WEEKLY, + [HistoricalTradingRewardsPeriod.DAILY.name]: HistoricalTradingRewardsPeriod.DAILY, +}; + export const ORDER_STATUS_STRINGS: Record, string> = { [AbacusOrderStatus.open.name]: STRING_KEYS.OPEN_STATUS, [AbacusOrderStatus.open.rawValue]: STRING_KEYS.OPEN_STATUS, diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts index 49598a3..5fefc73 100644 --- a/src/constants/analytics.ts +++ b/src/constants/analytics.ts @@ -173,3 +173,5 @@ export type AnalyticsEventData = validatorUrl: string; } : never; + +export const DEFAULT_TRANSACTION_MEMO = 'dYdX Frontend (web)'; diff --git a/src/constants/dialogs.ts b/src/constants/dialogs.ts index e5cf8fd..6ed34ec 100644 --- a/src/constants/dialogs.ts +++ b/src/constants/dialogs.ts @@ -2,8 +2,10 @@ export enum DialogTypes { ClosePosition = 'ClosePosition', Deposit = 'Deposit', DisconnectWallet = 'DisconnectWallet', + DisplaySettings = 'DisplaySettings', ExchangeOffline = 'ExchangeOffline', ExternalLink = 'ExternalLink', + ExternalNavStride = 'ExternalNavStride', FillDetails = 'FillDetails', Help = 'Help', ExternalNavKeplr = 'ExternalNavKeplr', diff --git a/src/constants/localStorage.ts b/src/constants/localStorage.ts index 863f24e..5ac32cb 100644 --- a/src/constants/localStorage.ts +++ b/src/constants/localStorage.ts @@ -20,6 +20,7 @@ export enum LocalStorageKey { SelectedLocale = 'dydx.SelectedLocale', SelectedNetwork = 'dydx.SelectedNetwork', SelectedTheme = 'dydx.SelectedTheme', + SelectedColorMode = 'dydx.SelectedColorMode', SelectedTradeLayout = 'dydx.SelectedTradeLayout', TradingViewChartConfig = 'dydx.TradingViewChartConfig', HasSeenLaunchIncentives = 'dydx.HasSeenLaunchIncentives', diff --git a/src/constants/localization.ts b/src/constants/localization.ts index 5ff02b2..3c77561 100644 --- a/src/constants/localization.ts +++ b/src/constants/localization.ts @@ -95,7 +95,7 @@ export type TooltipStrings = { stringParams?: any; urlConfigs?: LinksConfigs; }) => { - title: string; + title?: string; body: string; learnMoreLink?: string; }; diff --git a/src/constants/networks.ts b/src/constants/networks.ts index 8bfe05e..b659440 100644 --- a/src/constants/networks.ts +++ b/src/constants/networks.ts @@ -1,4 +1,4 @@ -import environments from '../../public/configs/env.json'; +import environments from '../../public/configs/v1/env.json'; const CURRENT_MODE = ({ production: 'MAINNET', @@ -14,5 +14,10 @@ export const isDev = CURRENT_MODE === 'DEV'; export const AVAILABLE_ENVIRONMENTS = environments.deployments[CURRENT_MODE]; export const CURRENT_ABACUS_DEPLOYMENT = CURRENT_MODE; export const ENVIRONMENT_CONFIG_MAP = environments.environments; +export const TOKEN_CONFIG_MAP = environments.tokens; +export const LINKS_CONFIG_MAP = environments.links; +export const WALLETS_CONFIG_MAP = environments.wallets; +export const GOVERNANCE_CONFIG_MAP = environments.governance; export type DydxNetwork = keyof typeof ENVIRONMENT_CONFIG_MAP; +export type DydxChainId = keyof typeof TOKEN_CONFIG_MAP; export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork; diff --git a/src/constants/numbers.ts b/src/constants/numbers.ts index e515d83..dc6914d 100644 --- a/src/constants/numbers.ts +++ b/src/constants/numbers.ts @@ -22,4 +22,5 @@ export enum NumberSign { // Deposit/Withdraw export const MAX_CCTP_TRANSFER_AMOUNT = 1_000_000; +export const MIN_CCTP_TRANSFER_AMOUNT = 10; export const MAX_PRICE_IMPACT = 0.02; // 2% diff --git a/src/constants/potentialMarkets.ts b/src/constants/potentialMarkets.ts index da2707d..e2292c3 100644 --- a/src/constants/potentialMarkets.ts +++ b/src/constants/potentialMarkets.ts @@ -1,42 +1,9 @@ -export type ExchangeConfigParsedCsv = Array<{ - base_asset: string; - exchange: string; - pair: string; - - adjust_by_market: string; - min_2_depth: string; - avg_30d_vol: string; - reference_price: string; - risk_assessment: string; - num_oracles: string; - liquidity_tier: string; - asset_name: string; -}>; - export type ExchangeConfigItem = { exchangeName: string; ticker: string; adjustByMarket?: string; }; -export type PotentialMarketParsedCsv = Array<{ - base_asset: string; - reference_price: string; - num_oracles: string; - liquidity_tier: string; - asset_name: string; - p: string; - atomic_resolution: string; - min_exchanges: string; - min_price_change_ppm: string; - price_exponent: string; - step_base_quantum: string; - ticksize_exponent: string; - subticks_per_tick: string; - min_order_size: string; - quantum_conversion_exponent: string; -}>; - export type PotentialMarketItem = { baseAsset: string; referencePrice: string; @@ -56,30 +23,3 @@ export type PotentialMarketItem = { }; export const NUM_ORACLES_TO_QUALIFY_AS_SAFE = 6; - -export const LIQUIDITY_TIERS = { - 0: { - label: 'Large-cap', - initialMarginFraction: 0.05, - maintenanceMarginFraction: 0.03, - impactNotional: 10_000, - }, - 1: { - label: 'Mid-cap', - initialMarginFraction: 0.1, - maintenanceMarginFraction: 0.05, - impactNotional: 5_000, - }, - 2: { - label: 'Long-tail', - initialMarginFraction: 0.2, - maintenanceMarginFraction: 0.1, - impactNotional: 2_500, - }, - 3: { - label: 'Safety', - initialMarginFraction: 1, - maintenanceMarginFraction: 0.2, - impactNotional: 2_500, - }, -}; diff --git a/src/constants/routes.ts b/src/constants/routes.ts index c82510f..16d7787 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -29,6 +29,12 @@ export enum HistoryRoute { Payments = 'payments', } +export enum TokenRoute { + TradingRewards = 'trading-rewards', + StakingRewards = 'staking-rewards', + Governance = 'governance', +} + export enum MobileSettingsRoute { Language = 'language', Notifications = 'notifications', diff --git a/src/constants/styles/base.ts b/src/constants/styles/base.ts index 8251ffa..51ea825 100644 --- a/src/constants/styles/base.ts +++ b/src/constants/styles/base.ts @@ -68,3 +68,9 @@ export enum OpacityToken { Opacity66 = 'A8', Opacity90 = 'E6', } + +export enum BrightnessFilterToken { + Darken10 = '0.9', + Darken5 = '0.95', + Lighten10 = '1.1', +} diff --git a/src/constants/styles/colors.ts b/src/constants/styles/colors.ts index a7c9eb1..7075c17 100644 --- a/src/constants/styles/colors.ts +++ b/src/constants/styles/colors.ts @@ -1,4 +1,20 @@ -export type ThemeColors = LayerColors & +import type { ThemeName } from 'public/tradingview/charting_library'; + +import { AppColorMode, AppTheme } from '@/state/configs'; + +export const THEME_NAMES: Record = { + [AppTheme.Classic]: 'Classic', + [AppTheme.Dark]: 'Dark', + [AppTheme.Light]: 'Light', +}; + +export type Theme = { + [AppColorMode.GreenUp]: ThemeColorBase; + [AppColorMode.RedUp]: ThemeColorBase; +}; + +export type ThemeColorBase = BaseColors & + LayerColors & BorderColors & TextColors & GradientColors & @@ -7,7 +23,14 @@ export type ThemeColors = LayerColors & DirectionalColors & RiskColors & IconColors & - ComponentColors; + ComponentColors & + Filters; + +type BaseColors = { + white: string; + green: string; + red: string; +}; type LayerColors = { layer0: string; @@ -30,6 +53,8 @@ type TextColors = { textPrimary: string; textSecondary: string; textTertiary: string; + + textButton: string; }; type GradientColors = { @@ -47,8 +72,13 @@ type StatusColors = { success: string; warning: string; error: string; + successFaded: string; + warningFaded: string; + errorFaded: string; }; +/** ##InvertDirectionalColors + * When adding colors here, make sure to update linked function to invert colors for AppColorMode. */ type DirectionalColors = { positive: string; negative: string; @@ -71,7 +101,12 @@ type IconColors = { type ComponentColors = { inputBackground: string; popoverBackground: string; - switchThumbActiveBackground: string; toggleBackground: string; tooltipBackground: string; }; + +type Filters = { + hoverFilterBase: string; + hoverFilterVariant: string; + activeFilter: string; +}; diff --git a/src/constants/tooltips/trade.ts b/src/constants/tooltips/trade.ts index 081e3f0..4382ce8 100644 --- a/src/constants/tooltips/trade.ts +++ b/src/constants/tooltips/trade.ts @@ -198,4 +198,7 @@ export const tradeTooltips: TooltipStrings = { title: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_TITLE }), body: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_BODY }), }), + 'reward-history': ({ stringGetter }) => ({ + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REWARD_HISTORY_BODY }), + }), } as const; diff --git a/src/constants/trade.ts b/src/constants/trade.ts index ff042cf..658134d 100644 --- a/src/constants/trade.ts +++ b/src/constants/trade.ts @@ -4,7 +4,6 @@ import { AlertType } from '@/constants/alerts'; import { STRING_KEYS } from '@/constants/localization'; import { TimeUnitShort } from '@/constants/time'; -// TODO: rename to OrderType export enum TradeTypes { MARKET = 'MARKET', LIMIT = 'LIMIT', @@ -15,6 +14,16 @@ export enum TradeTypes { TRAILING_STOP = 'TRAILING_STOP', } +enum ClosingTradeTypes { + LIQUIDATED = 'LIQUIDATED', + LIQUIDATION = 'LIQUIDATION', + OFFSETTING = 'OFFSETTING', + DELEVERAGED = 'DELEVERAGED', + FINAL_SETTLEMENT = 'FINAL_SETTLEMENT', +} + +export type OrderType = TradeTypes | ClosingTradeTypes; + export enum TimeInForceOptions { GTT = 'GTT', FOK = 'FOK', @@ -40,49 +49,74 @@ export const POSITION_SIDE_STRINGS: Record = { [PositionSide.Short]: STRING_KEYS.SHORT_POSITION_SHORT, }; -export const TRADE_TYPE_STRINGS: Record< - TradeTypes, +export const ORDER_TYPE_STRINGS: Record< + OrderType, { - tradeTypeKeyShort: string; - tradeTypeKey: string; - descriptionKey: string; + orderTypeKeyShort: string; + orderTypeKey: string; + descriptionKey: string | null; } > = { [TradeTypes.LIMIT]: { - tradeTypeKeyShort: STRING_KEYS.LIMIT_ORDER_SHORT, - tradeTypeKey: STRING_KEYS.LIMIT_ORDER, + orderTypeKeyShort: STRING_KEYS.LIMIT_ORDER_SHORT, + orderTypeKey: STRING_KEYS.LIMIT_ORDER, descriptionKey: STRING_KEYS.LIMIT_ORDER_DESCRIPTION, }, [TradeTypes.MARKET]: { - tradeTypeKeyShort: STRING_KEYS.MARKET_ORDER_SHORT, - tradeTypeKey: STRING_KEYS.MARKET_ORDER, + orderTypeKeyShort: STRING_KEYS.MARKET_ORDER_SHORT, + orderTypeKey: STRING_KEYS.MARKET_ORDER, descriptionKey: STRING_KEYS.MARKET_ORDER_DESCRIPTION, }, [TradeTypes.STOP_LIMIT]: { - tradeTypeKeyShort: STRING_KEYS.STOP_LIMIT, - tradeTypeKey: STRING_KEYS.STOP_LIMIT, + orderTypeKeyShort: STRING_KEYS.STOP_LIMIT, + orderTypeKey: STRING_KEYS.STOP_LIMIT, descriptionKey: STRING_KEYS.STOP_LIMIT_DESCRIPTION, }, [TradeTypes.STOP_MARKET]: { - tradeTypeKeyShort: STRING_KEYS.STOP_MARKET, - tradeTypeKey: STRING_KEYS.STOP_MARKET, + orderTypeKeyShort: STRING_KEYS.STOP_MARKET, + orderTypeKey: STRING_KEYS.STOP_MARKET, descriptionKey: STRING_KEYS.STOP_MARKET_DESCRIPTION, }, [TradeTypes.TAKE_PROFIT]: { - tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_LIMIT, - tradeTypeKey: STRING_KEYS.TAKE_PROFIT_LIMIT, + orderTypeKeyShort: STRING_KEYS.TAKE_PROFIT_LIMIT, + orderTypeKey: STRING_KEYS.TAKE_PROFIT_LIMIT, descriptionKey: STRING_KEYS.TAKE_PROFIT_LIMIT_DESCRIPTION, }, [TradeTypes.TAKE_PROFIT_MARKET]: { - tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_MARKET, - tradeTypeKey: STRING_KEYS.TAKE_PROFIT_MARKET, + orderTypeKeyShort: STRING_KEYS.TAKE_PROFIT_MARKET, + orderTypeKey: STRING_KEYS.TAKE_PROFIT_MARKET, descriptionKey: STRING_KEYS.TAKE_PROFIT_MARKET_DESCRIPTION, }, [TradeTypes.TRAILING_STOP]: { - tradeTypeKeyShort: STRING_KEYS.TRAILING_STOP, - tradeTypeKey: STRING_KEYS.TRAILING_STOP, + orderTypeKeyShort: STRING_KEYS.TRAILING_STOP, + orderTypeKey: STRING_KEYS.TRAILING_STOP, descriptionKey: STRING_KEYS.TRAILING_STOP_DESCRIPTION, }, + [ClosingTradeTypes.LIQUIDATED]: { + orderTypeKeyShort: STRING_KEYS.LIQUIDATED, + orderTypeKey: STRING_KEYS.LIQUIDATED, + descriptionKey: null, + }, + [ClosingTradeTypes.LIQUIDATION]: { + orderTypeKeyShort: STRING_KEYS.LIQUIDATION, + orderTypeKey: STRING_KEYS.LIQUIDATION, + descriptionKey: null, + }, + [ClosingTradeTypes.OFFSETTING]: { + orderTypeKeyShort: STRING_KEYS.OFFSETTING, + orderTypeKey: STRING_KEYS.OFFSETTING, + descriptionKey: null, + }, + [ClosingTradeTypes.DELEVERAGED]: { + orderTypeKeyShort: STRING_KEYS.DELEVERAGED, + orderTypeKey: STRING_KEYS.DELEVERAGED, + descriptionKey: null, + }, + [ClosingTradeTypes.FINAL_SETTLEMENT]: { + orderTypeKeyShort: STRING_KEYS.FINAL_SETTLEMENT, + orderTypeKey: STRING_KEYS.FINAL_SETTLEMENT, + descriptionKey: null, + }, }; export const GOOD_TIL_TIME_TIMESCALE_STRINGS: Record = { diff --git a/src/constants/tvchart.ts b/src/constants/tvchart.ts new file mode 100644 index 0000000..62503ac --- /dev/null +++ b/src/constants/tvchart.ts @@ -0,0 +1,16 @@ +import { OrderSide } from '@dydxprotocol/v4-client-js'; + +import type { + IChartingLibraryWidget, + IOrderLineAdapter, + IPositionLineAdapter, +} from 'public/tradingview/charting_library'; + +export type TvWidget = IChartingLibraryWidget & { _id?: string; _ready?: boolean }; + +export type ChartLineType = OrderSide | 'position'; + +export type ChartLine = { + line: IOrderLineAdapter | IPositionLineAdapter; + chartLineType: ChartLineType; +}; diff --git a/src/constants/wallets.ts b/src/constants/wallets.ts index 43e80c9..b4ab501 100644 --- a/src/constants/wallets.ts +++ b/src/constants/wallets.ts @@ -24,7 +24,7 @@ import { import { isMetaMask } from '@/lib/wallet/providers'; -import { DydxNetwork, ENVIRONMENT_CONFIG_MAP } from './networks'; +import { DydxChainId, WALLETS_CONFIG_MAP } from './networks'; // Wallet connection types @@ -40,6 +40,7 @@ export enum WalletErrorType { // General ChainMismatch, UserCanceled, + SwitchChainMethodMissing, // Non-Deterministic NonDeterministicWallet, @@ -290,17 +291,17 @@ export const COSMOS_DERIVATION_PATH = "m/44'/118'/0'/0/0"; /** * @description typed data to sign for dYdX Chain onboarding */ -export const getSignTypedData = (selectedNetwork: DydxNetwork) => +export const getSignTypedData = (selectedDydxChainId: DydxChainId) => ({ primaryType: 'dYdX', domain: { - name: ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.signTypedDataDomainName, + name: WALLETS_CONFIG_MAP[selectedDydxChainId].signTypedDataDomainName, }, types: { dYdX: [{ name: 'action', type: 'string' }], }, message: { - action: ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.signTypedDataAction, + action: WALLETS_CONFIG_MAP[selectedDydxChainId].signTypedDataAction, }, } as const); diff --git a/src/hooks/Orderbook/useDrawOrderbook.ts b/src/hooks/Orderbook/useDrawOrderbook.ts index 887d3f3..7577796 100644 --- a/src/hooks/Orderbook/useDrawOrderbook.ts +++ b/src/hooks/Orderbook/useDrawOrderbook.ts @@ -12,8 +12,9 @@ import { ORDERBOOK_WIDTH, } from '@/constants/orderbook'; +import { useAppThemeAndColorModeContext } from '@/hooks/useAppThemeAndColorMode'; + import { getCurrentMarketConfig, getCurrentMarketOrderbookMap } from '@/state/perpetualsSelectors'; -import { getAppTheme } from '@/state/configsSelectors'; import { MustBigNumber } from '@/lib/numbers'; @@ -23,7 +24,6 @@ import { getXByColumn, getYForElements, } from '@/lib/orderbookHelpers'; -import { useAppThemeContext } from '../useAppTheme'; type ElementProps = { data: Array; @@ -53,7 +53,7 @@ export const useDrawOrderbook = ({ const { stepSizeDecimals = TOKEN_DECIMALS, tickSizeDecimals = SMALL_USD_DECIMALS } = useSelector(getCurrentMarketConfig, shallowEqual) || {}; const prevData = useRef(data); - const theme = useAppThemeContext(); + const theme = useAppThemeAndColorModeContext(); /** * Scale canvas using device pixel ratio to unblur drawn text diff --git a/src/hooks/tradingView/index.ts b/src/hooks/tradingView/index.ts index 13ecccc..5d26196 100644 --- a/src/hooks/tradingView/index.ts +++ b/src/hooks/tradingView/index.ts @@ -1,2 +1,4 @@ +export { useChartLines } from './useChartLines'; +export { useChartMarketAndResolution } from './useChartMarketAndResolution'; export { useTradingView } from './useTradingView'; export { useTradingViewTheme } from './useTradingViewTheme'; diff --git a/src/hooks/tradingView/useChartLines.ts b/src/hooks/tradingView/useChartLines.ts new file mode 100644 index 0000000..81620e1 --- /dev/null +++ b/src/hooks/tradingView/useChartLines.ts @@ -0,0 +1,209 @@ +import { useEffect, useState } from 'react'; + +import { shallowEqual, useSelector } from 'react-redux'; + +import { AbacusOrderStatus, ORDER_SIDES, SubaccountOrder } from '@/constants/abacus'; +import { STRING_KEYS } from '@/constants/localization'; +import { type OrderType, ORDER_TYPE_STRINGS } from '@/constants/trade'; +import type { ChartLine, TvWidget } from '@/constants/tvchart'; + +import { useStringGetter } from '@/hooks'; + +import { getCurrentMarketOrders, getCurrentMarketPositionData } from '@/state/accountSelectors'; +import { getAppTheme, getAppColorMode } from '@/state/configsSelectors'; + +import { MustBigNumber } from '@/lib/numbers'; +import { getChartLineColors } from '@/lib/tradingView/utils'; + +let chartLines: Record = {}; + +/** + * @description Hook to handle drawing chart lines + */ + +export const useChartLines = ({ + tvWidget, + displayButton, + isChartReady, +}: { + tvWidget: TvWidget | null; + displayButton: HTMLElement | null; + isChartReady?: boolean; +}) => { + const [showOrderLines, setShowOrderLines] = useState(false); + + const stringGetter = useStringGetter(); + + const appTheme = useSelector(getAppTheme); + const appColorMode = useSelector(getAppColorMode); + + const currentMarketPositionData = useSelector(getCurrentMarketPositionData, shallowEqual); + const currentMarketOrders: SubaccountOrder[] = useSelector(getCurrentMarketOrders, shallowEqual); + + useEffect(() => { + if (isChartReady && displayButton) { + displayButton.onclick = () => { + const newShowOrderLinesState = !showOrderLines; + if (newShowOrderLinesState) { + displayButton?.classList?.add('order-lines-active'); + } else { + displayButton?.classList?.remove('order-lines-active'); + } + setShowOrderLines(newShowOrderLinesState); + }; + } + }, [isChartReady, showOrderLines]); + + useEffect(() => { + if (tvWidget && isChartReady) { + tvWidget.onChartReady(() => { + tvWidget.chart().dataReady(() => { + if (showOrderLines) { + drawOrderLines(); + drawPositionLine(); + } else { + deleteChartLines(); + } + }); + }); + } + }, [isChartReady, showOrderLines, currentMarketPositionData, currentMarketOrders]); + + const drawPositionLine = () => { + if (!currentMarketPositionData) return; + + const entryPrice = currentMarketPositionData.entryPrice?.current; + const size = currentMarketPositionData.size?.current; + + const key = currentMarketPositionData.id; + const price = MustBigNumber(entryPrice).toNumber(); + + const maybePositionLine = chartLines[key]?.line; + const shouldShow = size && size !== 0; + + if (!shouldShow) { + if (maybePositionLine) { + maybePositionLine.remove(); + delete chartLines[key]; + return; + } + } else { + const quantity = size.toString(); + + if (maybePositionLine) { + if (maybePositionLine.getQuantity() !== quantity) { + maybePositionLine.setQuantity(quantity); + } + if (maybePositionLine.getPrice() !== price) { + maybePositionLine.setPrice(price); + } + } else { + const positionLine = tvWidget + ?.chart() + .createPositionLine({ disableUndo: false }) + .setText(stringGetter({ key: STRING_KEYS.ENTRY_PRICE_SHORT })) + .setPrice(price) + .setQuantity(quantity); + + if (positionLine) { + const chartLine = { line: positionLine, chartLineType: 'position' }; + setLineColors({ chartLine: chartLine }); + chartLines[key] = chartLine; + } + } + } + }; + + const drawOrderLines = () => { + if (!currentMarketOrders) return; + + currentMarketOrders.forEach( + ({ + id, + type, + status, + side, + cancelReason, + remainingSize, + size, + triggerPrice, + price, + trailingPercent, + }) => { + const key = id; + const quantity = (remainingSize ?? size).toString(); + + const orderType = type.rawValue as OrderType; + const orderLabel = stringGetter({ + key: ORDER_TYPE_STRINGS[orderType].orderTypeKey, + }); + const orderString = trailingPercent ? `${orderLabel} ${trailingPercent}%` : orderLabel; + + const shouldShow = + !cancelReason && + (status === AbacusOrderStatus.open || status === AbacusOrderStatus.untriggered); + + const maybeOrderLine = chartLines[key]?.line; + + if (!shouldShow) { + if (maybeOrderLine) { + maybeOrderLine.remove(); + delete chartLines[key]; + return; + } + } else { + if (maybeOrderLine) { + if (maybeOrderLine.getQuantity() !== quantity) { + maybeOrderLine.setQuantity(quantity); + } + } else { + const orderLine = tvWidget + ?.chart() + .createOrderLine({ disableUndo: false }) + .setPrice(MustBigNumber(triggerPrice ?? price).toNumber()) + .setQuantity(quantity) + .setText(orderString); + + if (orderLine) { + const chartLine: ChartLine = { + line: orderLine, + chartLineType: ORDER_SIDES[side.name], + }; + setLineColors({ chartLine: chartLine }); + chartLines[key] = chartLine; + } + } + } + } + ); + }; + + const deleteChartLines = () => { + Object.values(chartLines).forEach(({ line }) => { + line.remove(); + }); + chartLines = {}; + }; + + const setLineColors = ({ chartLine }: { chartLine: ChartLine }) => { + const { line, chartLineType } = chartLine; + const { maybeQuantityColor, borderColor, backgroundColor, textColor, textButtonColor } = + getChartLineColors({ + appTheme, + appColorMode, + chartLineType, + }); + + line + .setQuantityBorderColor(borderColor) + .setBodyBackgroundColor(backgroundColor) + .setBodyBorderColor(borderColor) + .setBodyTextColor(textColor) + .setQuantityTextColor(textButtonColor); + + maybeQuantityColor && + line.setLineColor(maybeQuantityColor).setQuantityBackgroundColor(maybeQuantityColor); + }; + + return { chartLines }; +}; diff --git a/src/hooks/tradingView/useChartMarketAndResolution.ts b/src/hooks/tradingView/useChartMarketAndResolution.ts new file mode 100644 index 0000000..a6b5451 --- /dev/null +++ b/src/hooks/tradingView/useChartMarketAndResolution.ts @@ -0,0 +1,72 @@ +import { useEffect } from 'react'; + +import { useDispatch, useSelector } from 'react-redux'; + +import type { ResolutionString } from 'public/tradingview/charting_library'; + +import { DEFAULT_RESOLUTION, RESOLUTION_CHART_CONFIGS } from '@/constants/candles'; +import { DEFAULT_MARKETID } from '@/constants/markets'; +import type { TvWidget } from '@/constants/tvchart'; + +import { setTvChartResolution } from '@/state/perpetuals'; +import { getCurrentMarketId, getSelectedResolutionForMarket } from '@/state/perpetualsSelectors'; + +/** + * @description Hook to handle changing markets and setting chart resolution + */ + +export const useChartMarketAndResolution = ({ + tvWidget, + isWidgetReady, + savedResolution, +}: { + tvWidget: TvWidget | null; + isWidgetReady?: boolean; + savedResolution?: ResolutionString; +}) => { + const dispatch = useDispatch(); + + const currentMarketId: string = useSelector(getCurrentMarketId) || DEFAULT_MARKETID; + + const selectedResolution: string = + useSelector(getSelectedResolutionForMarket(currentMarketId)) || DEFAULT_RESOLUTION; + + const chart = isWidgetReady ? tvWidget?.chart() : undefined; + const chartResolution = chart?.resolution?.(); + + /** + * @description Hook to handle changing markets - intentionally should avoid triggering on change of resolutions. + */ + useEffect(() => { + if (currentMarketId && isWidgetReady) { + const resolution = savedResolution || selectedResolution; + tvWidget?.setSymbol(currentMarketId, resolution as ResolutionString, () => {}); + } + }, [currentMarketId, isWidgetReady]); + + /** + * @description Hook to handle changing chart resolution + */ + useEffect(() => { + if (chartResolution) { + if (chartResolution !== selectedResolution) { + dispatch(setTvChartResolution({ marketId: currentMarketId, resolution: chartResolution })); + } + + setVisibleRangeForResolution({ resolution: chartResolution }); + } + }, [currentMarketId, chartResolution, selectedResolution]); + + const setVisibleRangeForResolution = ({ resolution }: { resolution: ResolutionString }) => { + // Different resolutions have different timeframes to display data efficiently. + const { defaultRange } = RESOLUTION_CHART_CONFIGS[resolution]; + + // from/to values converted to epoch seconds + const newRange = { + from: (Date.now() - defaultRange) / 1000, + to: Date.now() / 1000, + }; + + tvWidget?.activeChart().setVisibleRange(newRange, { percentRightMargin: 10 }); + }; +}; diff --git a/src/hooks/tradingView/useTradingView.ts b/src/hooks/tradingView/useTradingView.ts index 756ecc2..0de4d18 100644 --- a/src/hooks/tradingView/useTradingView.ts +++ b/src/hooks/tradingView/useTradingView.ts @@ -1,17 +1,21 @@ -import { useEffect } from 'react'; +import React, { useEffect } from 'react'; + import { shallowEqual, useSelector } from 'react-redux'; + import isEmpty from 'lodash/isEmpty'; import { LanguageCode, ResolutionString, widget } from 'public/tradingview/charting_library'; import { DEFAULT_RESOLUTION } from '@/constants/candles'; -import { SUPPORTED_LOCALE_BASE_TAGS } from '@/constants/localization'; +import { SUPPORTED_LOCALE_BASE_TAGS, STRING_KEYS } from '@/constants/localization'; import { LocalStorageKey } from '@/constants/localStorage'; -import { useDydxClient, useLocalStorage } from '@/hooks'; -import { store } from '@/state/_store'; +import type { TvWidget } from '@/constants/tvchart'; +import { useDydxClient, useLocalStorage, useStringGetter } from '@/hooks'; + +import { store } from '@/state/_store'; import { getSelectedNetwork } from '@/state/appSelectors'; -import { getAppTheme } from '@/state/configsSelectors'; +import { getAppTheme, getAppColorMode } from '@/state/configsSelectors'; import { getSelectedLocale } from '@/state/localizationSelectors'; import { getCurrentMarketId, getMarketIds } from '@/state/perpetualsSelectors'; @@ -23,13 +27,19 @@ import { getSavedResolution, getWidgetOptions, getWidgetOverrides } from '@/lib/ */ export const useTradingView = ({ tvWidgetRef, + displayButtonRef, setIsChartReady, }: { - tvWidgetRef: React.MutableRefObject; + tvWidgetRef: React.MutableRefObject; + displayButtonRef: React.MutableRefObject; setIsChartReady: React.Dispatch>; }) => { - const marketId = useSelector(getCurrentMarketId); + const stringGetter = useStringGetter(); + const appTheme = useSelector(getAppTheme); + const appColorMode = useSelector(getAppColorMode); + + const marketId = useSelector(getCurrentMarketId); const marketIds = useSelector(getMarketIds, shallowEqual); const selectedLocale = useSelector(getSelectedLocale); const selectedNetwork = useSelector(getSelectedNetwork); @@ -46,9 +56,8 @@ export const useTradingView = ({ useEffect(() => { if (hasMarkets && isClientConnected && marketId) { const widgetOptions = getWidgetOptions(); - const widgetOverrides = getWidgetOverrides(appTheme); + const widgetOverrides = getWidgetOverrides({ appTheme, appColorMode }); const options = { - // debug: true, ...widgetOptions, ...widgetOverrides, datafeed: getDydxDatafeed(store, getCandlesForDatafeed), @@ -62,6 +71,19 @@ export const useTradingView = ({ tvWidgetRef.current = tvChartWidget; tvWidgetRef.current.onChartReady(() => { + tvWidgetRef.current?.headerReady().then(() => { + if (displayButtonRef && tvWidgetRef.current) { + displayButtonRef.current = tvWidgetRef.current.createButton(); + displayButtonRef.current.innerHTML = `${stringGetter({ + key: STRING_KEYS.ORDER_LINES, + })}
`; + displayButtonRef.current.setAttribute( + 'title', + stringGetter({ key: STRING_KEYS.ORDER_LINES_TOOLTIP }) + ); + } + }); + tvWidgetRef?.current?.subscribe('onAutoSaveNeeded', () => tvWidgetRef?.current?.save((chartConfig: object) => setTvChartConfig(chartConfig)) ); @@ -71,11 +93,20 @@ export const useTradingView = ({ } return () => { + displayButtonRef.current?.remove(); + displayButtonRef.current = null; tvWidgetRef.current?.remove(); tvWidgetRef.current = null; setIsChartReady(false); }; - }, [getCandlesForDatafeed, isClientConnected, hasMarkets, selectedLocale, selectedNetwork, !!marketId]); + }, [ + getCandlesForDatafeed, + isClientConnected, + hasMarkets, + selectedLocale, + selectedNetwork, + !!marketId, + ]); return { savedResolution }; }; diff --git a/src/hooks/tradingView/useTradingViewTheme.ts b/src/hooks/tradingView/useTradingViewTheme.ts index 6436063..8930cbf 100644 --- a/src/hooks/tradingView/useTradingViewTheme.ts +++ b/src/hooks/tradingView/useTradingViewTheme.ts @@ -1,12 +1,14 @@ import { useEffect } from 'react'; + import { useSelector } from 'react-redux'; -import type { IChartingLibraryWidget, ThemeName } from 'public/tradingview/charting_library'; +import { THEME_NAMES } from '@/constants/styles/colors'; +import type { ChartLine, TvWidget } from '@/constants/tvchart'; -import { AppTheme } from '@/state/configs'; -import { getAppTheme } from '@/state/configsSelectors'; +import { AppColorMode, AppTheme } from '@/state/configs'; +import { getAppTheme, getAppColorMode } from '@/state/configsSelectors'; -import { getWidgetOverrides } from '@/lib/tradingView/utils'; +import { getWidgetOverrides, getChartLineColors } from '@/lib/tradingView/utils'; /** * @description Method to define a type guard and check that an element is an IFRAME @@ -22,43 +24,77 @@ const isIFrame = (element: HTMLElement | null): element is HTMLIFrameElement => * In order to support our Classic along with Dark/Light, we are directly accessing the within the iFrame. */ export const useTradingViewTheme = ({ + chartLines, tvWidget, isWidgetReady, }: { - tvWidget: (IChartingLibraryWidget & { _id?: string; _ready?: boolean }) | null; + chartLines: Record; + tvWidget: TvWidget | null; isWidgetReady?: boolean; }) => { const appTheme: AppTheme = useSelector(getAppTheme); + const appColorMode: AppColorMode = useSelector(getAppColorMode); useEffect(() => { if (tvWidget && isWidgetReady) { - tvWidget - .changeTheme?.( - { - [AppTheme.Classic]: '', - [AppTheme.Dark]: 'Dark', - [AppTheme.Light]: 'Light', - }[appTheme] as ThemeName - ) - .then(() => { - const tvChartId = tvWidget?._id; + tvWidget.changeTheme?.(THEME_NAMES[appTheme]).then(() => { + const tvChartId = tvWidget?._id; - if (tvChartId) { - const frame = document?.getElementById(tvChartId); + if (tvChartId) { + const frame = document?.getElementById(tvChartId); - if (isIFrame(frame) && frame.contentWindow) { - const innerHtml = frame.contentWindow.document.documentElement; - - if (appTheme === AppTheme.Classic) { + if (isIFrame(frame) && frame.contentWindow) { + const innerHtml = frame.contentWindow.document.documentElement; + switch (appTheme) { + case AppTheme.Classic: innerHtml?.classList.remove('theme-dark', 'theme-light'); - } + break; + case AppTheme.Dark: + innerHtml?.classList.remove('theme-light'); + innerHtml?.classList.add('theme-dark'); + break; + case AppTheme.Light: + innerHtml?.classList.remove('theme-dark'); + innerHtml?.classList.add('theme-light'); } } + } - const { overrides, studies_overrides } = getWidgetOverrides(appTheme); - tvWidget?.applyOverrides(overrides); - tvWidget?.applyStudiesOverrides(studies_overrides); + const { overrides, studies_overrides } = getWidgetOverrides({ appTheme, appColorMode }); + tvWidget?.applyOverrides(overrides); + tvWidget?.applyStudiesOverrides(studies_overrides); + + // Necessary to update existing indicators + const volumeStudyId = tvWidget + ?.activeChart() + ?.getAllStudies() + ?.find((x) => x.name === 'Volume')?.id; + + if (volumeStudyId) { + const volume = tvWidget?.activeChart()?.getStudyById(volumeStudyId); + volume.applyOverrides({ + 'volume.color.0': studies_overrides['volume.volume.color.0'], + 'volume.color.1': studies_overrides['volume.volume.color.1'], + }); + } + + // Necessary to update existing chart lines + Object.values(chartLines).forEach(({ chartLineType, line }) => { + const { maybeQuantityColor, borderColor, backgroundColor, textColor, textButtonColor } = + getChartLineColors({ chartLineType: chartLineType, appTheme, appColorMode }); + + if (maybeQuantityColor) { + line.setLineColor(maybeQuantityColor).setQuantityBackgroundColor(maybeQuantityColor); + } + + line + .setQuantityBorderColor(borderColor) + .setBodyBackgroundColor(backgroundColor) + .setBodyBorderColor(borderColor) + .setBodyTextColor(textColor) + .setQuantityTextColor(textButtonColor); }); + }); } - }, [appTheme]); + }, [appTheme, appColorMode, isWidgetReady]); }; diff --git a/src/hooks/useAppTheme.tsx b/src/hooks/useAppTheme.tsx deleted file mode 100644 index 790cc89..0000000 --- a/src/hooks/useAppTheme.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { useSelector } from 'react-redux'; -import { ThemeProvider } from 'styled-components'; - -import { AppTheme } from '@/state/configs'; -import { getAppTheme } from '@/state/configsSelectors'; - -import { Themes } from '@/styles/themes'; - -export const AppThemeProvider = ({ ...props }) => { - return -}; - -export const useAppThemeContext = () => { - const theme: AppTheme = useSelector(getAppTheme); - return Themes[theme]; -} diff --git a/src/hooks/useAppThemeAndColorMode.tsx b/src/hooks/useAppThemeAndColorMode.tsx new file mode 100644 index 0000000..1cbc3de --- /dev/null +++ b/src/hooks/useAppThemeAndColorMode.tsx @@ -0,0 +1,48 @@ +import { useEffect, useState } from 'react'; +import { useSelector } from 'react-redux'; +import { ThemeProvider } from 'styled-components'; + +import { AppTheme, AppThemeSetting, AppColorMode, AppThemeSystemSetting } from '@/state/configs'; +import { getAppThemeSetting, getAppColorMode } from '@/state/configsSelectors'; + +import { Themes } from '@/styles/themes'; + +export const AppThemeAndColorModeProvider = ({ ...props }) => { + return ; +}; + +export const useAppThemeAndColorModeContext = () => { + const themeSetting: AppThemeSetting = useSelector(getAppThemeSetting); + const colorMode: AppColorMode = useSelector(getAppColorMode); + + const darkModePref = globalThis.matchMedia('(prefers-color-scheme: dark)'); + + const [systemPreference, setSystemPreference] = useState( + darkModePref.matches ? AppTheme.Dark : AppTheme.Light + ); + + useEffect(() => { + const handler = (e) => { + if (e.matches) { + setSystemPreference(AppTheme.Dark); + } else { + setSystemPreference(AppTheme.Light); + } + }; + darkModePref.addEventListener('change', handler); + return () => darkModePref.removeEventListener('change', handler); + }, []); + + const getThemeFromSetting = (): AppTheme => { + switch (themeSetting) { + case AppThemeSystemSetting.System: + return systemPreference; + case AppTheme.Classic: + case AppTheme.Dark: + case AppTheme.Light: + return themeSetting; + } + }; + + return Themes[getThemeFromSetting()][colorMode]; +}; diff --git a/src/hooks/useDydxClient.tsx b/src/hooks/useDydxClient.tsx index 581dd58..494f315 100644 --- a/src/hooks/useDydxClient.tsx +++ b/src/hooks/useDydxClient.tsx @@ -16,15 +16,15 @@ import { import type { ResolutionString } from 'public/tradingview/charting_library'; import type { ConnectNetworkEvent, NetworkConfig } from '@/constants/abacus'; +import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; import { type Candle, RESOLUTION_MAP } from '@/constants/candles'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; -import { DydxChainAsset } from '@/constants/wallets'; import { getSelectedNetwork } from '@/state/appSelectors'; import { log } from '@/lib/telemetry'; import { useRestrictions } from './useRestrictions'; +import { useTokenConfigs } from './useTokenConfigs'; type DydxContextType = ReturnType; const DydxContext = createContext({} as DydxContextType); @@ -40,7 +40,8 @@ const useDydxClientContext = () => { // ------ Network ------ // const selectedNetwork = useSelector(getSelectedNetwork); - const tokensConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].tokens; + const { usdcDenom, usdcDecimals, usdcGasDenom, chainTokenDenom, chainTokenDecimals } = + useTokenConfigs(); const [networkConfig, setNetworkConfig] = useState(); @@ -74,16 +75,17 @@ const useDydxClientContext = () => { networkConfig.validatorUrl, networkConfig.chainId, { - USDC_DENOM: tokensConfigs[DydxChainAsset.USDC].denom, - USDC_DECIMALS: tokensConfigs[DydxChainAsset.USDC].decimals, - USDC_GAS_DENOM: tokensConfigs[DydxChainAsset.USDC].gasDenom, - CHAINTOKEN_DENOM: tokensConfigs[DydxChainAsset.CHAINTOKEN].denom, - CHAINTOKEN_DECIMALS: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals, + USDC_DENOM: usdcDenom, + USDC_DECIMALS: usdcDecimals, + USDC_GAS_DENOM: usdcGasDenom, + CHAINTOKEN_DENOM: chainTokenDenom, + CHAINTOKEN_DECIMALS: chainTokenDecimals, }, { broadcastPollIntervalMs: 3_000, broadcastTimeoutMs: 60_000, - } + }, + DEFAULT_TRANSACTION_MEMO ) ) ); diff --git a/src/hooks/useGovernanceVariables.ts b/src/hooks/useGovernanceVariables.ts index 0234ea0..4fc5bed 100644 --- a/src/hooks/useGovernanceVariables.ts +++ b/src/hooks/useGovernanceVariables.ts @@ -1,5 +1,8 @@ -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; -import { useSelectedNetwork } from '@/hooks'; +import { useSelector } from 'react-redux'; + +import { GOVERNANCE_CONFIG_MAP } from '@/constants/networks'; + +import { getSelectedDydxChainId } from '@/state/appSelectors'; export interface GovernanceVariables { newMarketProposal: { @@ -10,7 +13,7 @@ export interface GovernanceVariables { } export const useGovernanceVariables = (): GovernanceVariables => { - const { selectedNetwork } = useSelectedNetwork(); - const governanceVars = ENVIRONMENT_CONFIG_MAP[selectedNetwork].governance as GovernanceVariables; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const governanceVars = GOVERNANCE_CONFIG_MAP[selectedDydxChainId] as GovernanceVariables; return governanceVars; }; diff --git a/src/hooks/useMarketsData.ts b/src/hooks/useMarketsData.ts index 020db64..b5c6011 100644 --- a/src/hooks/useMarketsData.ts +++ b/src/hooks/useMarketsData.ts @@ -33,7 +33,7 @@ export const useMarketsData = ( return Object.values(allPerpetualMarkets) .filter(isTruthy) .map((marketData) => ({ - asset: allAssets[marketData.assetId], + asset: allAssets[marketData.assetId] ?? {}, tickSizeDecimals: marketData.configs?.tickSizeDecimals, ...marketData, ...marketData.perpetual, @@ -46,9 +46,10 @@ export const useMarketsData = ( if (searchFilter) { return filtered.filter( - ({ asset }) => + ({ asset, id }) => asset?.name?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) || - asset?.id?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) + asset?.id?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) || + id?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) ); } return filtered; diff --git a/src/hooks/useNotificationTypes.tsx b/src/hooks/useNotificationTypes.tsx index b7be4f3..6a2c16a 100644 --- a/src/hooks/useNotificationTypes.tsx +++ b/src/hooks/useNotificationTypes.tsx @@ -5,7 +5,6 @@ import { isEqual, groupBy } from 'lodash'; import { useNavigate } from 'react-router-dom'; import { DialogTypes } from '@/constants/dialogs'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { AppRoute } from '@/constants/routes'; import { DydxChainAsset } from '@/constants/wallets'; @@ -23,7 +22,7 @@ import { TransferNotificationTypes, } from '@/constants/notifications'; -import { useSelectedNetwork, useStringGetter } from '@/hooks'; +import { useStringGetter } from '@/hooks'; import { useLocalNotifications } from '@/hooks/useLocalNotifications'; import { AssetIcon } from '@/components/AssetIcon'; @@ -36,6 +35,7 @@ import { getSubaccountFills, getSubaccountOrders } from '@/state/accountSelector import { openDialog } from '@/state/dialogs'; import { getAbacusNotifications } from '@/state/notificationsSelectors'; import { getMarketIds } from '@/state/perpetualsSelectors'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; import { formatSeconds } from '@/lib/timeUtils'; @@ -175,7 +175,7 @@ export const notificationTypes: NotificationTypeConfig[] = [ useTrigger: ({ trigger }) => { const stringGetter = useStringGetter(); const { transferNotifications } = useLocalNotifications(); - const { selectedNetwork } = useSelectedNetwork(); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); useEffect(() => { for (const transfer of transferNotifications) { @@ -184,7 +184,7 @@ export const notificationTypes: NotificationTypeConfig[] = [ const icon = ; const transferType = - type ?? fromChainId === ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId + type ?? fromChainId === selectedDydxChainId ? TransferNotificationTypes.Withdrawal : TransferNotificationTypes.Deposit; diff --git a/src/hooks/usePageTitlePriceUpdates.ts b/src/hooks/usePageTitlePriceUpdates.ts index 3093974..98013d8 100644 --- a/src/hooks/usePageTitlePriceUpdates.ts +++ b/src/hooks/usePageTitlePriceUpdates.ts @@ -4,8 +4,11 @@ import { useSelector } from 'react-redux'; import { DEFAULT_DOCUMENT_TITLE } from '@/constants/routes'; import { getSelectedLocale } from '@/state/localizationSelectors'; -import { getCurrentMarketData, getCurrentMarketId } from '@/state/perpetualsSelectors'; -import type { RootState } from '@/state/_store'; +import { + getCurrentMarketId, + getCurrentMarketMidMarketPrice, + getCurrentMarketOraclePrice, +} from '@/state/perpetualsSelectors'; import { useBreakpoints } from './useBreakpoints'; @@ -13,11 +16,14 @@ export const usePageTitlePriceUpdates = () => { const selectedLocale = useSelector(getSelectedLocale); const { isNotTablet } = useBreakpoints(); const id = useSelector(getCurrentMarketId); - const oraclePrice = useSelector((state: RootState) => getCurrentMarketData(state)?.oraclePrice); + const oraclePrice = useSelector(getCurrentMarketOraclePrice); + const orderbookMidMarketPrice = useSelector(getCurrentMarketMidMarketPrice); + + const price = orderbookMidMarketPrice ?? oraclePrice; useEffect(() => { - if (id && oraclePrice && isNotTablet) { - const priceString = oraclePrice.toLocaleString(selectedLocale); + if (id && price && isNotTablet) { + const priceString = price.toLocaleString(selectedLocale); document.title = `$${priceString} ${id} · ${DEFAULT_DOCUMENT_TITLE}`; } else { document.title = DEFAULT_DOCUMENT_TITLE; @@ -26,5 +32,5 @@ export const usePageTitlePriceUpdates = () => { return () => { document.title = DEFAULT_DOCUMENT_TITLE; }; - }, [oraclePrice]); + }, [price]); }; diff --git a/src/hooks/usePotentialMarkets.tsx b/src/hooks/usePotentialMarkets.tsx index 0708486..2cad7ef 100644 --- a/src/hooks/usePotentialMarkets.tsx +++ b/src/hooks/usePotentialMarkets.tsx @@ -1,19 +1,42 @@ -import { createContext, useContext, useEffect, useState } from 'react'; +import { createContext, useContext, useEffect, useMemo, useState } from 'react'; -import type { - ExchangeConfigItem, - ExchangeConfigParsedCsv, - PotentialMarketItem, - PotentialMarketParsedCsv, -} from '@/constants/potentialMarkets'; +import { STRING_KEYS } from '@/constants/localization'; +import type { ExchangeConfigItem, PotentialMarketItem } from '@/constants/potentialMarkets'; -import csvToArray from '@/lib/csvToArray'; import { log } from '@/lib/telemetry'; +import { useStringGetter } from './useStringGetter'; + const PotentialMarketsContext = createContext>({ potentialMarkets: undefined, exchangeConfigs: undefined, hasPotentialMarketsData: false, + liquidityTiers: { + 0: { + label: 'Large-cap', + initialMarginFraction: 0.05, + maintenanceMarginFraction: 0.03, + impactNotional: 10_000, + }, + 1: { + label: 'Mid-cap', + initialMarginFraction: 0.1, + maintenanceMarginFraction: 0.05, + impactNotional: 5_000, + }, + 2: { + label: 'Long-tail', + initialMarginFraction: 0.2, + maintenanceMarginFraction: 0.1, + impactNotional: 2_500, + }, + 3: { + label: 'Safety', + initialMarginFraction: 1, + maintenanceMarginFraction: 0.2, + impactNotional: 2_500, + }, + }, }); PotentialMarketsContext.displayName = 'PotentialMarkets'; @@ -24,60 +47,21 @@ export const PotentialMarketsProvider = ({ ...props }) => ( export const usePotentialMarkets = () => useContext(PotentialMarketsContext); -const EXCHANGE_CONFIG_FILE_PATH = '/configs/potentialMarketExchangeConfig.csv'; -const POTENTIAL_MARKETS_FILE_PATH = '/configs/potentialMarketParameters.csv'; + +const EXCHANGE_CONFIG_FILE_PATH = '/configs/otherMarketExchangeConfig.json'; +const POTENTIAL_MARKETS_FILE_PATH = '/configs/otherMarketParameters.json'; export const usePotentialMarketsContext = () => { + const stringGetter = useStringGetter(); const [potentialMarkets, setPotentialMarkets] = useState(); const [exchangeConfigs, setExchangeConfigs] = useState>(); useEffect(() => { try { fetch(POTENTIAL_MARKETS_FILE_PATH) - .then((response) => response.text()) + .then((response) => response.json()) .then((data) => { - const parsedData = csvToArray({ - stringVal: data, - splitter: ',', - }); - const parsedPotentialMarkets = parsedData.map( - ({ - base_asset, - reference_price, - num_oracles, - liquidity_tier, - asset_name, - p, - atomic_resolution, - min_exchanges, - min_price_change_ppm, - price_exponent, - step_base_quantum, - ticksize_exponent, - subticks_per_tick, - min_order_size, - quantum_conversion_exponent, - }) => ({ - // convert to camelCase - baseAsset: base_asset, - referencePrice: reference_price, - numOracles: Number(num_oracles), - liquidityTier: Number(liquidity_tier), - assetName: asset_name, - p: Number(p), - atomicResolution: Number(atomic_resolution), - minExchanges: Number(min_exchanges), - minPriceChangePpm: Number(min_price_change_ppm), - priceExponent: Number(price_exponent), - stepBaseQuantum: Number(step_base_quantum), - ticksizeExponent: Number(ticksize_exponent), - subticksPerTick: Number(subticks_per_tick), - minOrderSize: Number(min_order_size), - quantumConversionExponent: Number(quantum_conversion_exponent), - }) - ); - - setPotentialMarkets(parsedPotentialMarkets); + setPotentialMarkets(data as PotentialMarketItem[]); }); } catch (error) { log('usePotentialMarkets/potentialMarkets', error); @@ -86,40 +70,9 @@ export const usePotentialMarketsContext = () => { try { fetch(EXCHANGE_CONFIG_FILE_PATH) - .then((response) => response.text()) + .then((response) => response.json()) .then((data) => { - const parsedData = csvToArray({ - stringVal: data, - splitter: ',', - }); - // create an object with the base_asset as the key and the value as an array of exchanges - const exchangeConfigMap = parsedData.reduce( - (acc: Record, curr) => { - const { base_asset, exchange, pair, adjust_by_market } = curr; - if (!acc[base_asset]) { - acc[base_asset] = []; - } - - const exchangeItem: { - exchangeName: string; - ticker: string; - adjustByMarket?: string; - } = { - exchangeName: exchange, - ticker: pair, - }; - - if (adjust_by_market) { - exchangeItem.adjustByMarket = adjust_by_market; - } - - acc[base_asset].push(exchangeItem); - return acc; - }, - {} - ); - - setExchangeConfigs(exchangeConfigMap); + setExchangeConfigs(data as Record); }); } catch (error) { log('usePotentialMarkets/exchangeConfigs', error); @@ -127,9 +80,40 @@ export const usePotentialMarketsContext = () => { } }, []); + const liquidityTiers = useMemo( + () => ({ + 0: { + label: stringGetter({ key: STRING_KEYS.LARGE_CAP }), + initialMarginFraction: 0.05, + maintenanceMarginFraction: 0.03, + impactNotional: 10_000, + }, + 1: { + label: stringGetter({ key: STRING_KEYS.MID_CAP }), + initialMarginFraction: 0.1, + maintenanceMarginFraction: 0.05, + impactNotional: 5_000, + }, + 2: { + label: stringGetter({ key: STRING_KEYS.LONG_TAIL }), + initialMarginFraction: 0.2, + maintenanceMarginFraction: 0.1, + impactNotional: 2_500, + }, + 3: { + label: stringGetter({ key: STRING_KEYS.SAFETY }), + initialMarginFraction: 1, + maintenanceMarginFraction: 0.2, + impactNotional: 2_500, + }, + }), + [stringGetter] + ); + return { potentialMarkets, exchangeConfigs, hasPotentialMarketsData: Boolean(potentialMarkets && exchangeConfigs), + liquidityTiers, }; }; diff --git a/src/hooks/useSelectedNetwork.ts b/src/hooks/useSelectedNetwork.ts index 9b7a898..b7086b7 100644 --- a/src/hooks/useSelectedNetwork.ts +++ b/src/hooks/useSelectedNetwork.ts @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { LocalStorageKey } from '@/constants/localStorage'; -import { DEFAULT_APP_ENVIRONMENT, DydxNetwork, ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { DEFAULT_APP_ENVIRONMENT, DydxNetwork } from '@/constants/networks'; import { useAccounts, useLocalStorage } from '@/hooks'; diff --git a/src/hooks/useSubaccount.tsx b/src/hooks/useSubaccount.tsx index cfd2588..c975f76 100644 --- a/src/hooks/useSubaccount.tsx +++ b/src/hooks/useSubaccount.tsx @@ -28,7 +28,7 @@ import { setSubaccount, setHistoricalPnl, removeUncommittedOrderClientId } from import { getBalances } from '@/state/accountSelectors'; import abacusStateManager from '@/lib/abacus'; -import { hashFromTx } from '@/lib/hashfromTx'; +import { hashFromTx } from '@/lib/txUtils'; import { log } from '@/lib/telemetry'; import { useAccounts } from './useAccounts'; @@ -433,7 +433,7 @@ export const useSubaccountContext = ({ localDydxWallet }: { localDydxWallet?: Lo params, utils.getGovAddNewMarketTitle(params.ticker), utils.getGovAddNewMarketSummary(params.ticker, newMarketProposal.delayBlocks), - newMarketProposal.initialDepositAmount + BigInt(newMarketProposal.initialDepositAmount).toString() ); return response; diff --git a/src/hooks/useTokenConfigs.ts b/src/hooks/useTokenConfigs.ts index 2bbe155..73cc08f 100644 --- a/src/hooks/useTokenConfigs.ts +++ b/src/hooks/useTokenConfigs.ts @@ -1,7 +1,9 @@ -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { useSelector } from 'react-redux'; + +import { TOKEN_CONFIG_MAP } from '@/constants/networks'; import { DydxChainAsset } from '@/constants/wallets'; -import { useSelectedNetwork } from '@/hooks'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; export const useTokenConfigs = (): { tokensConfigs: { @@ -10,31 +12,33 @@ export const useTokenConfigs = (): { name: string; decimals: number; gasDenom?: string; - }, + }; [DydxChainAsset.CHAINTOKEN]: { denom: string; name: string; decimals: number; gasDenom?: string; - }, + }; }; usdcDenom: string; usdcDecimals: number; + usdcGasDenom: string; usdcLabel: string; chainTokenDenom: string; chainTokenDecimals: number; chainTokenLabel: string; } => { - const { selectedNetwork } = useSelectedNetwork(); - const tokensConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].tokens; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const tokensConfigs = TOKEN_CONFIG_MAP[selectedDydxChainId]; - return { + return { tokensConfigs, - usdcDenom: tokensConfigs[DydxChainAsset.USDC].denom, - usdcDecimals: tokensConfigs[DydxChainAsset.USDC].decimals, + usdcDenom: tokensConfigs[DydxChainAsset.USDC].denom, + usdcDecimals: tokensConfigs[DydxChainAsset.USDC].decimals, + usdcGasDenom: tokensConfigs[DydxChainAsset.USDC].gasDenom, usdcLabel: tokensConfigs[DydxChainAsset.USDC].name, chainTokenDenom: tokensConfigs[DydxChainAsset.CHAINTOKEN].denom, - chainTokenDecimals: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals, + chainTokenDecimals: tokensConfigs[DydxChainAsset.CHAINTOKEN].decimals, chainTokenLabel: tokensConfigs[DydxChainAsset.CHAINTOKEN].name, }; }; diff --git a/src/hooks/useURLConfigs.ts b/src/hooks/useURLConfigs.ts index 9c92cd1..8820973 100644 --- a/src/hooks/useURLConfigs.ts +++ b/src/hooks/useURLConfigs.ts @@ -1,36 +1,42 @@ -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { useSelector } from 'react-redux'; -import { useSelectedNetwork } from '@/hooks'; +import { LINKS_CONFIG_MAP } from '@/constants/networks'; + +import { getSelectedDydxChainId } from '@/state/appSelectors'; const FALLBACK_URL = 'https://help.dydx.exchange/'; export interface LinksConfigs { - tos: string, - privacy: string, - mintscan: string, - mintscanBase: string, - feedback?: string, - help?: string, - blogs?: string, - foundation?: string, - initialMarginFractionLearnMore?: string, - reduceOnlyLearnMore?: string, - documentation?: string, - community?: string, - governanceLearnMore?: string, - stakingLearnMore?: string, - keplrDashboard?: string, - accountExportLearnMore?: string, - walletLearnMore?: string + tos: string; + privacy: string; + statusPage: string; + mintscan: string; + mintscanBase: string; + feedback?: string; + help?: string; + blogs?: string; + foundation?: string; + initialMarginFractionLearnMore?: string; + reduceOnlyLearnMore?: string; + documentation?: string; + community?: string; + governanceLearnMore?: string; + newMarketProposalLearnMore: string; + stakingLearnMore?: string; + keplrDashboard?: string; + strideZoneApp?: string; + accountExportLearnMore?: string; + walletLearnMore?: string; } export const useURLConfigs = (): LinksConfigs => { - const { selectedNetwork } = useSelectedNetwork(); - const linksConfigs = ENVIRONMENT_CONFIG_MAP[selectedNetwork].links as LinksConfigs; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const linksConfigs = LINKS_CONFIG_MAP[selectedDydxChainId] as LinksConfigs; return { tos: linksConfigs.tos, privacy: linksConfigs.privacy, + statusPage: linksConfigs.statusPage, mintscan: linksConfigs.mintscan, mintscanBase: linksConfigs.mintscanBase, feedback: linksConfigs.feedback || FALLBACK_URL, @@ -42,8 +48,10 @@ export const useURLConfigs = (): LinksConfigs => { documentation: linksConfigs.documentation || FALLBACK_URL, community: linksConfigs.community || FALLBACK_URL, governanceLearnMore: linksConfigs.governanceLearnMore || FALLBACK_URL, + newMarketProposalLearnMore: linksConfigs.newMarketProposalLearnMore || FALLBACK_URL, stakingLearnMore: linksConfigs.stakingLearnMore || FALLBACK_URL, keplrDashboard: linksConfigs.keplrDashboard || FALLBACK_URL, + strideZoneApp: linksConfigs.strideZoneApp || FALLBACK_URL, accountExportLearnMore: linksConfigs.accountExportLearnMore || FALLBACK_URL, walletLearnMore: linksConfigs.walletLearnMore || FALLBACK_URL, }; diff --git a/src/hooks/useWalletConnection.ts b/src/hooks/useWalletConnection.ts index cb64f02..39b8887 100644 --- a/src/hooks/useWalletConnection.ts +++ b/src/hooks/useWalletConnection.ts @@ -4,7 +4,7 @@ import { useSelector } from 'react-redux'; import { EvmDerivedAddresses } from '@/constants/account'; import { STRING_KEYS } from '@/constants/localization'; import { LocalStorageKey } from '@/constants/localStorage'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { ENVIRONMENT_CONFIG_MAP, WALLETS_CONFIG_MAP } from '@/constants/networks'; import { type DydxAddress, @@ -32,7 +32,7 @@ import { WalletType as CosmosWalletType, } from 'graz'; -import { getSelectedNetwork } from '@/state/appSelectors'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; import { resolveWagmiConnector } from '@/lib/wagmi'; import { getWalletConnection, parseWalletError } from '@/lib/wallet'; @@ -91,8 +91,8 @@ export const useWalletConnection = () => { // Wallet connection - const selectedNetwork = useSelector(getSelectedNetwork); - const walletConnectConfig = ENVIRONMENT_CONFIG_MAP[selectedNetwork].wallets.walletconnect; + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const walletConnectConfig = WALLETS_CONFIG_MAP[selectedDydxChainId].walletconnect; const wagmiConnector = useMemo( () => walletType && walletConnectionType @@ -115,7 +115,15 @@ export const useWalletConnection = () => { }); const connectWallet = useCallback( - async ({ walletType, forceConnect }: { walletType?: WalletType; forceConnect?: boolean }) => { + async ({ + walletType, + forceConnect, + isAccountConnected, + }: { + walletType?: WalletType; + forceConnect?: boolean; + isAccountConnected?: boolean; + }) => { if (!walletType) return { walletType, walletConnectionType }; const walletConnection = getWalletConnection({ walletType }); @@ -143,9 +151,6 @@ export const useWalletConnection = () => { } else if (walletConnection.type === WalletConnectionType.TestWallet) { saveEvmAddress(STRING_KEYS.TEST_WALLET as EvmAddress); } else { - const isAccountConnected = Boolean( - evmAddress && evmDerivedAddresses[evmAddress]?.encryptedSignature - ); // if account connected (via remember me), do not show wagmi popup until forceConnect if (!isConnectedWagmi && (forceConnect || !isAccountConnected)) { await connectWagmi({ @@ -158,17 +163,20 @@ export const useWalletConnection = () => { } } } catch (error) { - throw Object.assign( - new Error([error.message, error.cause?.message].filter(Boolean).join('\n')), - { - walletConnectionType: walletConnection?.type, - } - ); + const { isErrorExpected } = parseWalletError({ error, stringGetter }); + if (!isErrorExpected) { + throw Object.assign( + new Error([error.message, error.cause?.message].filter(Boolean).join('\n')), + { + walletConnectionType: walletConnection?.type, + } + ); + } } return { walletType, - walletConnectionType: walletConnection.type, + walletConnectionType: walletConnection?.type, }; }, [isConnectedGraz, signerGraz, isConnectedWagmi, signerWagmi] @@ -195,6 +203,9 @@ export const useWalletConnection = () => { try { const { walletType, walletConnectionType } = await connectWallet({ walletType: selectedWalletType, + isAccountConnected: Boolean( + evmAddress && evmDerivedAddresses[evmAddress]?.encryptedSignature + ), }); setWalletType(walletType); @@ -217,7 +228,7 @@ export const useWalletConnection = () => { await disconnectWallet(); } })(); - }, [selectedWalletType, signerWagmi, signerGraz]); + }, [selectedWalletType, signerWagmi, signerGraz, evmDerivedAddresses, evmAddress]); const selectWalletType = async (walletType: WalletType | undefined) => { if (selectedWalletType) { diff --git a/src/icons/chaos-labs.tsx b/src/icons/chaos-labs.tsx new file mode 100644 index 0000000..cf42b6d --- /dev/null +++ b/src/icons/chaos-labs.tsx @@ -0,0 +1,62 @@ +import { useSelector } from 'react-redux'; + +import { AppTheme } from '@/state/configs'; +import { getAppTheme } from '@/state/configsSelectors'; + +const ChaosLabsIcon: React.FC = () => { + const appTheme = useSelector(getAppTheme); + + const fills = appTheme === AppTheme.Light ? ['#1482E5', '#000000'] : ['#1482E5', '#E5E9EB']; + + return ( + + + + + + + + + + + + + + ); +}; + +export default ChaosLabsIcon; diff --git a/src/icons/currency-sign.svg b/src/icons/currency-sign.svg new file mode 100644 index 0000000..f8b4440 --- /dev/null +++ b/src/icons/currency-sign.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/icons/gear.svg b/src/icons/gear.svg index 456a6b7..5bad862 100644 --- a/src/icons/gear.svg +++ b/src/icons/gear.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/src/icons/governance.svg b/src/icons/governance.svg new file mode 100644 index 0000000..4c17dfe --- /dev/null +++ b/src/icons/governance.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/index.ts b/src/icons/index.ts index a70c120..836b130 100644 --- a/src/icons/index.ts +++ b/src/icons/index.ts @@ -19,6 +19,7 @@ export { default as CoinMarketCapIcon } from './logos/coinmarketcap.svg'; export { default as CoinsIcon } from './coins.svg'; export { default as CommentIcon } from './comment.svg'; export { default as CopyIcon } from './copy.svg'; +export { default as CurrencySignIcon } from './currency-sign.svg'; export { default as DepositIcon } from './deposit.svg'; export { default as DepthChartIcon } from './depth-chart.svg'; export { default as DiscordIcon } from './discord.svg'; @@ -28,13 +29,13 @@ export { default as FileIcon } from './file.svg'; export { default as FundingChartIcon } from './funding-chart.svg'; export { default as GearIcon } from './gear.svg'; export { default as GiftboxIcon } from './giftbox.svg'; +export { default as GovernanceIcon } from './governance.svg'; export { default as HelpCircleIcon } from './help-circle.svg'; export { default as HideIcon } from './hide.svg'; export { default as HistoryIcon } from './history.svg'; export { default as LeaderboardIcon } from './leaderboard.svg'; export { default as LinkOutIcon } from './link-out.svg'; export { default as LockIcon } from './lock.svg'; -export { default as LogoShortIcon } from './logo-short'; export { default as MarketsIcon } from './markets.svg'; export { default as MenuIcon } from './menu.svg'; export { default as MigrateIcon } from './migrate.svg'; @@ -60,6 +61,7 @@ export { default as StarIcon } from './star.svg'; export { default as SunIcon } from './sun.svg'; export { default as TerminalIcon } from './terminal.svg'; export { default as TogglesMenuIcon } from './toggles-menu.svg'; +export { default as TokenIcon } from './token.svg'; export { default as TradeIcon } from './trade.svg'; export { default as TransferIcon } from './transfer.svg'; export { default as TriangleIcon } from './triangle.svg'; @@ -90,7 +92,9 @@ export { default as WebsiteIcon } from './website.svg'; export { default as WhitepaperIcon } from './whitepaper.svg'; // Logos +export { default as ChaosLabsIcon } from './chaos-labs'; export { default as EtherscanIcon } from './logos/etherscan.svg'; +export { default as LogoShortIcon } from './logo-short'; // Trade export { default as OrderCanceledIcon } from './trade/order-canceled.svg'; diff --git a/src/icons/logo-short.tsx b/src/icons/logo-short.tsx index 81ffe2f..a681fdc 100644 --- a/src/icons/logo-short.tsx +++ b/src/icons/logo-short.tsx @@ -1,7 +1,7 @@ -import { useAppThemeContext } from '@/hooks/useAppTheme'; +import { useAppThemeAndColorModeContext } from '@/hooks/useAppThemeAndColorMode'; const LogoShortIcon: React.FC<{ id?: string }> = ({ id }: { id?: string }) => { - const theme = useAppThemeContext(); + const theme = useAppThemeAndColorModeContext(); const fill = theme.logoFill; return ( diff --git a/src/icons/moon.svg b/src/icons/moon.svg index 806f9d5..e01a7f4 100644 --- a/src/icons/moon.svg +++ b/src/icons/moon.svg @@ -1,3 +1,3 @@ - + diff --git a/src/icons/sun.svg b/src/icons/sun.svg index 1fa6e88..84a25c5 100644 --- a/src/icons/sun.svg +++ b/src/icons/sun.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/icons/token.svg b/src/icons/token.svg new file mode 100644 index 0000000..10197b1 --- /dev/null +++ b/src/icons/token.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/layout/DialogManager.tsx b/src/layout/DialogManager.tsx index d7145ae..4c5ec7e 100644 --- a/src/layout/DialogManager.tsx +++ b/src/layout/DialogManager.tsx @@ -9,6 +9,7 @@ import { getActiveDialog } from '@/state/dialogsSelectors'; import { ClosePositionDialog } from '@/views/dialogs/ClosePositionDialog'; import { DepositDialog } from '@/views/dialogs/DepositDialog'; import { DisconnectDialog } from '@/views/dialogs/DisconnectDialog'; +import { DisplaySettingsDialog } from '@/views/dialogs/DisplaySettingsDialog'; import { ExchangeOfflineDialog } from '@/views/dialogs/ExchangeOfflineDialog'; import { HelpDialog } from '@/views/dialogs/HelpDialog'; import { ExternalLinkDialog } from '@/views/dialogs/ExternalLinkDialog'; @@ -29,6 +30,7 @@ import { OrderDetailsDialog } from '@/views/dialogs/DetailsDialog/OrderDetailsDi import { FillDetailsDialog } from '@/views/dialogs/DetailsDialog/FillDetailsDialog'; import { NewMarketMessageDetailsDialog } from '@/views/dialogs/NewMarketMessageDetailsDialog'; import { NewMarketAgreementDialog } from '@/views/dialogs/NewMarketAgreementDialog'; +import { ExternalNavStrideDialog } from '@/views/dialogs/ExternalNavStrideDialog'; export const DialogManager = () => { const dispatch = useDispatch(); @@ -51,12 +53,14 @@ export const DialogManager = () => { return { [DialogTypes.ClosePosition]: , [DialogTypes.Deposit]: , + [DialogTypes.DisplaySettings]: , [DialogTypes.DisconnectWallet]: , [DialogTypes.ExchangeOffline]: , [DialogTypes.FillDetails]: , [DialogTypes.Help]: , [DialogTypes.ExternalNavKeplr]: , [DialogTypes.ExternalLink]: , + [DialogTypes.ExternalNavStride]: , [DialogTypes.MnemonicExport]: , [DialogTypes.MobileSignIn]: , [DialogTypes.Onboarding]: , diff --git a/src/layout/Footer/FooterDesktop.tsx b/src/layout/Footer/FooterDesktop.tsx index d6f3d1c..9a6c524 100644 --- a/src/layout/Footer/FooterDesktop.tsx +++ b/src/layout/Footer/FooterDesktop.tsx @@ -3,9 +3,9 @@ import styled, { type AnyStyledComponent, css } from 'styled-components'; import { AbacusApiStatus } from '@/constants/abacus'; import { ButtonSize, ButtonType } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; -import { ENVIRONMENT_CONFIG_MAP, isDev } from '@/constants/networks'; +import { isDev } from '@/constants/networks'; -import { useApiState, useSelectedNetwork, useStringGetter } from '@/hooks'; +import { useApiState, useStringGetter, useURLConfigs } from '@/hooks'; import { ChatIcon, LinkOutIcon } from '@/icons'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -28,8 +28,7 @@ enum ExchangeStatus { export const FooterDesktop = () => { const stringGetter = useStringGetter(); const { height, indexerHeight, status, statusErrorMessage } = useApiState(); - const { selectedNetwork } = useSelectedNetwork(); - const { statusPage } = ENVIRONMENT_CONFIG_MAP[selectedNetwork].links; + const { statusPage } = useURLConfigs(); const { exchangeStatus, label } = !status || status === AbacusApiStatus.NORMAL @@ -127,7 +126,7 @@ Styled.StatusDot = styled.div<{ exchangeStatus: ExchangeStatus }>` background-color: ${({ exchangeStatus }) => ({ [ExchangeStatus.Degraded]: css`var(--color-warning)`, - [ExchangeStatus.Operational]: css`var(--color-positive)`, + [ExchangeStatus.Operational]: css`var(--color-success)`, }[exchangeStatus])}; `; diff --git a/src/lib/abacus/dydxChainTransactions.ts b/src/lib/abacus/dydxChainTransactions.ts index f0e5c6e..5338efa 100644 --- a/src/lib/abacus/dydxChainTransactions.ts +++ b/src/lib/abacus/dydxChainTransactions.ts @@ -31,9 +31,10 @@ import { type HumanReadableTransferPayload, } from '@/constants/abacus'; +import { DEFAULT_TRANSACTION_MEMO } from '@/constants/analytics'; import { DialogTypes } from '@/constants/dialogs'; import { UNCOMMITTED_ORDER_TIMEOUT_MS } from '@/constants/trade'; -import { ENVIRONMENT_CONFIG_MAP, DydxNetwork, isTestnet } from '@/constants/networks'; +import { DydxNetwork, isTestnet } from '@/constants/networks'; import { RootStore } from '@/state/_store'; import { addUncommittedOrderClientId, removeUncommittedOrderClientId } from '@/state/account'; @@ -42,7 +43,8 @@ import { openDialog } from '@/state/dialogs'; import { StatefulOrderError } from '../errors'; import { bytesToBigInt } from '../numbers'; import { log } from '../telemetry'; -import { hashFromTx } from '../hashfromTx'; +import { hashFromTx, getMintscanTxLink } from '../txUtils'; +import { getDydxChainIdFromNetwork } from '../network'; class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { private compositeClient: CompositeClient | undefined; @@ -115,7 +117,8 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { { broadcastPollIntervalMs: 3_000, broadcastTimeoutMs: 60_000, - } + }, + DEFAULT_TRANSACTION_MEMO ) ) ); @@ -236,9 +239,10 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { if (isTestnet) { console.log( - `${ENVIRONMENT_CONFIG_MAP[ - this.compositeClient.network.getString() as DydxNetwork - ]?.links?.mintscan?.replace('{tx_hash}', hash.toString())}` + getMintscanTxLink( + getDydxChainIdFromNetwork(this.compositeClient.network.getString() as DydxNetwork), + hash + ) ); } else console.log(`txHash: ${hash}`); @@ -370,8 +374,8 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { value: { ...params.msg, timeoutTimestamp: params.msg.timeoutTimestamp - // Squid returns timeoutTimestamp as Long, but the signer expects BigInt - ? BigInt(Long.fromValue(params.msg.timeoutTimestamp).toString()) + ? // Squid returns timeoutTimestamp as Long, but the signer expects BigInt + BigInt(Long.fromValue(params.msg.timeoutTimestamp).toString()) : undefined, }, }; @@ -387,7 +391,11 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { } ibcMsg.value.token.amount = amount.toString(); - const tx = await this.nobleClient.send([ibcMsg]); + const tx = await this.nobleClient.send( + [ibcMsg], + undefined, + `${DEFAULT_TRANSACTION_MEMO} | ${this.nobleWallet?.address}` + ); const parsedTx = this.parseToPrimitives(tx); @@ -426,8 +434,8 @@ class DydxChainTransactions implements AbacusDYDXChainTransactionsProtocol { value: { ...parsedIbcPayload.msg, timeoutTimestamp: parsedIbcPayload.msg.timeoutTimestamp - // Squid returns timeoutTimestamp as Long, but the signer expects BigInt - ? BigInt(Long.fromValue(parsedIbcPayload.msg.timeoutTimestamp).toString()) + ? // Squid returns timeoutTimestamp as Long, but the signer expects BigInt + BigInt(Long.fromValue(parsedIbcPayload.msg.timeoutTimestamp).toString()) : undefined, }, }; diff --git a/src/lib/abacus/index.ts b/src/lib/abacus/index.ts index 199f834..c3be440 100644 --- a/src/lib/abacus/index.ts +++ b/src/lib/abacus/index.ts @@ -3,6 +3,8 @@ import type { LocalWallet } from '@dydxprotocol/v4-client-js'; import type { ClosePositionInputFields, Nullable, + HistoricalTradingRewardsPeriod, + HistoricalTradingRewardsPeriods, HumanReadablePlaceOrderPayload, HumanReadableCancelOrderPayload, TradeInputFields, @@ -23,6 +25,7 @@ import { CoroutineTimer, TransferType, AbacusAppConfig, + ApiData, } from '@/constants/abacus'; import { DEFAULT_MARKETID } from '@/constants/markets'; @@ -33,8 +36,6 @@ import type { RootStore } from '@/state/_store'; import { setTradeFormInputs } from '@/state/inputs'; import { getInputTradeOptions, getTransferInputs } from '@/state/inputsSelectors'; -import { testFlags } from '@/lib/testFlags'; - import AbacusRest from './rest'; import AbacusAnalytics from './analytics'; import AbacusWebsocket from './websocket'; @@ -227,6 +228,15 @@ class AbacusStateManager { this.stateManager.historicalPnlPeriod = period; }; + setHistoricalTradingRewardPeriod = ( + period: (typeof HistoricalTradingRewardsPeriod)[keyof typeof HistoricalTradingRewardsPeriod] + ) => { + this.stateManager.historicalTradingRewardPeriod = period; + }; + + refreshHistoricalTradingRewards = () => + this.stateManager.refresh(ApiData.HISTORICAL_TRADING_REWARDS); + switchNetwork = (network: DydxNetwork) => { this.stateManager.environmentId = network; @@ -278,6 +288,9 @@ class AbacusStateManager { getHistoricalPnlPeriod = (): Nullable => this.stateManager.historicalPnlPeriod; + getHistoricalTradingRewardPeriod = (): HistoricalTradingRewardsPeriods => + this.stateManager.historicalTradingRewardPeriod; + handleCandlesSubscription = ({ channelId, subscribe, diff --git a/src/lib/abacus/stateNotification.ts b/src/lib/abacus/stateNotification.ts index 216b7b7..b8b328c 100644 --- a/src/lib/abacus/stateNotification.ts +++ b/src/lib/abacus/stateNotification.ts @@ -29,6 +29,7 @@ import { setSubaccount, setTransfers, setWallet, + setTradingRewards, } from '@/state/account'; import { setApiState } from '@/state/app'; @@ -96,6 +97,12 @@ class AbacusStateNotifier implements AbacusStateNotificationProtocol { } } + if (changes.has(Changes.tradingRewards)) { + if (updatedState.account?.tradingRewards) { + dispatch(setTradingRewards(updatedState.account?.tradingRewards)); + } + } + if (changes.has(Changes.configs)) { dispatch(setConfigs(updatedState.configs)); } diff --git a/src/lib/csvToArray.ts b/src/lib/csvToArray.ts deleted file mode 100644 index eb3dbf5..0000000 --- a/src/lib/csvToArray.ts +++ /dev/null @@ -1,16 +0,0 @@ -const csvToArray = ({ stringVal, splitter }: { stringVal: string; splitter: string }) => { - const [keys, ...rest] = stringVal - .trim() - .split('\n') - .map((item) => item.split(splitter)); - - const formedArr = rest.map((item) => { - const object: Record = {}; - keys.forEach((key, index) => (object[key] = item[index])); - return object; - }); - - return formedArr as T; -}; - -export default csvToArray; diff --git a/src/lib/hashfromTx.ts b/src/lib/hashfromTx.ts deleted file mode 100644 index 98696e6..0000000 --- a/src/lib/hashfromTx.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const hashFromTx = ( - txHash: string | Uint8Array -): string => `0x${Buffer.from(txHash).toString('hex')}`; diff --git a/src/lib/network.ts b/src/lib/network.ts index 56131de..d6b5418 100644 --- a/src/lib/network.ts +++ b/src/lib/network.ts @@ -1,4 +1,8 @@ -import { type DydxNetwork, ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; +import { type DydxNetwork, ENVIRONMENT_CONFIG_MAP, type DydxChainId } from '@/constants/networks'; export const validateAgainstAvailableEnvironments = (value: DydxNetwork) => Object.keys(ENVIRONMENT_CONFIG_MAP).includes(value); + +export const getDydxChainIdFromNetwork = (network: DydxNetwork) => { + return ENVIRONMENT_CONFIG_MAP[network].dydxChainId as DydxChainId; +}; diff --git a/src/lib/orders.ts b/src/lib/orders.ts index 1aeb926..55c0e46 100644 --- a/src/lib/orders.ts +++ b/src/lib/orders.ts @@ -43,19 +43,19 @@ export const getStatusIconInfo = ({ case AbacusOrderStatus.filled: { return { statusIcon: IconName.OrderFilled, - statusIconColor: `var(--color-positive)`, + statusIconColor: `var(--color-success)`, }; } case AbacusOrderStatus.cancelled: { return { statusIcon: IconName.OrderCanceled, - statusIconColor: `var(--color-negative)`, + statusIconColor: `var(--color-error)`, }; } case AbacusOrderStatus.canceling: { return { statusIcon: IconName.OrderPending, - statusIconColor: `var(--color-negative)`, + statusIconColor: `var(--color-error)`, }; } case AbacusOrderStatus.untriggered: { diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index 66c4b59..a3e1a62 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -19,13 +19,13 @@ class TestFlags { return !!this.queryParams.displayinitializingmarkets; } - get showMobileSignInOption() { - return !!this.queryParams.mobilesignin; - } - get addressOverride():string { return this.queryParams.address; } + + get showTradingRewards() { + return !!this.queryParams.tradingrewards; + } } export const testFlags = new TestFlags(); diff --git a/src/lib/tradingView/utils.ts b/src/lib/tradingView/utils.ts index 5a50209..4359731 100644 --- a/src/lib/tradingView/utils.ts +++ b/src/lib/tradingView/utils.ts @@ -1,6 +1,10 @@ -import { Candle, TradingViewBar, TradingViewSymbol } from '@/constants/candles'; +import { OrderSide } from '@dydxprotocol/v4-client-js'; -import { AppTheme } from '@/state/configs'; +import { Candle, TradingViewBar, TradingViewSymbol } from '@/constants/candles'; +import { THEME_NAMES } from '@/constants/styles/colors'; +import type { ChartLineType } from '@/constants/tvchart'; + +import { type AppColorMode, AppTheme } from '@/state/configs'; import { Themes } from '@/styles/themes'; @@ -47,10 +51,42 @@ export const getHistorySlice = ({ return bars.filter(({ time }) => time >= fromMs); }; -export const getWidgetOverrides = (appTheme: AppTheme) => { - const theme = Themes[appTheme]; +export const getChartLineColors = ({ + appTheme, + appColorMode, + chartLineType, +}: { + appTheme: AppTheme; + appColorMode: AppColorMode; + chartLineType: ChartLineType; +}) => { + const theme = Themes[appTheme][appColorMode]; + const orderColors = { + [OrderSide.BUY]: theme.positive, + [OrderSide.SELL]: theme.negative, + ['position']: null, + }; return { + maybeQuantityColor: orderColors[chartLineType], + borderColor: theme.borderDefault, + backgroundColor: theme.layer1, + textColor: theme.textTertiary, + textButtonColor: theme.textButton, + }; +}; + +export const getWidgetOverrides = ({ + appTheme, + appColorMode, +}: { + appTheme: AppTheme; + appColorMode: AppColorMode; +}) => { + const theme = Themes[appTheme][appColorMode]; + + return { + theme: THEME_NAMES[appTheme], overrides: { 'paneProperties.background': theme.layer2, 'paneProperties.horzGridProperties.color': theme.layer3, diff --git a/src/lib/txUtils.ts b/src/lib/txUtils.ts new file mode 100644 index 0000000..81413fb --- /dev/null +++ b/src/lib/txUtils.ts @@ -0,0 +1,7 @@ +import { DydxChainId, LINKS_CONFIG_MAP } from '@/constants/networks'; + +export const hashFromTx = (txHash: string | Uint8Array): string => + `0x${Buffer.from(txHash).toString('hex')}`; + +export const getMintscanTxLink = (dydxChainId: DydxChainId, txHash: string): string => + `${LINKS_CONFIG_MAP[dydxChainId]?.mintscan?.replace('{tx_hash}', txHash.toString())}`; diff --git a/src/lib/wallet/index.ts b/src/lib/wallet/index.ts index ba11110..7ce29c9 100644 --- a/src/lib/wallet/index.ts +++ b/src/lib/wallet/index.ts @@ -92,6 +92,10 @@ export const getWalletErrorType = ({ error }: { error: Error }) => { return WalletErrorType.ChainMismatch; } + if (messageLower.includes('Missing or invalid. request() method: wallet_switchEthereumChain')) { + return WalletErrorType.SwitchChainMethodMissing; + } + // ImToken - User canceled if (messageLower.includes('用户取消了操作')) { return WalletErrorType.UserCanceled; @@ -113,13 +117,18 @@ export const parseWalletError = ({ }) => { const walletErrorType = getWalletErrorType({ error }); let message; + let isErrorExpected; switch (walletErrorType) { case WalletErrorType.ChainMismatch: - case WalletErrorType.UserCanceled: { + case WalletErrorType.UserCanceled: + case WalletErrorType.SwitchChainMethodMissing: { + isErrorExpected = true; + message = error.message; break; } default: { + isErrorExpected = false; message = stringGetter({ key: STRING_KEYS.SOMETHING_WENT_WRONG_WITH_MESSAGE, params: { @@ -132,5 +141,6 @@ export const parseWalletError = ({ return { walletErrorType, message, + isErrorExpected, }; }; diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index ff362bd..0d5253c 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -4,9 +4,15 @@ import { useDispatch, useSelector } from 'react-redux'; import { useEnsName } from 'wagmi'; import { useNavigate } from 'react-router-dom'; -import { ButtonSize } from '@/constants/buttons'; import { TransferType } from '@/constants/abacus'; - +import { OnboardingState } from '@/constants/account'; +import { ButtonSize } from '@/constants/buttons'; +import { DialogTypes } from '@/constants/dialogs'; +import { STRING_KEYS } from '@/constants/localization'; +import { AppRoute, PortfolioRoute, HistoryRoute } from '@/constants/routes'; +import { wallets } from '@/constants/wallets'; +import { useAccounts, useStringGetter, useTokenConfigs } from '@/hooks'; +import { breakpoints } from '@/styles'; import { layoutMixins } from '@/styles/layoutMixins'; import { Details } from '@/components/Details'; @@ -16,23 +22,21 @@ import { IconButton, type IconButtonProps } from '@/components/IconButton'; import { Panel } from '@/components/Panel'; import { Toolbar } from '@/components/Toolbar'; -import { OnboardingState } from '@/constants/account'; -import { DialogTypes } from '@/constants/dialogs'; -import { STRING_KEYS } from '@/constants/localization'; -import { AppRoute, PortfolioRoute, HistoryRoute } from '@/constants/routes'; -import { wallets } from '@/constants/wallets'; -import { useAccounts, useStringGetter, useTokenConfigs } from '@/hooks'; - -import { getOnboardingState } from '@/state/accountSelectors'; +import { + getHistoricalTradingRewardsForCurrentWeek, + getOnboardingState, +} from '@/state/accountSelectors'; import { openDialog } from '@/state/dialogs'; import { isTruthy } from '@/lib/isTruthy'; import { truncateAddress } from '@/lib/wallet'; -import { DYDXBalancePanel } from './rewards/DYDXBalancePanel'; -import { MigratePanel } from './rewards/MigratePanel'; -import { GovernancePanel } from './rewards/GovernancePanel'; -import { StakingPanel } from './rewards/StakingPanel'; +import { DYDXBalancePanel } from './token/rewards/DYDXBalancePanel'; +import { MigratePanel } from './token/rewards/MigratePanel'; +import { GovernancePanel } from './token/rewards/GovernancePanel'; +import { StakingPanel } from './token/staking/StakingPanel'; +import { StrideStakingPanel } from './token/staking/StrideStakingPanel'; +import { NewMarketsPanel } from './token/rewards/NewMarketsPanel'; const ENS_CHAIN_ID = 1; // Ethereum @@ -52,6 +56,8 @@ const Profile = () => { chainId: ENS_CHAIN_ID, }); + const currentWeekTradingReward = useSelector(getHistoricalTradingRewardsForCurrentWeek); + const actions = [ { key: 'deposit', @@ -159,64 +165,62 @@ const Profile = () => { ); })} - - - - {stringGetter({ key: STRING_KEYS.SETTINGS })} - - } - onClick={() => navigate(AppRoute.Settings)} + + + + {stringGetter({ key: STRING_KEYS.SETTINGS })} + + } + onClick={() => navigate(AppRoute.Settings)} + /> + + + {stringGetter({ key: STRING_KEYS.HELP })} + + } + onClick={() => dispatch(openDialog({ type: DialogTypes.Help }))} + /> + + + + + + + - - - {stringGetter({ key: STRING_KEYS.HELP })} - - } - onClick={() => dispatch(openDialog({ type: DialogTypes.Help }))} + + + - + - - - - - - - - - - - - - { ]} withInnerBorders={false} /> - + - - + + + + ); }; @@ -245,14 +251,43 @@ const Styled: Record = {}; Styled.MobileProfileLayout = styled.div` ${layoutMixins.contentContainerPage} + display: grid; gap: 1rem; padding: 1.25rem 0.9rem; max-width: 100vw; + + grid-template-columns: 1fr 1fr; + + grid-template-areas: + 'header header' + 'actions actions' + 'settings help' + 'migrate migrate' + 'balance balance' + 'rewards fees' + 'history history' + 'governance newMarkets' + 'keplr stride'; + + @media ${breakpoints.mobile} { + grid-template-areas: + 'header header' + 'actions actions' + 'settings help' + 'migrate migrate' + 'balance balance' + 'rewards fees' + 'history history' + 'governance governance' + 'newMarkets newMarkets' + 'keplr keplr' + 'stride stride'; + } `; Styled.Header = styled.header` + grid-area: header; ${layoutMixins.row} - padding: 0 1rem; `; @@ -286,10 +321,10 @@ Styled.ConnectedIcon = styled.div` height: 0.5rem; width: 0.5rem; margin-right: 0.25rem; - background: var(--color-positive); + background: var(--color-success); border-radius: 50%; - box-shadow: 0 0 0 0.2rem var(--color-gradient-positive); + box-shadow: 0 0 0 0.2rem var(--color-gradient-success); `; Styled.Address = styled.h1` @@ -299,6 +334,7 @@ Styled.Address = styled.h1` Styled.Actions = styled(Toolbar)` ${layoutMixins.spacedRow} --stickyArea-topHeight: 5rem; + grid-area: actions; > a, > label { @@ -318,7 +354,7 @@ Styled.ActionButton = styled(IconButton)<{ iconName?: IconName }>` ${({ iconName }) => iconName === IconName.Close ? css` - --button-textColor: var(--color-negative); + --button-textColor: var(--color-red); --button-icon-size: 0.75em; ` : iconName === IconName.Transfer && @@ -329,22 +365,16 @@ Styled.ActionButton = styled(IconButton)<{ iconName?: IconName }>` `} `; -Styled.EqualGrid = styled.div` - ${layoutMixins.gridEqualColumns} - - gap: 1rem; -`; - Styled.Details = styled(Details)` font: var(--font-small-book); --details-value-font: var(--font-medium-book); `; Styled.RewardsPanel = styled(Panel)` + grid-area: rewards; align-self: flex-start; - - &, - > * { + height: 100%; + > div { height: 100%; } @@ -353,7 +383,12 @@ Styled.RewardsPanel = styled(Panel)` } `; -Styled.TablePanel = styled(Panel)` +Styled.FeesPanel = styled(Panel)` + grid-area: fees; +`; + +Styled.HistoryPanel = styled(Panel)` + grid-area: history; --panel-content-paddingY: 0; --panel-content-paddingX: 0; @@ -393,3 +428,35 @@ Styled.PanelButton = styled(Panel)` --panel-paddingY: 0 --panel-paddingX:0; `; + +Styled.SettingsButton = styled(Styled.PanelButton)` + grid-area: settings; +`; + +Styled.HelpButton = styled(Styled.PanelButton)` + grid-area: help; +`; + +Styled.MigratePanel = styled(MigratePanel)` + grid-area: migrate; +`; + +Styled.DYDXBalancePanel = styled(DYDXBalancePanel)` + grid-area: balance; +`; + +Styled.GovernancePanel = styled(GovernancePanel)` + grid-area: governance; +`; + +Styled.StakingPanel = styled(StakingPanel)` + grid-area: keplr; +`; + +Styled.NewMarketsPanel = styled(NewMarketsPanel)` + grid-area: newMarkets; +`; + +Styled.StrideStakingPanel = styled(StrideStakingPanel)` + grid-area: stride; +`; diff --git a/src/pages/portfolio/AccountDetailsAndHistory.tsx b/src/pages/portfolio/AccountDetailsAndHistory.tsx index 6a27424..ca304e3 100644 --- a/src/pages/portfolio/AccountDetailsAndHistory.tsx +++ b/src/pages/portfolio/AccountDetailsAndHistory.tsx @@ -272,7 +272,7 @@ Styled.AccountDetail = styled.div<{ gridArea: string }>` Styled.PnlChart = styled(PnlChart)<{ pnlDiffSign: NumberSign }>` grid-area: Chart; - background-color: var(--color-layer-1); + background-color: var(--color-layer-2); --pnl-line-color: ${({ pnlDiffSign }) => ({ diff --git a/src/pages/portfolio/Portfolio.tsx b/src/pages/portfolio/Portfolio.tsx index f3652b0..58aaeff 100644 --- a/src/pages/portfolio/Portfolio.tsx +++ b/src/pages/portfolio/Portfolio.tsx @@ -45,7 +45,8 @@ export default () => { const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {}; const { nativeTokenBalance } = useAccountBalance(); - const { numTotalPositions, numTotalOpenOrders } = useSelector(getTradeInfoNumbers, shallowEqual) || {}; + const { numTotalPositions, numTotalOpenOrders } = + useSelector(getTradeInfoNumbers, shallowEqual) || {}; const numPositions = shortenNumberForDisplay(numTotalPositions); const numOrders = shortenNumberForDisplay(numTotalOpenOrders); @@ -119,30 +120,43 @@ export default () => { items: [ { value: PortfolioRoute.Overview, - slotBefore: , + slotBefore: ( + + + + ), label: stringGetter({ key: STRING_KEYS.OVERVIEW }), href: PortfolioRoute.Overview, }, { value: PortfolioRoute.Positions, - slotBefore: , + slotBefore: ( + + + + ), label: ( <> {stringGetter({ key: STRING_KEYS.POSITIONS })} - {numPositions > 0 && ( - {numPositions} - )} + {numPositions && + (typeof numPositions === 'string' || numPositions > 0) && ( + {numPositions} + )} ), href: PortfolioRoute.Positions, }, { value: PortfolioRoute.Orders, - slotBefore: , + slotBefore: ( + + + + ), label: ( <> {stringGetter({ key: STRING_KEYS.ORDERS })} - {numOrders > 0 && ( + {numOrders && (typeof numOrders === 'string' || numOrders > 0) && ( {numOrders} )} @@ -151,13 +165,21 @@ export default () => { }, { value: PortfolioRoute.Fees, - slotBefore: , + slotBefore: ( + + + + ), label: stringGetter({ key: STRING_KEYS.FEES }), href: PortfolioRoute.Fees, }, { value: PortfolioRoute.History, - slotBefore: , + slotBefore: ( + + + + ), label: stringGetter({ key: STRING_KEYS.HISTORY }), href: PortfolioRoute.History, }, @@ -232,16 +254,14 @@ Styled.NavigationMenu = styled(NavigationMenu)` padding-top: 0; `; -Styled.Icon = styled(Icon)` - --icon-backgroundColor: var(--color-layer-4); - - width: 1em; - height: 1em; - - margin-left: -0.25em; - - box-sizing: content-box; - background-color: var(--icon-backgroundColor); +Styled.IconContainer = styled.div` + width: 1.5rem; + height: 1.5rem; + font-size: 0.75rem; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--color-layer-4); border-radius: 50%; - padding: 0.25em; + margin-left: -0.25rem; `; diff --git a/src/pages/rewards/RewardsPage.tsx b/src/pages/rewards/RewardsPage.tsx deleted file mode 100644 index 4329ca6..0000000 --- a/src/pages/rewards/RewardsPage.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import styled, { AnyStyledComponent } from 'styled-components'; -import { useDispatch } from 'react-redux'; -import { useNavigate } from 'react-router-dom'; - -import { STRING_KEYS } from '@/constants/localization'; -import { AppRoute } from '@/constants/routes'; - -import { useBreakpoints, useStringGetter } from '@/hooks'; - -import { breakpoints } from '@/styles'; -import { layoutMixins } from '@/styles/layoutMixins'; - -import { BackButton } from '@/components/BackButton'; -import { Panel } from '@/components/Panel'; - -import { DYDXBalancePanel } from './DYDXBalancePanel'; -import { LaunchIncentivesPanel } from './LaunchIncentivesPanel'; -import { MigratePanel } from './MigratePanel'; -import { RewardsHelpPanel } from './RewardsHelpPanel'; -import { GovernancePanel } from './GovernancePanel'; -import { StakingPanel } from './StakingPanel'; -import { NewMarketsPanel } from './NewMarketsPanel'; - -const RewardsPage = () => { - const dispatch = useDispatch(); - const stringGetter = useStringGetter(); - const { isTablet, isNotTablet } = useBreakpoints(); - const navigate = useNavigate(); - - return ( - - {isTablet && ( - - navigate(AppRoute.Profile)} /> - {stringGetter({ key: STRING_KEYS.TRADING_REWARDS })} - - )} - {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } - - {isTablet ? ( - - ) : ( - - - - - )} - {isNotTablet && ( - - - - - - )} - - - - ); -}; - -export default RewardsPage; - -const Styled: Record = {}; - -Styled.Page = styled.div` - ${layoutMixins.contentContainerPage} - gap: 1.5rem; - padding: 2rem; - align-items: center; - - > * { - --content-max-width: 80rem; - max-width: min(calc(100vw - 4rem), var(--content-max-width)); - } - - @media ${breakpoints.tablet} { - --stickyArea-topHeight: var(--page-header-height-mobile); - padding: 0 1rem 1rem; - - > * { - max-width: calc(100vw - 2rem); - width: 100%; - } - } -`; - -Styled.MobileHeader = styled.header` - ${layoutMixins.contentSectionDetachedScrollable} - ${layoutMixins.stickyHeader} - z-index: 2; - padding: 1.25rem 0; - margin-bottom: -1.5rem; - - font: var(--font-large-medium); - color: var(--color-text-2); - background-color: var(--color-layer-2); -`; - -Styled.Panel = styled(Panel)` - height: fit-content; -`; - -Styled.PanelRow = styled.div` - ${layoutMixins.gridEqualColumns} - gap: 1.5rem; - - @media ${breakpoints.tablet} { - grid-auto-flow: row; - grid-template-columns: 1fr; - } -`; - -Styled.PanelRowIncentivesAndBalance = styled(Styled.PanelRow)` - grid-template-columns: 2fr 1fr; -`; diff --git a/src/pages/token/Governance.tsx b/src/pages/token/Governance.tsx new file mode 100644 index 0000000..723f0ec --- /dev/null +++ b/src/pages/token/Governance.tsx @@ -0,0 +1,60 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter } from '@/hooks'; +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { DetachedSection } from '@/components/ContentSection'; +import { ContentSectionHeader } from '@/components/ContentSectionHeader'; + +import { GovernancePanel } from './rewards/GovernancePanel'; +import { NewMarketsPanel } from './rewards/NewMarketsPanel'; + +export default () => { + const stringGetter = useStringGetter(); + + return ( + + + + + + + + + + + + + ); +}; + +const Styled: Record = {}; + +Styled.HeaderSection = styled.section` + ${layoutMixins.contentSectionDetached} + + @media ${breakpoints.tablet} { + ${layoutMixins.flexColumn} + gap: 1rem; + + margin-bottom: 0.5rem; + } +`; + +Styled.ContentWrapper = styled.div` + ${layoutMixins.flexColumn} + gap: 1.5rem; + max-width: 80rem; + padding: 0 1rem; +`; + +Styled.Row = styled.div` + gap: 1rem; + display: grid; + grid-template-columns: repeat(3, 1fr); +`; diff --git a/src/pages/token/Token.tsx b/src/pages/token/Token.tsx new file mode 100644 index 0000000..6471f21 --- /dev/null +++ b/src/pages/token/Token.tsx @@ -0,0 +1,126 @@ +import { Suspense, lazy } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; +import styled, { AnyStyledComponent } from 'styled-components'; + +import { STRING_KEYS } from '@/constants/localization'; +import { TokenRoute } from '@/constants/routes'; +import { useBreakpoints, useStringGetter } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from '@/components/Icon'; +import { LoadingSpace } from '@/components/Loading/LoadingSpinner'; +import { NavigationMenu } from '@/components/NavigationMenu'; +import { WithSidebar } from '@/components/WithSidebar'; + +const RewardsPage = lazy(() => import('./rewards/RewardsPage')); +const StakingPage = lazy(() => import('./staking/StakingPage')); +const GovernancePage = lazy(() => import('./Governance')); + +export default () => { + const { isTablet } = useBreakpoints(); + const stringGetter = useStringGetter(); + + const routesComponent = ( + }> + + } /> + } /> + } /> + } /> + + + ); + + return ( + + + + + ), + label: stringGetter({ key: STRING_KEYS.TRADING_REWARDS }), + href: TokenRoute.TradingRewards, + }, + { + value: TokenRoute.StakingRewards, + slotBefore: ( + + + + ), + label: stringGetter({ key: STRING_KEYS.STAKING_REWARDS }), + href: TokenRoute.StakingRewards, + tag: stringGetter({ key: STRING_KEYS.NEW }), + }, + { + value: TokenRoute.Governance, + slotBefore: ( + + + + ), + label: stringGetter({ key: STRING_KEYS.GOVERNANCE }), + href: TokenRoute.Governance, + }, + ], + }, + ]} + /> + + ) + } + > + {routesComponent} + + ); +}; + +const Styled: Record = {}; + +Styled.SideBar = styled.div` + ${layoutMixins.flexColumn} + justify-content: space-between; + + height: 100%; +`; + +Styled.Footer = styled.div` + ${layoutMixins.row} + flex-wrap: wrap; + + padding: 1rem; + + gap: 0.5rem; + + > button { + flex-grow: 1; + } +`; + +Styled.NavigationMenu = styled(NavigationMenu)` + padding: 0.5rem; + padding-top: 0; +`; + +Styled.IconContainer = styled.div` + width: 1.5rem; + height: 1.5rem; + font-size: 0.75rem; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--color-layer-4); + border-radius: 50%; + margin-left: -0.25rem; +`; diff --git a/src/pages/rewards/DYDXBalancePanel.tsx b/src/pages/token/rewards/DYDXBalancePanel.tsx similarity index 98% rename from src/pages/rewards/DYDXBalancePanel.tsx rename to src/pages/token/rewards/DYDXBalancePanel.tsx index 5300fc2..b601783 100644 --- a/src/pages/rewards/DYDXBalancePanel.tsx +++ b/src/pages/token/rewards/DYDXBalancePanel.tsx @@ -22,7 +22,7 @@ import { OnboardingTriggerButton } from '@/views/dialogs/OnboardingTriggerButton import { openDialog } from '@/state/dialogs'; import { calculateCanAccountTrade } from '@/state/accountCalculators'; -export const DYDXBalancePanel = () => { +export const DYDXBalancePanel = ({ className }: { className?: string }) => { const dispatch = useDispatch(); const stringGetter = useStringGetter(); @@ -33,6 +33,7 @@ export const DYDXBalancePanel = () => { return ( diff --git a/src/pages/rewards/GovernancePanel.tsx b/src/pages/token/rewards/GovernancePanel.tsx similarity index 94% rename from src/pages/rewards/GovernancePanel.tsx rename to src/pages/token/rewards/GovernancePanel.tsx index 2cfde09..6796a6a 100644 --- a/src/pages/rewards/GovernancePanel.tsx +++ b/src/pages/token/rewards/GovernancePanel.tsx @@ -14,13 +14,14 @@ import { Link } from '@/components/Link'; import { openDialog } from '@/state/dialogs'; -export const GovernancePanel = () => { +export const GovernancePanel = ({ className }: { className?: string }) => { const stringGetter = useStringGetter(); const dispatch = useDispatch(); const { governanceLearnMore } = useURLConfigs(); return ( {stringGetter({ key: STRING_KEYS.GOVERNANCE })} } @@ -72,4 +73,4 @@ Styled.Title = styled.h3` font: var(--font-medium-book); color: var(--color-text-2); margin-bottom: -1rem; -`; \ No newline at end of file +`; diff --git a/src/pages/rewards/LaunchIncentivesPanel.tsx b/src/pages/token/rewards/LaunchIncentivesPanel.tsx similarity index 76% rename from src/pages/rewards/LaunchIncentivesPanel.tsx rename to src/pages/token/rewards/LaunchIncentivesPanel.tsx index e2e8bb7..d679a36 100644 --- a/src/pages/rewards/LaunchIncentivesPanel.tsx +++ b/src/pages/token/rewards/LaunchIncentivesPanel.tsx @@ -7,6 +7,8 @@ import { STRING_KEYS } from '@/constants/localization'; import { ButtonAction } from '@/constants/buttons'; import { DialogTypes } from '@/constants/dialogs'; +import { ChaosLabsIcon } from '@/icons'; + import breakpoints from '@/styles/breakpoints'; import { useAccounts, useBreakpoints, useStringGetter } from '@/hooks'; @@ -24,9 +26,7 @@ import { openDialog } from '@/state/dialogs'; import { log } from '@/lib/telemetry'; -const SEASON_NUMBER = 2; - -export const LaunchIncentivesPanel = () => { +export const LaunchIncentivesPanel = ({ className }: { className?: string }) => { const { isNotTablet } = useBreakpoints(); const dispatch = useDispatch(); @@ -35,11 +35,15 @@ export const LaunchIncentivesPanel = () => { }, []); return isNotTablet ? ( - } slotRight={}> + } + slotRight={} + >
) : ( - + @@ -68,14 +72,38 @@ const EstimatedRewards = () => { const stringGetter = useStringGetter(); const { dydxAddress } = useAccounts(); + const { data: seasonNumber } = useQuery({ + queryKey: 'chaos_labs_season_number', + queryFn: async () => { + const resp = await fetch('https://cloud.chaoslabs.co/query/ccar-perpetuals', { + method: 'POST', + headers: { + 'apollographql-client-name': 'dydx-v4', + 'content-type': 'application/json', + protocol: 'dydx-v4', + }, + body: JSON.stringify({ + operationName: 'TradingSeasons', + variables: {}, + query: `query TradingSeasons { + tradingSeasons { + label + } + }`, + }), + }); + const seasons = (await resp.json())?.data?.tradingSeasons; + return seasons && seasons.length > 0 ? seasons[seasons.length - 1].label : undefined; + }, + onError: (error: Error) => log('LaunchIncentives/fetchSeasonNumber', error), + }); + const { data, isLoading } = useQuery({ enabled: !!dydxAddress, - queryKey: `launch_incentives_rewards_${dydxAddress ?? ''}_${SEASON_NUMBER}`, + queryKey: `launch_incentives_rewards_${dydxAddress ?? ''}`, queryFn: async () => { if (!dydxAddress) return undefined; - const resp = await fetch( - `https://cloud.chaoslabs.co/query/api/dydx/points/${dydxAddress}?n=${SEASON_NUMBER}` - ); + const resp = await fetch(`https://cloud.chaoslabs.co/query/api/dydx/points/${dydxAddress}`); return (await resp.json())?.incentivePoints; }, onError: (error: Error) => log('LaunchIncentives/fetchPoints', error), @@ -86,12 +114,14 @@ const EstimatedRewards = () => {
{stringGetter({ key: STRING_KEYS.ESTIMATED_REWARDS })} - - {stringGetter({ - key: STRING_KEYS.LAUNCH_INCENTIVES_SEASON_NUM, - params: { SEASON_NUMBER }, - })} - + {seasonNumber !== undefined && ( + + {stringGetter({ + key: STRING_KEYS.LAUNCH_INCENTIVES_SEASON_NUM, + params: { SEASON_NUMBER: seasonNumber }, + })} + + )}
@@ -114,7 +144,9 @@ const LaunchIncentivesContent = () => { {stringGetter({ key: STRING_KEYS.LAUNCH_INCENTIVES_DESCRIPTION })}{' '} - + + {stringGetter({ key: STRING_KEYS.POWERED_BY_ALL_CAPS })} + { }) ); }} - slotRight={} + slotRight={} > {stringGetter({ key: STRING_KEYS.ABOUT })} @@ -140,7 +172,7 @@ const LaunchIncentivesContent = () => { }) ); }} - slotRight={} + slotRight={} slotLeft={} > {stringGetter({ key: STRING_KEYS.LEADERBOARD })} @@ -153,7 +185,7 @@ const LaunchIncentivesContent = () => { const Styled: Record = {}; Styled.Panel = styled(Panel)` - background-color: var(--color-layer-4); + background-color: var(--color-layer-3); width: 100%; `; @@ -200,10 +232,6 @@ Styled.Button = styled(Button)` --button-padding: 0 1rem; `; -Styled.LinkOutIcon = styled(Icon)` - color: var(--color-text-1); -`; - Styled.AboutButton = styled(Styled.Button)` --button-textColor: var(--color-text-2); --button-backgroundColor: var(--color-layer-6); @@ -280,9 +308,11 @@ Styled.Image = styled.img` height: auto; `; -Styled.ChaosLabsLogo = styled.img` - height: 1.25rem; - align-self: start; +Styled.ChaosLabsLogo = styled.span` + display: flex; + align-items: center; + gap: 0.5em; + font: var(--font-tiny-medium); `; Styled.NewTag = styled(Tag)` diff --git a/src/pages/rewards/MigratePanel.tsx b/src/pages/token/rewards/MigratePanel.tsx similarity index 100% rename from src/pages/rewards/MigratePanel.tsx rename to src/pages/token/rewards/MigratePanel.tsx diff --git a/src/pages/rewards/NewMarketsPanel.tsx b/src/pages/token/rewards/NewMarketsPanel.tsx similarity index 94% rename from src/pages/rewards/NewMarketsPanel.tsx rename to src/pages/token/rewards/NewMarketsPanel.tsx index a88d80b..26f0c2f 100644 --- a/src/pages/rewards/NewMarketsPanel.tsx +++ b/src/pages/token/rewards/NewMarketsPanel.tsx @@ -19,21 +19,22 @@ import { Tag } from '@/components/Tag'; import { MustBigNumber } from '@/lib/numbers'; import { layoutMixins } from '@/styles/layoutMixins'; -export const NewMarketsPanel = () => { +export const NewMarketsPanel = ({ className }: { className?: string }) => { const stringGetter = useStringGetter(); const navigate = useNavigate(); const { hasPotentialMarketsData } = usePotentialMarkets(); const { chainTokenDecimals, chainTokenLabel } = useTokenConfigs(); const { newMarketProposal } = useGovernanceVariables(); + const initialDepositAmountDecimals = isMainnet ? 0 : 11; const initialDepositAmountBN = MustBigNumber(newMarketProposal.initialDepositAmount).div( Number(`1e${chainTokenDecimals}`) ); - const initialDepositAmountDecimals = isMainnet ? 0 : chainTokenDecimals; if (!hasPotentialMarketsData) return null; return ( {stringGetter({ key: STRING_KEYS.ADD_A_MARKET })} diff --git a/src/pages/token/rewards/RewardHistoryPanel.tsx b/src/pages/token/rewards/RewardHistoryPanel.tsx new file mode 100644 index 0000000..d98f515 --- /dev/null +++ b/src/pages/token/rewards/RewardHistoryPanel.tsx @@ -0,0 +1,128 @@ +import { useCallback, useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; + +import { useStringGetter } from '@/hooks'; + +import { + HISTORICAL_TRADING_REWARDS_PERIODS, + HistoricalTradingRewardsPeriod, + HistoricalTradingRewardsPeriods, +} from '@/constants/abacus'; + +import { isMainnet } from '@/constants/networks'; +import { STRING_KEYS } from '@/constants/localization'; + +import breakpoints from '@/styles/breakpoints'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Output, OutputType } from '@/components/Output'; +import { Panel } from '@/components/Panel'; +import { ToggleGroup } from '@/components/ToggleGroup'; +import { WithTooltip } from '@/components/WithTooltip'; +import { TradingRewardHistoryTable } from '@/views/tables/TradingRewardHistoryTable'; + +import abacusStateManager from '@/lib/abacus'; + +// TODO: set in env featureFlag config +const REWARDS_HISTORY_START_DATE_MS = isMainnet ? 1706486400000 : 1704844800000; + +export const RewardHistoryPanel = () => { + const stringGetter = useStringGetter(); + + const [selectedPeriod, setSelectedPeriod] = useState( + abacusStateManager.getHistoricalTradingRewardPeriod() || HistoricalTradingRewardsPeriod.WEEKLY + ); + + const onSelectPeriod = useCallback( + (periodName: string) => { + const selectedPeriod = + HISTORICAL_TRADING_REWARDS_PERIODS[ + periodName as keyof typeof HISTORICAL_TRADING_REWARDS_PERIODS + ]; + setSelectedPeriod(selectedPeriod); + abacusStateManager.setHistoricalTradingRewardPeriod(selectedPeriod); + }, + [setSelectedPeriod, selectedPeriod] + ); + + return ( + + + +

{stringGetter({ key: STRING_KEYS.REWARD_HISTORY })}

+
+ + {stringGetter({ + key: STRING_KEYS.REWARD_HISTORY_DESCRIPTION, + params: { + REWARDS_HISTORY_START_DATE: ( + + ), + }, + })} + +
+ + + } + > + +
+ ); +}; + +const Styled: Record = {}; + +Styled.Header = styled.div` + ${layoutMixins.spacedRow} + + padding: 1rem 1rem 0; + margin-bottom: -0.5rem; + + @media ${breakpoints.notTablet} { + padding: 1.25rem 1.5rem 0; + } +`; + +Styled.Title = styled.div` + ${layoutMixins.column} + color: var(--color-text-0); + font: var(--font-small-book); + + h3 { + font: var(--font-medium-book); + color: var(--color-text-2); + } +`; + +Styled.Content = styled.div` + ${layoutMixins.flexColumn} + gap: 0.75rem; +`; + +Styled.Output = styled(Output)` + display: inline; +`; diff --git a/src/pages/rewards/RewardsHelpPanel.tsx b/src/pages/token/rewards/RewardsHelpPanel.tsx similarity index 70% rename from src/pages/rewards/RewardsHelpPanel.tsx rename to src/pages/token/rewards/RewardsHelpPanel.tsx index ac26d95..6696e37 100644 --- a/src/pages/rewards/RewardsHelpPanel.tsx +++ b/src/pages/token/rewards/RewardsHelpPanel.tsx @@ -29,20 +29,18 @@ export const RewardsHelpPanel = () => { > @@ -72,7 +70,7 @@ Styled.Header = styled.div` font: var(--font-small-book); @media ${breakpoints.notTablet} { - padding: 1.5rem 1.25rem; + padding: 1.5rem; } h3 { diff --git a/src/pages/token/rewards/RewardsPage.tsx b/src/pages/token/rewards/RewardsPage.tsx new file mode 100644 index 0000000..2935d76 --- /dev/null +++ b/src/pages/token/rewards/RewardsPage.tsx @@ -0,0 +1,185 @@ +import styled, { AnyStyledComponent, css } from 'styled-components'; +import { useNavigate } from 'react-router-dom'; + +import { isMainnet } from '@/constants/networks'; +import { STRING_KEYS } from '@/constants/localization'; +import { AppRoute } from '@/constants/routes'; + +import { useBreakpoints, useStringGetter } from '@/hooks'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { BackButton } from '@/components/BackButton'; +import { DetachedSection } from '@/components/ContentSection'; +import { ContentSectionHeader } from '@/components/ContentSectionHeader'; + +import { testFlags } from '@/lib/testFlags'; + +import { DYDXBalancePanel } from './DYDXBalancePanel'; +import { LaunchIncentivesPanel } from './LaunchIncentivesPanel'; +import { MigratePanel } from './MigratePanel'; +import { RewardsHelpPanel } from './RewardsHelpPanel'; +import { TradingRewardsSummaryPanel } from './TradingRewardsSummaryPanel'; +import { RewardHistoryPanel } from './RewardHistoryPanel'; + +const RewardsPage = () => { + const stringGetter = useStringGetter(); + const { isTablet, isNotTablet } = useBreakpoints(); + const navigate = useNavigate(); + + const showTradingRewards = testFlags.showTradingRewards || !isMainnet; + + return ( +
+ {isTablet && ( + navigate(AppRoute.Profile)} />} + /> + )} + + + {import.meta.env.VITE_V3_TOKEN_ADDRESS && isNotTablet && } + + {isTablet ? ( + + ) : ( + <> + + + + )} + + {showTradingRewards && ( + + + {isTablet && } + + + )} + + {isNotTablet && ( + + + + )} + + +
+ ); +}; + +export default RewardsPage; + +const Styled: Record = {}; + +Styled.MobileHeader = styled.header` + ${layoutMixins.contentSectionDetachedScrollable} + ${layoutMixins.stickyHeader} + z-index: 2; + padding: 1.25rem 0; + + font: var(--font-large-medium); + color: var(--color-text-2); + background-color: var(--color-layer-2); +`; + +Styled.GridLayout = styled.div<{ showTradingRewards?: boolean; showMigratePanel?: boolean }>` + --gap: 1.5rem; + display: grid; + grid-template-columns: 2fr 1fr; + gap: var(--gap); + max-width: 80rem; + + > * { + gap: var(--gap); + } + + ${({ showTradingRewards, showMigratePanel }) => + showTradingRewards && showMigratePanel + ? css` + grid-template-areas: + 'migrate migrate' + 'incentives incentives' + 'balance balance' + 'rewards other'; + ` + : showTradingRewards + ? css` + grid-template-areas: + 'incentives balance' + 'rewards other'; + ` + : showMigratePanel + ? css` + grid-template-areas: + 'migrate migrate' + 'incentives incentives' + 'balance balance' + 'other other'; + ` + : css` + grid-template-areas: + 'incentives balance' + 'other other'; + `}; + + @media ${breakpoints.notTablet} { + padding: 1rem; + } + + @media ${breakpoints.tablet} { + --gap: 1rem; + grid-template-columns: 1fr; + width: calc(100vw - 2rem); + margin: 0 auto; + + ${({ showTradingRewards }) => + showTradingRewards + ? css` + grid-template-areas: + 'incentives' + 'rewards'; + ` + : css` + grid-template-areas: 'incentives'; + `} + } +`; + +Styled.MigratePanel = styled(MigratePanel)` + grid-area: migrate; +`; + +Styled.LaunchIncentivesPanel = styled(LaunchIncentivesPanel)` + grid-area: incentives; +`; + +Styled.DYDXBalancePanel = styled(DYDXBalancePanel)` + grid-area: balance; +`; + +Styled.TradingRewardsColumn = styled.div` + grid-area: rewards; + ${layoutMixins.flexColumn} +`; + +Styled.OtherColumn = styled.div<{ showTradingRewards?: boolean }>` + grid-area: other; + ${layoutMixins.flexColumn} + + ${({ showTradingRewards }) => + !showTradingRewards && + css` + display: grid; + grid-template-columns: repeat(3, 1fr); + + > section:last-of-type { + grid-column: 1 / -1; + } + `} +`; diff --git a/src/pages/token/rewards/TradingRewardsSummaryPanel.tsx b/src/pages/token/rewards/TradingRewardsSummaryPanel.tsx new file mode 100644 index 0000000..c76940a --- /dev/null +++ b/src/pages/token/rewards/TradingRewardsSummaryPanel.tsx @@ -0,0 +1,137 @@ +import { useEffect } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import { shallowEqual, useSelector } from 'react-redux'; + +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter, useTokenConfigs } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { AssetIcon } from '@/components/AssetIcon'; +import { Details } from '@/components/Details'; +import { Output, OutputType } from '@/components/Output'; +import { Panel } from '@/components/Panel'; + +import { getHistoricalTradingRewardsForCurrentWeek } from '@/state/accountSelectors'; + +import abacusStateManager from '@/lib/abacus'; + +export const TradingRewardsSummaryPanel = () => { + const stringGetter = useStringGetter(); + const { chainTokenLabel } = useTokenConfigs(); + const currentWeekTradingReward = useSelector( + getHistoricalTradingRewardsForCurrentWeek, + shallowEqual + ); + + useEffect(() => { + abacusStateManager.refreshHistoricalTradingRewards(); + }, []); + + return !currentWeekTradingReward ? null : ( + {stringGetter({ key: STRING_KEYS.TRADING_REWARDS_SUMMARY })} + } + > + + +

{stringGetter({ key: STRING_KEYS.THIS_WEEK })}

+ + ), + value: ( + + } + type={OutputType.Asset} + value={currentWeekTradingReward.amount} + /> + + + → + + + + ), + }, + // TODO(@aforaleka): add all-time when supported + ]} + /> +
+
+ ); +}; + +const Styled: Record = {}; + +Styled.Header = styled.div` + padding: var(--panel-paddingY) var(--panel-paddingX) 0; + font: var(--font-medium-book); + color: var(--color-text-2); +`; + +Styled.Content = styled.div` + ${layoutMixins.flexColumn} + gap: 0.75rem; +`; + +Styled.TradingRewardsDetails = styled(Details)` + --details-item-backgroundColor: var(--color-layer-6); + + grid-template-columns: 1fr; // TODO(@aforaleka): change to 1fr 1fr when all-time is supported + gap: 1rem; + + > div { + gap: 0.5rem; + padding: 1rem; + border-radius: 0.75em; + background-color: var(--color-layer-5); + } + + dt { + width: 100%; + } + + output { + color: var(--color-text-2); + font: var(--font-large-book); + } +`; + +Styled.Label = styled.div` + ${layoutMixins.spacedRow} + + font: var(--font-base-book); + color: var(--color-text-1); +`; + +Styled.TimePeriod = styled.div` + ${layoutMixins.inlineRow} + + &, output { + color: var(--color-text-0); + font: var(--font-small-book); + } +`; + +Styled.Column = styled.div` + ${layoutMixins.flexColumn} + gap: 0.33rem; +`; + +Styled.AssetIcon = styled(AssetIcon)` + margin-left: 0.5ch; +`; diff --git a/src/pages/token/staking/StakingPage.tsx b/src/pages/token/staking/StakingPage.tsx new file mode 100644 index 0000000..91b9096 --- /dev/null +++ b/src/pages/token/staking/StakingPage.tsx @@ -0,0 +1,70 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { DetachedSection } from '@/components/ContentSection'; +import { ContentSectionHeader } from '@/components/ContentSectionHeader'; +import { useStringGetter } from '@/hooks'; + +import { StakingPanel } from './StakingPanel'; +import { StrideStakingPanel } from './StrideStakingPanel'; +import { DYDXBalancePanel } from '../rewards/DYDXBalancePanel'; +import { STRING_KEYS } from '@/constants/localization'; + +export default () => { + const stringGetter = useStringGetter(); + return ( + + + + + + + + + + + + + + + + ); +}; + +const Styled: Record = {}; + +Styled.HeaderSection = styled.section` + ${layoutMixins.contentSectionDetached} + + @media ${breakpoints.tablet} { + ${layoutMixins.flexColumn} + gap: 1rem; + + margin-bottom: 0.5rem; + } +`; + +Styled.ContentWrapper = styled.div` + ${layoutMixins.flexColumn} + gap: 1.5rem; + max-width: 80rem; + padding: 0 1rem; +`; + +Styled.Row = styled.div` + gap: 1rem; + display: grid; + grid-template-columns: 2fr 1fr; +`; + +Styled.InnerRow = styled.div` + gap: 1rem; + display: grid; + grid-template-columns: 1fr 1fr; + height: fit-content; +`; diff --git a/src/pages/rewards/StakingPanel.tsx b/src/pages/token/staking/StakingPanel.tsx similarity index 66% rename from src/pages/rewards/StakingPanel.tsx rename to src/pages/token/staking/StakingPanel.tsx index 9d2a1a6..1b934c7 100644 --- a/src/pages/rewards/StakingPanel.tsx +++ b/src/pages/token/staking/StakingPanel.tsx @@ -1,7 +1,6 @@ import styled, { AnyStyledComponent } from 'styled-components'; import { useDispatch } from 'react-redux'; -import { ButtonAction, ButtonSize } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; import { DialogTypes } from '@/constants/dialogs'; @@ -14,22 +13,19 @@ import { Link } from '@/components/Link'; import { openDialog } from '@/state/dialogs'; -export const StakingPanel = () => { +export const StakingPanel = ({ className }: { className?: string }) => { const stringGetter = useStringGetter(); const dispatch = useDispatch(); const { stakingLearnMore } = useURLConfigs(); return ( - {stringGetter({ key: STRING_KEYS.STAKING })}} - slotRight={ - - - + + {stringGetter({ key: STRING_KEYS.STAKE_WITH_KEPLR })} + + } onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavKeplr }))} > @@ -39,12 +35,40 @@ export const StakingPanel = () => { {stringGetter({ key: STRING_KEYS.LEARN_MORE })} → - +
); }; const Styled: Record = {}; +Styled.Panel = styled(Panel)` + align-items: start; + + header { + justify-content: unset; + padding-bottom: 0; + } +`; + +Styled.Header = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; +`; + +Styled.Title = styled.h3` + font: var(--font-medium-book); + color: var(--color-text-2); +`; + +Styled.Img = styled.img` + width: 2rem; + height: 2rem; + margin-left: 0.5rem; +`; + Styled.Description = styled.div` color: var(--color-text-0); --link-color: var(--color-text-1); @@ -61,13 +85,3 @@ Styled.IconButton = styled(IconButton)` color: var(--color-text-0); --color-border: var(--color-layer-6); `; - -Styled.Arrow = styled.div` - padding-right: 1.5rem; -`; - -Styled.Title = styled.h3` - font: var(--font-medium-book); - color: var(--color-text-2); - margin-bottom: -1rem; -`; diff --git a/src/pages/token/staking/StrideStakingPanel.tsx b/src/pages/token/staking/StrideStakingPanel.tsx new file mode 100644 index 0000000..e100523 --- /dev/null +++ b/src/pages/token/staking/StrideStakingPanel.tsx @@ -0,0 +1,97 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import { useDispatch } from 'react-redux'; + +import { STRING_KEYS } from '@/constants/localization'; +import { DialogTypes } from '@/constants/dialogs'; +import { useStringGetter, useTokenConfigs, useURLConfigs } from '@/hooks'; + +import { IconButton } from '@/components/IconButton'; +import { Link } from '@/components/Link'; +import { Panel } from '@/components/Panel'; +import { Tag } from '@/components/Tag'; + +import { openDialog } from '@/state/dialogs'; + +export const StrideStakingPanel = ({ className }: { className?: string }) => { + const stringGetter = useStringGetter(); + const dispatch = useDispatch(); + const { stakingLearnMore } = useURLConfigs(); + const { chainTokenLabel } = useTokenConfigs(); + + return ( + + + {stringGetter({ key: STRING_KEYS.LIQUID_STAKE_W_STRIDE })} + {stringGetter({ key: STRING_KEYS.NEW })} + + + + } + onClick={() => dispatch(openDialog({ type: DialogTypes.ExternalNavStride }))} + > + + {stringGetter({ + key: STRING_KEYS.LIQUID_STAKE_STRIDE_DESCRIPTION, + params: { TOKEN_DENOM: chainTokenLabel }, + })} + e.stopPropagation()}> + {stringGetter({ key: STRING_KEYS.LEARN_MORE })} → + + + + ); +}; + +const Styled: Record = {}; + +Styled.Panel = styled(Panel)` + align-items: start; + + header { + justify-content: unset; + padding-bottom: 0; + } +`; + +Styled.Header = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; +`; + +Styled.Title = styled.h3` + font: var(--font-medium-book); + color: var(--color-text-2); + + display: flex; + align-items: center; + gap: 0.5ch; +`; + +Styled.Img = styled.img` + width: 2rem; + height: 2rem; + margin-left: 0.5rem; +`; + +Styled.Description = styled.div` + color: var(--color-text-0); + --link-color: var(--color-text-1); + + a { + display: inline; + ::before { + content: ' '; + } + } +`; + +Styled.IconButton = styled(IconButton)` + color: var(--color-text-0); + --color-border: var(--color-layer-6); +`; diff --git a/src/pages/trade/TradeDialogTrigger.tsx b/src/pages/trade/TradeDialogTrigger.tsx index 79e4094..e746142 100644 --- a/src/pages/trade/TradeDialogTrigger.tsx +++ b/src/pages/trade/TradeDialogTrigger.tsx @@ -3,7 +3,7 @@ import { useSelector, shallowEqual } from 'react-redux'; import styled, { AnyStyledComponent } from 'styled-components'; import { STRING_KEYS } from '@/constants/localization'; -import { TRADE_TYPE_STRINGS } from '@/constants/trade'; +import { ORDER_TYPE_STRINGS } from '@/constants/trade'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -43,7 +43,7 @@ export const TradeDialogTrigger = () => { - {stringGetter({ key: TRADE_TYPE_STRINGS[selectedTradeType].tradeTypeKey })} + {stringGetter({ key: ORDER_TYPE_STRINGS[selectedTradeType].orderTypeKey })} diff --git a/src/state/account.ts b/src/state/account.ts index aae7b2d..57d7a54 100644 --- a/src/state/account.ts +++ b/src/state/account.ts @@ -13,6 +13,7 @@ import type { HistoricalPnlPeriods, SubAccountHistoricalPNLs, UsageRestriction, + TradingRewards, } from '@/constants/abacus'; import { OnboardingGuard, OnboardingState } from '@/constants/account'; @@ -24,6 +25,7 @@ import { getLocalStorage } from '@/lib/localStorage'; export type AccountState = { balances?: Record; stakingBalances?: Record; + tradingRewards?: TradingRewards; wallet?: Nullable; walletType?: WalletType; @@ -179,6 +181,9 @@ export const accountSlice = createSlice({ setStakingBalances: (state, action: PayloadAction>) => { state.stakingBalances = action.payload; }, + setTradingRewards: (state, action: PayloadAction) => { + state.tradingRewards = action.payload; + }, addUncommittedOrderClientId: (state, action: PayloadAction) => { state.uncommittedOrderClientIds.push(action.payload); }, @@ -206,6 +211,7 @@ export const { viewedOrders, setBalances, setStakingBalances, + setTradingRewards, addUncommittedOrderClientId, removeUncommittedOrderClientId, } = accountSlice.actions; diff --git a/src/state/accountSelectors.ts b/src/state/accountSelectors.ts index 809a027..e7390eb 100644 --- a/src/state/accountSelectors.ts +++ b/src/state/accountSelectors.ts @@ -1,3 +1,4 @@ +import type { Nullable, kollections } from '@dydxprotocol/v4-abacus'; import { OrderSide } from '@dydxprotocol/v4-client-js'; import { createSelector } from 'reselect'; @@ -9,6 +10,8 @@ import { AbacusOrderStatus, AbacusPositionSide, ORDER_SIDES, + HistoricalTradingReward, + HistoricalTradingRewardsPeriod, } from '@/constants/abacus'; import { OnboardingState } from '@/constants/account'; @@ -349,6 +352,38 @@ export const getBalances = (state: RootState) => state.account?.balances; * */ export const getStakingBalances = (state: RootState) => state.account?.stakingBalances; +/** + * @returns account all time trading rewards + */ +export const getTotalTradingRewards = (state: RootState) => state.account?.tradingRewards?.total; + +/** + * @returns account trading rewards aggregated by period + */ +export const getHistoricalTradingRewards = (state: RootState) => + state.account?.tradingRewards?.historical; + +/** + * @returns account historical trading rewards for the specified perid + */ +export const getHistoricalTradingRewardsForPeriod = (period: string) => + createSelector( + [getHistoricalTradingRewards], + ( + historicalTradingRewards: Nullable< + kollections.Map> + > + ) => historicalTradingRewards?.get(period) + ); + +/** + * @returns account historical trading rewards for the current week + */ +export const getHistoricalTradingRewardsForCurrentWeek = createSelector( + [getHistoricalTradingRewardsForPeriod(HistoricalTradingRewardsPeriod.WEEKLY.name)], + (historicalTradingRewards) => historicalTradingRewards?.firstOrNull() +); + /** * @returns UsageRestriction of the current session */ diff --git a/src/state/appSelectors.ts b/src/state/appSelectors.ts index 2917494..2351386 100644 --- a/src/state/appSelectors.ts +++ b/src/state/appSelectors.ts @@ -1,4 +1,8 @@ +import { DydxChainId, ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import type { RootState } from './_store'; export const getApiState = (state: RootState) => state.app.apiState; export const getSelectedNetwork = (state: RootState) => state.app.selectedNetwork; + +export const getSelectedDydxChainId = (state: RootState) => + ENVIRONMENT_CONFIG_MAP[state.app.selectedNetwork].dydxChainId as DydxChainId; diff --git a/src/state/configs.ts b/src/state/configs.ts index 9da0355..d4e7977 100644 --- a/src/state/configs.ts +++ b/src/state/configs.ts @@ -12,35 +12,35 @@ export enum AppTheme { Light = 'Light', } +export enum AppThemeSystemSetting { + System = 'System', +} + +export type AppThemeSetting = AppTheme | AppThemeSystemSetting; + +export enum AppColorMode { + GreenUp = 'GreenUp', + RedUp = 'RedUp', +} + export interface ConfigsState { - appTheme: AppTheme; + appThemeSetting: AppThemeSetting; + appColorMode: AppColorMode; feeTiers?: kollections.List; feeDiscounts?: FeeDiscount[]; network?: NetworkConfigs; hasSeenLaunchIncentives: boolean; } -const DOCUMENT_THEME_MAP = { - [AppTheme.Classic]: () => { - document?.documentElement?.classList.remove('theme-dark', 'theme-light'); - }, - [AppTheme.Dark]: () => { - document?.documentElement?.classList.remove('theme-light'); - document?.documentElement?.classList.add('theme-dark'); - }, - [AppTheme.Light]: () => { - document?.documentElement?.classList.remove('theme-dark'); - document?.documentElement?.classList.add('theme-light'); - }, -}; - -export const changeTheme = (theme: AppTheme) => DOCUMENT_THEME_MAP[theme](); - const initialState: ConfigsState = { - appTheme: getLocalStorage({ + appThemeSetting: getLocalStorage({ key: LocalStorageKey.SelectedTheme, defaultValue: AppTheme.Classic, }), + appColorMode: getLocalStorage({ + key: LocalStorageKey.SelectedColorMode, + defaultValue: AppColorMode.GreenUp, + }), feeDiscounts: undefined, feeTiers: undefined, network: undefined, @@ -50,16 +50,17 @@ const initialState: ConfigsState = { }), }; -changeTheme(initialState.appTheme); - export const configsSlice = createSlice({ name: 'Inputs', initialState, reducers: { - setAppTheme: (state: ConfigsState, { payload }: PayloadAction) => { + setAppThemeSetting: (state: ConfigsState, { payload }: PayloadAction) => { setLocalStorage({ key: LocalStorageKey.SelectedTheme, value: payload }); - changeTheme(payload); - state.appTheme = payload; + state.appThemeSetting = payload; + }, + setAppColorMode: (state: ConfigsState, { payload }: PayloadAction) => { + setLocalStorage({ key: LocalStorageKey.SelectedColorMode, value: payload }); + state.appColorMode = payload; }, setConfigs: (state: ConfigsState, action: PayloadAction>) => ({ ...state, @@ -72,4 +73,5 @@ export const configsSlice = createSlice({ }, }); -export const { setAppTheme, setConfigs, markLaunchIncentivesSeen } = configsSlice.actions; +export const { setAppThemeSetting, setAppColorMode, setConfigs, markLaunchIncentivesSeen } = + configsSlice.actions; diff --git a/src/state/configsSelectors.ts b/src/state/configsSelectors.ts index d83bd84..25cc4d1 100644 --- a/src/state/configsSelectors.ts +++ b/src/state/configsSelectors.ts @@ -1,6 +1,21 @@ import type { RootState } from './_store'; +import { AppTheme, AppThemeSystemSetting, AppThemeSetting } from './configs'; -export const getAppTheme = (state: RootState) => state.configs.appTheme; +export const getAppThemeSetting = (state: RootState): AppThemeSetting => + state.configs.appThemeSetting; + +export const getAppTheme = (state: RootState): AppTheme => { + switch (state.configs.appThemeSetting) { + case AppThemeSystemSetting.System: + return globalThis.matchMedia('(prefers-color-scheme: dark)').matches + ? AppTheme.Dark + : AppTheme.Light; + default: + return state.configs.appThemeSetting; + } +}; + +export const getAppColorMode = (state: RootState) => state.configs.appColorMode; export const getFeeTiers = (state: RootState) => state.configs.feeTiers?.toArray(); diff --git a/src/state/perpetualsSelectors.ts b/src/state/perpetualsSelectors.ts index 0c02a6b..f83fe78 100644 --- a/src/state/perpetualsSelectors.ts +++ b/src/state/perpetualsSelectors.ts @@ -107,6 +107,12 @@ export const getCurrentMarketHistoricalFundings = createSelector( currentMarketId ? historicalFundings?.[currentMarketId] ?? [] : [] ); +/** + * @returns oracle price of the market the user is currently viewing + */ +export const getCurrentMarketOraclePrice = (state: RootState) => + getCurrentMarketData(state)?.oraclePrice; + /** * @returns Mid market price for the market the user is currently viewing */ diff --git a/src/styles/formMixins.ts b/src/styles/formMixins.ts index d709bef..841b4f2 100644 --- a/src/styles/formMixins.ts +++ b/src/styles/formMixins.ts @@ -38,7 +38,7 @@ export const formMixins: Record< border-radius: var(--input-radius); &:focus-within { - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); } @media ${breakpoints.tablet} { diff --git a/src/styles/globalStyle.ts b/src/styles/globalStyle.ts index bf534cd..6038aa6 100644 --- a/src/styles/globalStyle.ts +++ b/src/styles/globalStyle.ts @@ -2,6 +2,10 @@ import { createGlobalStyle } from 'styled-components'; export const GlobalStyle = createGlobalStyle` :root { + --color-white: ${({ theme }) => theme.white}; + --color-green: ${({ theme }) => theme.green}; + --color-red: ${({ theme }) => theme.red}; + --color-layer-0: ${({ theme }) => theme.layer0}; --color-layer-1: ${({ theme }) => theme.layer1}; --color-layer-2: ${({ theme }) => theme.layer2}; @@ -18,6 +22,7 @@ export const GlobalStyle = createGlobalStyle` --color-text-0: ${({ theme }) => theme.textTertiary}; --color-text-1: ${({ theme }) => theme.textSecondary}; --color-text-2: ${({ theme }) => theme.textPrimary}; + --color-text-button: ${({ theme }) => theme.textButton}; --color-gradient-base-0: ${({ theme }) => theme.gradientBase0}; --color-gradient-base-1: ${({ theme }) => theme.gradientBase1}; @@ -29,6 +34,9 @@ export const GlobalStyle = createGlobalStyle` --color-success: ${({ theme }) => theme.success}; --color-warning: ${({ theme }) => theme.warning}; --color-error: ${({ theme }) => theme.error}; + --color-gradient-success: ${({ theme }) => theme.successFaded}; + --color-gradient-warning: ${({ theme }) => theme.warningFaded}; + --color-gradient-error: ${({ theme }) => theme.errorFaded}; --color-positive: ${({ theme }) => theme.positive}; --color-negative: ${({ theme }) => theme.negative}; @@ -38,5 +46,9 @@ export const GlobalStyle = createGlobalStyle` --color-risk-low: ${({ theme }) => theme.riskLow}; --color-risk-medium: ${({ theme }) => theme.riskMedium}; --color-risk-high: ${({ theme }) => theme.riskHigh}; + + --hover-filter-base: ${({ theme }) => theme.hoverFilterBase}; + --hover-filter-variant: ${({ theme }) => theme.hoverFilterVariant}; + --active-filter: ${({ theme }) => theme.activeFilter}; } `; diff --git a/src/styles/popoverMixins.ts b/src/styles/popoverMixins.ts index 90697ea..4945d2a 100644 --- a/src/styles/popoverMixins.ts +++ b/src/styles/popoverMixins.ts @@ -21,8 +21,8 @@ export const popoverMixins = { --trigger-open-backgroundColor: var(--color-layer-1); --trigger-open-textColor: var(--color-text-2); - --trigger-active-filter: brightness(0.9); - --trigger-hover-filter: brightness(1.1); + --trigger-active-filter: brightness(var(--active-filter)); + --trigger-hover-filter: brightness(var(--hover-filter-base)); display: flex; align-items: center; @@ -219,7 +219,7 @@ export const popoverMixins = { &[aria-selected="true"], // cmdk &[data-highlighted] // @radix-ui { - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); background-color: var(--item-highlighted-backgroundColor); color: var(--item-highlighted-textColor, var(--trigger-textColor, inherit)) !important; outline: none; diff --git a/src/styles/themes.ts b/src/styles/themes.ts index 4b910c5..cf5d54b 100644 --- a/src/styles/themes.ts +++ b/src/styles/themes.ts @@ -1,9 +1,13 @@ -import { AppTheme } from '@/state/configs'; -import type { ThemeColors } from '@/constants/styles/colors'; -import { ColorToken, OpacityToken } from '@/constants/styles/base'; +import { AppTheme, AppColorMode } from '@/state/configs'; +import type { Theme, ThemeColorBase } from '@/constants/styles/colors'; +import { BrightnessFilterToken, ColorToken, OpacityToken } from '@/constants/styles/base'; import { generateFadedColorVariant } from '@/lib/styles'; -const ClassicTheme: ThemeColors = { +const ClassicThemeBase: ThemeColorBase = { + white: ColorToken.White, + green: ColorToken.Green1, + red: ColorToken.Red2, + layer0: ColorToken.GrayBlue7, layer1: ColorToken.GrayBlue6, layer2: ColorToken.GrayBlue5, @@ -20,6 +24,7 @@ const ClassicTheme: ThemeColors = { textPrimary: ColorToken.LightGray2, textSecondary: ColorToken.GrayPurple1, textTertiary: ColorToken.GrayPurple2, + textButton: ColorToken.LightGray2, gradientBase0: ColorToken.DarkGray9, gradientBase1: ColorToken.GrayBlue2, @@ -31,6 +36,9 @@ const ClassicTheme: ThemeColors = { success: ColorToken.Green1, warning: ColorToken.Yellow0, error: ColorToken.Red2, + successFaded: generateFadedColorVariant(ColorToken.Green1, OpacityToken.Opacity16), + warningFaded: generateFadedColorVariant(ColorToken.Yellow0, OpacityToken.Opacity16), + errorFaded: generateFadedColorVariant(ColorToken.Red2, OpacityToken.Opacity16), positive: ColorToken.Green1, negative: ColorToken.Red2, @@ -47,12 +55,19 @@ const ClassicTheme: ThemeColors = { inputBackground: ColorToken.GrayBlue3, popoverBackground: generateFadedColorVariant(ColorToken.GrayBlue4, OpacityToken.Opacity90), - switchThumbActiveBackground: ColorToken.White, toggleBackground: ColorToken.GrayBlue3, tooltipBackground: generateFadedColorVariant(ColorToken.GrayBlue3, OpacityToken.Opacity66), + + hoverFilterBase: BrightnessFilterToken.Lighten10, + hoverFilterVariant: BrightnessFilterToken.Lighten10, + activeFilter: BrightnessFilterToken.Darken10, }; -const DarkTheme: ThemeColors = { +const DarkThemeBase: ThemeColorBase = { + white: ColorToken.White, + green: ColorToken.Green0, + red: ColorToken.Red0, + layer0: ColorToken.Black, layer1: ColorToken.DarkGray11, layer2: ColorToken.DarkGray13, @@ -69,6 +84,7 @@ const DarkTheme: ThemeColors = { textPrimary: ColorToken.LightGray0, textSecondary: ColorToken.MediumGray0, textTertiary: ColorToken.DarkGray0, + textButton: ColorToken.LightGray0, gradientBase0: ColorToken.DarkGray8, gradientBase1: ColorToken.DarkGray5, @@ -80,6 +96,9 @@ const DarkTheme: ThemeColors = { success: ColorToken.Green0, warning: ColorToken.Yellow0, error: ColorToken.Red0, + successFaded: generateFadedColorVariant(ColorToken.Green0, OpacityToken.Opacity16), + warningFaded: generateFadedColorVariant(ColorToken.Yellow0, OpacityToken.Opacity16), + errorFaded: generateFadedColorVariant(ColorToken.Red0, OpacityToken.Opacity16), positive: ColorToken.Green0, negative: ColorToken.Red0, @@ -96,12 +115,19 @@ const DarkTheme: ThemeColors = { inputBackground: ColorToken.DarkGray6, popoverBackground: generateFadedColorVariant(ColorToken.DarkGray8, OpacityToken.Opacity90), - switchThumbActiveBackground: ColorToken.White, toggleBackground: ColorToken.DarkGray6, tooltipBackground: generateFadedColorVariant(ColorToken.DarkGray6, OpacityToken.Opacity66), + + hoverFilterBase: BrightnessFilterToken.Lighten10, + hoverFilterVariant: BrightnessFilterToken.Lighten10, + activeFilter: BrightnessFilterToken.Darken10, }; -const LightTheme: ThemeColors = { +const LightThemeBase: ThemeColorBase = { + white: ColorToken.White, + green: ColorToken.Green2, + red: ColorToken.Red1, + layer0: ColorToken.White, layer1: ColorToken.LightGray6, layer2: ColorToken.White, @@ -118,6 +144,7 @@ const LightTheme: ThemeColors = { textPrimary: ColorToken.DarkGray12, textSecondary: ColorToken.DarkGray3, textTertiary: ColorToken.DarkGray1, + textButton: ColorToken.White, gradientBase0: ColorToken.LightGray8, gradientBase1: ColorToken.LightGray5, @@ -129,6 +156,9 @@ const LightTheme: ThemeColors = { success: ColorToken.Green2, warning: ColorToken.Yellow0, error: ColorToken.Red1, + successFaded: generateFadedColorVariant(ColorToken.Green2, OpacityToken.Opacity16), + warningFaded: generateFadedColorVariant(ColorToken.Yellow0, OpacityToken.Opacity16), + errorFaded: generateFadedColorVariant(ColorToken.Red1, OpacityToken.Opacity16), positive: ColorToken.Green2, negative: ColorToken.Red1, @@ -145,13 +175,30 @@ const LightTheme: ThemeColors = { inputBackground: ColorToken.White, popoverBackground: generateFadedColorVariant(ColorToken.LightGray8, OpacityToken.Opacity90), - switchThumbActiveBackground: ColorToken.White, toggleBackground: ColorToken.LightGray4, tooltipBackground: generateFadedColorVariant(ColorToken.LightGray7, OpacityToken.Opacity66), + + hoverFilterBase: BrightnessFilterToken.Darken5, + hoverFilterVariant: BrightnessFilterToken.Lighten10, + activeFilter: BrightnessFilterToken.Darken10, +}; + +const generateTheme = (themeBase: ThemeColorBase): Theme => { + return { + [AppColorMode.GreenUp]: themeBase, + [AppColorMode.RedUp]: { + ...themeBase, + // #InvertDirectionalColors + positive: themeBase.negative, + negative: themeBase.positive, + positiveFaded: themeBase.negativeFaded, + negativeFaded: themeBase.positiveFaded, + }, + }; }; export const Themes = { - [AppTheme.Classic]: ClassicTheme, - [AppTheme.Dark]: DarkTheme, - [AppTheme.Light]: LightTheme, + [AppTheme.Classic]: generateTheme(ClassicThemeBase), + [AppTheme.Dark]: generateTheme(DarkThemeBase), + [AppTheme.Light]: generateTheme(LightThemeBase), }; diff --git a/src/views/AccountInfo/AccountInfoConnectedState.tsx b/src/views/AccountInfo/AccountInfoConnectedState.tsx index 1627c7f..b6b7dbb 100644 --- a/src/views/AccountInfo/AccountInfoConnectedState.tsx +++ b/src/views/AccountInfo/AccountInfoConnectedState.tsx @@ -173,7 +173,7 @@ export const AccountInfoConnectedState = () => { {label} - {hasError ? : slotRight} + {hasError ? : slotRight} ), @@ -230,8 +230,8 @@ Styled.CircleContainer = styled.div` border-radius: 50%; `; -Styled.Icon = styled(Icon)` - color: var(--color-negative); +Styled.CautionIcon = styled(Icon)` + color: var(--color-error); `; Styled.WithUsage = styled.div` diff --git a/src/views/PositionInfo.tsx b/src/views/PositionInfo.tsx index ac79452..1df8cb6 100644 --- a/src/views/PositionInfo.tsx +++ b/src/views/PositionInfo.tsx @@ -557,11 +557,11 @@ Styled.PositionTile = styled(PositionTile)``; Styled.ClosePositionButton = styled(Button)` --button-border: solid var(--border-width) var(--color-border-red); - --button-textColor: var(--color-negative); + --button-textColor: var(--color-red); `; Styled.ClosePositionToggleButton = styled(ToggleButton)` --button-border: solid var(--border-width) var(--color-border-red); - --button-toggle-off-textColor: var(--color-negative); - --button-toggle-on-textColor: var(--color-negative); + --button-toggle-off-textColor: var(--color-red); + --button-toggle-on-textColor: var(--color-red); `; diff --git a/src/views/PositionTile.stories.tsx b/src/views/PositionTile.stories.tsx index e18008c..58834f5 100644 --- a/src/views/PositionTile.stories.tsx +++ b/src/views/PositionTile.stories.tsx @@ -33,9 +33,11 @@ Styled.PositionInfoContainer = styled.div` PositionTileStory.args = { currentSize: 0.2, - oraclePrice: 1300, + notionalTotal: 1300, postOrderSize: 0.2, stepSizeDecimals: 3, symbol: 'ETH', tickSizeDecimals: 1, + isLoading: false, + showNarrowVariation: false, }; diff --git a/src/views/charts/DepthChart/Tooltip.tsx b/src/views/charts/DepthChart/Tooltip.tsx index bcfc8b4..3d4b0a3 100644 --- a/src/views/charts/DepthChart/Tooltip.tsx +++ b/src/views/charts/DepthChart/Tooltip.tsx @@ -48,12 +48,12 @@ export const DepthChartTooltipContent = ({ const depthChartSeries = nearestDatum.key as DepthChartSeries; return { - [DepthChartSeries.Bids]: MustBigNumber(nearestDatum?.datum.price) - .minus(chartPointAtPointer.price) - .div(nearestDatum?.datum.price), - [DepthChartSeries.Asks]: MustBigNumber(chartPointAtPointer.price) + [DepthChartSeries.Bids]: MustBigNumber(midMarketPrice) .minus(nearestDatum?.datum.price) - .div(chartPointAtPointer.price), + .div(midMarketPrice), + [DepthChartSeries.Asks]: MustBigNumber(nearestDatum?.datum.price) + .minus(midMarketPrice) + .div(midMarketPrice), [DepthChartSeries.MidMarket]: undefined, }[depthChartSeries]; } diff --git a/src/views/charts/PnlChart.tsx b/src/views/charts/PnlChart.tsx index 1509277..df65430 100644 --- a/src/views/charts/PnlChart.tsx +++ b/src/views/charts/PnlChart.tsx @@ -9,34 +9,30 @@ import { HistoricalPnlPeriods, HISTORICAL_PNL_PERIODS, } from '@/constants/abacus'; -// import { STRING_KEYS } from '@/constants/localization'; import { timeUnits } from '@/constants/time'; import { breakpoints } from '@/styles'; -import { useBreakpoints, useNow /*, useStringGetter*/ } from '@/hooks'; +import { useBreakpoints, useNow } from '@/hooks'; -// import { Details } from '@/components/Details'; -import { Output /*, OutputType, ShowSign*/ } from '@/components/Output'; -// import { HorizontalSeparator } from '@/components/Separator'; +import { Output } from '@/components/Output'; import { ToggleGroup } from '@/components/ToggleGroup'; import type { TooltipContextType } from '@visx/xychart'; import { TimeSeriesChart } from '@/components/visx/TimeSeriesChart'; import { AxisLabelOutput } from '@/components/visx/AxisLabelOutput'; -// import { TooltipContent } from '@/components/visx/TooltipContent'; import { getSubaccount, getSubaccountHistoricalPnl, getSubaccountId, } from '@/state/accountSelectors'; +import { AppTheme } from '@/state/configs'; +import { getAppTheme } from '@/state/configsSelectors'; import abacusStateManager from '@/lib/abacus'; import { formatRelativeTime } from '@/lib/dateTime'; import { isTruthy } from '@/lib/isTruthy'; -import chartBackground from '/chart-background.png'; - enum PnlSide { Profit = 'Profit', Loss = 'Loss', @@ -62,6 +58,9 @@ const MS_FOR_PERIOD = { [HistoricalPnlPeriod.Period90d.name]: 90 * timeUnits.day, }; +const DARK_CHART_BACKGROUND_URL = '/chart-dots-background-dark.svg'; +const LIGHT_CHART_BACKGROUND_URL = '/chart-dots-background-light.svg'; + type ElementProps = { onTooltipContext?: (tooltipContext: TooltipContextType) => void; onVisibleDataChange?: (data: Array) => void; @@ -82,8 +81,8 @@ export const PnlChart = ({ selectedLocale, slotEmpty, }: PnlChartProps) => { - // const stringGetter = useStringGetter(); const { isTablet } = useBreakpoints(); + const appTheme = useSelector(getAppTheme); const { equity } = useSelector(getSubaccount, shallowEqual) || {}; const now = useNow({ intervalMs: timeUnits.minute }); @@ -171,10 +170,11 @@ export const PnlChart = ({ [pnlData, equity, selectedPeriod, now] ); - // const latestDatum = data?.[data.length - 1]; + const chartBackground = + appTheme === AppTheme.Light ? LIGHT_CHART_BACKGROUND_URL : DARK_CHART_BACKGROUND_URL; return ( - + datum?.equity, colorAccessor: () => 'var(--pnl-line-color)', getCurve: () => curveLinear, - // getCurve: ({ zoomDomain }) => - // PNL_TIME_RESOLUTION * 30 < zoomDomain && zoomDomain < PNL_TIME_RESOLUTION * 400 - // ? curveMonotoneX - // : curveLinear, - // threshold: { - // yAccessor: (datum) => datum?.netTransfers, - // aboveAreaProps: { - // fill: 'var(--color-positive)', - // fillOpacity: 0.33, - // strokeWidth: 1, - // stroke: 'var(--color-positive)', - // }, - // belowAreaProps: { - // fill: 'var(--color-negative)', - // fillOpacity: 0.33, - // strokeWidth: 1, - // stroke: 'var(--color-negative)', - // }, - // }, }, ]} tickFormatY={(value) => @@ -229,98 +210,6 @@ export const PnlChart = ({ .format(Math.abs(value)) .toLowerCase() } - // renderXAxisLabel={({ tooltipData }) => { - // const tooltipDatum = tooltipData!.nearestDatum!.datum ?? latestDatum; - - // return ( - // - // ); - // }} - // renderYAxisLabel={({ tooltipData }) => { - // const tooltipDatum = tooltipData!.nearestDatum!.datum ?? latestDatum; - - // return ( - // - // ); - // }} - // renderTooltip={({ tooltipData }) => { - // const { nearestDatum } = tooltipData || {}; - - // const tooltipDatum = nearestDatum?.datum ?? latestDatum; - - // return ( - // - //
, - // }, - // ].filter(Boolean)} - // /> - - // - - //
, - // }, - // { - // key: 'equity', - // label: { - // [PnlSide.Profit]: stringGetter({ - // key: STRING_KEYS.NET_PROFIT, - // }), - // [PnlSide.Loss]: stringGetter({ - // key: STRING_KEYS.NET_LOSS, - // }), - // [PnlSide.Flat]: stringGetter({ - // key: STRING_KEYS.NET_ZERO, - // }), - // }[tooltipDatum.side], - // value: ( - // - // ), - // }, - // { - // key: 'totalPnl', - // label: stringGetter({ key: STRING_KEYS.TOTAL_VALUE }), // stringGetter({ key: STRING_KEYS.EQUITY }), - // value: , - // }, - // ].filter(Boolean)} - // /> - // - // ); - // }} renderTooltip={() =>
} onTooltipContext={onTooltipContext} onVisibleDataChange={onVisibleDataChange} @@ -358,9 +247,9 @@ export const PnlChart = ({ const Styled: Record = {}; -Styled.Container = styled.div` +Styled.Container = styled.div<{ chartBackground: string }>` position: relative; - background: url(${chartBackground}) no-repeat center center; + background: url(${({ chartBackground }) => chartBackground}) no-repeat center center; `; Styled.PeriodToggle = styled.div` diff --git a/src/views/charts/TvChart.tsx b/src/views/charts/TvChart.tsx index f3586ff..45b4455 100644 --- a/src/views/charts/TvChart.tsx +++ b/src/views/charts/TvChart.tsx @@ -1,73 +1,40 @@ -import { useEffect, useRef, useState } from 'react'; +import { useRef, useState } from 'react'; + import styled, { type AnyStyledComponent, css } from 'styled-components'; -import { useDispatch, useSelector } from 'react-redux'; -import type { IChartingLibraryWidget, ResolutionString } from 'public/tradingview/charting_library'; +import type { ResolutionString } from 'public/tradingview/charting_library'; -import { DEFAULT_MARKETID } from '@/constants/markets'; -import { DEFAULT_RESOLUTION, RESOLUTION_CHART_CONFIGS } from '@/constants/candles'; -import { useTradingView, useTradingViewTheme } from '@/hooks/tradingView'; +import type { TvWidget } from '@/constants/tvchart'; + +import { + useChartLines, + useChartMarketAndResolution, + useTradingView, + useTradingViewTheme, +} from '@/hooks/tradingView'; import { LoadingSpace } from '@/components/Loading/LoadingSpinner'; -import { setTvChartResolution } from '@/state/perpetuals'; - -import { getCurrentMarketId, getSelectedResolutionForMarket } from '@/state/perpetualsSelectors'; - import { layoutMixins } from '@/styles/layoutMixins'; -type TvWidget = IChartingLibraryWidget & { _id?: string; _ready?: boolean }; - export const TvChart = () => { const [isChartReady, setIsChartReady] = useState(false); - const dispatch = useDispatch(); - const currentMarketId: string = useSelector(getCurrentMarketId) || DEFAULT_MARKETID; - - const selectedResolution: string = - useSelector(getSelectedResolutionForMarket(currentMarketId)) || DEFAULT_RESOLUTION; - const tvWidgetRef = useRef(null); const tvWidget = tvWidgetRef.current; const isWidgetReady = tvWidget?._ready; - const chart = isWidgetReady ? tvWidget?.chart() : undefined; - const chartResolution = chart?.resolution?.(); - const { savedResolution } = useTradingView({ tvWidgetRef, setIsChartReady }); - useTradingViewTheme({ tvWidget, isWidgetReady }); + const displayButtonRef = useRef(null); + const displayButton = displayButtonRef.current; - const setVisibleRangeForResolution = ({ resolution }: { resolution: ResolutionString }) => { - // Different resolutions have different timeframes to display data efficiently. - const { defaultRange } = RESOLUTION_CHART_CONFIGS[resolution]; - - // from/to values converted to epoch seconds - const newRange = { - from: (Date.now() - defaultRange) / 1000, - to: Date.now() / 1000, - }; - - tvWidget?.activeChart().setVisibleRange(newRange, { percentRightMargin: 10 }); - }; - - useEffect(() => { - if (chartResolution) { - if (chartResolution !== selectedResolution) { - dispatch(setTvChartResolution({ marketId: currentMarketId, resolution: chartResolution })); - } - - setVisibleRangeForResolution({ resolution: chartResolution }); - } - }, [chartResolution]); - - /** - * @description Hook to handle changing markets - */ - useEffect(() => { - if (currentMarketId && isWidgetReady) { - const resolution = savedResolution || selectedResolution; - tvWidget?.setSymbol(currentMarketId, resolution as ResolutionString, () => {}); - } - }, [currentMarketId, isWidgetReady]); + const { savedResolution } = useTradingView({ tvWidgetRef, displayButtonRef, setIsChartReady }); + useChartMarketAndResolution({ + tvWidget, + isWidgetReady, + savedResolution: savedResolution as ResolutionString | undefined, + }); + const { chartLines } = useChartLines({ tvWidget, displayButton, isChartReady }); + useTradingViewTheme({ tvWidget, isWidgetReady, chartLines }); return ( diff --git a/src/views/dialogs/DisplaySettingsDialog.tsx b/src/views/dialogs/DisplaySettingsDialog.tsx new file mode 100644 index 0000000..61f5e12 --- /dev/null +++ b/src/views/dialogs/DisplaySettingsDialog.tsx @@ -0,0 +1,348 @@ +import { useDispatch, useSelector } from 'react-redux'; +import styled, { AnyStyledComponent, css } from 'styled-components'; + +import { Root, Item, Indicator } from '@radix-ui/react-radio-group'; + +import { useStringGetter } from '@/hooks'; + +import { + AppTheme, + type AppThemeSetting, + AppThemeSystemSetting, + AppColorMode, + setAppThemeSetting, + setAppColorMode, +} from '@/state/configs'; +import { getAppTheme, getAppThemeSetting, getAppColorMode } from '@/state/configsSelectors'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { Themes } from '@/styles/themes'; + +import { STRING_KEYS } from '@/constants/localization'; + +import { Dialog } from '@/components/Dialog'; +import { Icon, IconName } from '@/components/Icon'; +import { HorizontalSeparatorFiller } from '@/components/Separator'; + +type ElementProps = { + setIsOpen: (open: boolean) => void; +}; + +export const DisplaySettingsDialog = ({ setIsOpen }: ElementProps) => { + const dispatch = useDispatch(); + const stringGetter = useStringGetter(); + + const currentThemeSetting: AppThemeSetting = useSelector(getAppThemeSetting); + const currentTheme: AppTheme = useSelector(getAppTheme); + const currentColorMode: AppColorMode = useSelector(getAppColorMode); + + const sectionHeader = (heading: string) => { + return ( + + {heading} + + + ); + }; + + const themePanels = () => { + return ( + + {[ + { + themeSetting: AppTheme.Classic, + label: STRING_KEYS.CLASSIC_DARK, + }, + { + themeSetting: AppThemeSystemSetting.System, + label: STRING_KEYS.SYSTEM, + }, + { + themeSetting: AppTheme.Dark, + label: STRING_KEYS.DARK, + }, + { + themeSetting: AppTheme.Light, + label: STRING_KEYS.LIGHT, + }, + ].map(({ themeSetting, label }) => { + const theme = + themeSetting === AppThemeSystemSetting.System + ? globalThis.matchMedia('(prefers-color-scheme: dark)').matches + ? AppTheme.Dark + : AppTheme.Light + : themeSetting; + + const backgroundColor = Themes[theme][currentColorMode].layer2; + const gridColor = Themes[theme][currentColorMode].borderDefault; + const textColor = Themes[theme][currentColorMode].textPrimary; + + return ( + { + dispatch(setAppThemeSetting(themeSetting)); + }} + > + + {stringGetter({ key: label })} + + + + + + + ); + })} + + ); + }; + + const colorModeOptions = () => { + return ( + + {[ + { + colorMode: AppColorMode.GreenUp, + label: STRING_KEYS.GREEN_IS_UP, + }, + { + colorMode: AppColorMode.RedUp, + label: STRING_KEYS.RED_IS_UP, + }, + ].map(({ colorMode, label }) => ( + { + dispatch(setAppColorMode(colorMode)); + }} + > + + + + + + {stringGetter({ key: label })} + + + + ))} + + ); + }; + + return ( + + + {sectionHeader(stringGetter({ key: STRING_KEYS.THEME }))} + {themePanels()} + + + {sectionHeader(stringGetter({ key: STRING_KEYS.DIRECTION_COLOR_PREFERENCE }))} + {colorModeOptions()} + + + ); +}; + +const Styled: Record = {}; + +const gridStyle = css` + display: grid; + gap: 1.5rem; +`; + +Styled.Section = styled.div` + ${gridStyle} + padding: 1rem 0; +`; + +Styled.Header = styled.header` + ${layoutMixins.inlineRow} +`; + +Styled.AppThemeRoot = styled(Root)` + ${gridStyle} + grid-template-columns: 1fr 1fr; +`; + +Styled.ColorPreferenceRoot = styled(Root)` + ${gridStyle} + grid-template-columns: 1fr; +`; + +Styled.Item = styled(Item)` + --border-color: var(--color-border); + --item-padding: 0.75rem; + + &[data-state='checked'] { + --border-color: var(--color-accent); + } + + border: solid var(--border-width) var(--border-color); + border-radius: 0.875rem; + + padding: var(--item-padding); +`; + +Styled.ColorPreferenceItem = styled(Styled.Item)` + &[data-state='checked'] { + background-color: var(--color-layer-4); + } + + ${layoutMixins.row} + justify-content: space-between; +`; + +Styled.AppThemeItem = styled(Styled.Item)<{ backgroundcolor: string; gridcolor: string }>` + ${({ backgroundcolor, gridcolor }) => css` + --themePanel-backgroundColor: ${backgroundcolor}; + --themePanel-gridColor: ${gridcolor}; + `} + + display: flex; + flex-direction: column; + position: relative; + width: 100%; + + background-color: var(--themePanel-backgroundColor); + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + + border-radius: 0.875rem; + + background: radial-gradient( + 55% 35% at 50% 65%, + transparent, + var(--themePanel-backgroundColor) 100% + ); + background-color: var(--themePanel-gridColor); + mask-image: url('/chart-bars-background.svg'); + mask-size: cover; + } +`; + +Styled.AppThemeHeader = styled.h3<{ textcolor: string }>` + ${({ textcolor }) => css` + color: ${textcolor}; + `} + z-index: 1; +`; + +Styled.Image = styled.img` + width: 100%; + height: auto; + z-index: 1; +`; + +Styled.ColorPreferenceLabel = styled.div` + ${layoutMixins.inlineRow}; + gap: 1ch; +`; + +Styled.ArrowIconContainer = styled.div` + ${layoutMixins.column} + gap: 0.5ch; + + svg { + height: 0.75em; + width: 0.75em; + } +`; + +Styled.ArrowIcon = styled(Icon)<{ direction: 'up' | 'down'; color: 'green' | 'red' }>` + ${({ direction }) => + ({ + ['up']: css` + transform: rotate(-90deg); + `, + ['down']: css` + transform: rotate(90deg); + `, + }[direction])} + + ${({ color }) => + ({ + ['green']: css` + color: var(--color-green); + `, + ['red']: css` + color: var(--color-red); + `, + }[color])} +`; + +const indicatorStyle = css` + --indicator-size: 1.25rem; + --icon-size: 0.5rem; + + height: var(--indicator-size); + width: var(--indicator-size); + + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; +`; + +Styled.DotIndicator = styled.div<{ $selected: boolean }>` + ${indicatorStyle} + --background-color: var(--color-layer-2); + --border-color: var(--color-border); + + ${({ $selected }) => + $selected && + css` + --background-color: var(--color-accent); + --border-color: var(--color-accent); + + &::after { + content: ''; + display: block; + width: var(--icon-size); + height: var(--icon-size); + background-color: var(--color-layer-2); + border-radius: 50%; + } + `} + + background-color: var(--background-color); + border: solid var(--border-width) var(--border-color); +`; + +Styled.CheckIndicator = styled(Indicator)` + ${indicatorStyle} + position: absolute; + bottom: var(--item-padding); + right: var(--item-padding); + + background-color: var(--color-accent); + color: var(--color-text-button); +`; + +Styled.CheckIcon = styled(Icon)` + width: var(--icon-size); + height: var(--icon-size); +`; diff --git a/src/views/dialogs/ExternalLinkDialog.tsx b/src/views/dialogs/ExternalLinkDialog.tsx index ae2bdb8..231cb24 100644 --- a/src/views/dialogs/ExternalLinkDialog.tsx +++ b/src/views/dialogs/ExternalLinkDialog.tsx @@ -1,3 +1,4 @@ +import type { ReactNode } from 'react'; import styled, { type AnyStyledComponent } from 'styled-components'; import { ButtonAction, ButtonType } from '@/constants/buttons'; @@ -10,26 +11,37 @@ import { Dialog } from '@/components/Dialog'; import { layoutMixins } from '@/styles/layoutMixins'; type ElementProps = { + buttonText?: ReactNode; link: string; linkDescription?: string; + title?: ReactNode; + slotContent?: ReactNode; setIsOpen: (open: boolean) => void; }; -export const ExternalLinkDialog = ({ setIsOpen, link, linkDescription }: ElementProps) => { +export const ExternalLinkDialog = ({ + setIsOpen, + buttonText, + link, + linkDescription, + title, + slotContent, +}: ElementProps) => { const stringGetter = useStringGetter(); return ( + {slotContent}

{stringGetter({ key: STRING_KEYS.LEAVING_WEBSITE_DISCLAIMER })}.

diff --git a/src/views/dialogs/ExternalNavKeplrDialog.tsx b/src/views/dialogs/ExternalNavKeplrDialog.tsx index 329329c..d1622c6 100644 --- a/src/views/dialogs/ExternalNavKeplrDialog.tsx +++ b/src/views/dialogs/ExternalNavKeplrDialog.tsx @@ -1,6 +1,9 @@ +import { useCallback } from 'react'; import styled, { type AnyStyledComponent } from 'styled-components'; +import { useDispatch } from 'react-redux'; import { ButtonAction, ButtonSize, ButtonType } from '@/constants/buttons'; +import { DialogTypes } from '@/constants/dialogs'; import { STRING_KEYS } from '@/constants/localization'; import { useBreakpoints, useStringGetter, useURLConfigs } from '@/hooks'; @@ -9,6 +12,8 @@ import { Dialog, DialogPlacement } from '@/components/Dialog'; import { IconName } from '@/components/Icon'; import { IconButton } from '@/components/IconButton'; +import { closeDialog, openDialog } from '@/state/dialogs'; + import { layoutMixins } from '@/styles/layoutMixins'; type ElementProps = { @@ -18,9 +23,29 @@ type ElementProps = { export const ExternalNavKeplrDialog = ({ setIsOpen }: ElementProps) => { const stringGetter = useStringGetter(); const { keplrDashboard, accountExportLearnMore } = useURLConfigs(); - + const dispatch = useDispatch(); const { isTablet } = useBreakpoints(); + const onExternalNavDialog = useCallback(() => { + dispatch(closeDialog()); + dispatch( + openDialog({ + type: DialogTypes.ExternalLink, + dialogProps: { + buttonText: stringGetter({ key: STRING_KEYS.CONTINUE }), + link: keplrDashboard, + title: stringGetter({ key: STRING_KEYS.LEAVING_WEBSITE_STAKING_GOVERNANCE }), + slotContent: stringGetter({ + key: STRING_KEYS.STAKE_WITH_KEPLR_AND_LEAVING_DESCRIPTION, + params: { + CTA: stringGetter({ key: STRING_KEYS.CONTINUE }), + }, + }), + }, + }) + ); + }, [dispatch]); + return ( { placement={isTablet ? DialogPlacement.FullScreen : DialogPlacement.Default} > - + {stringGetter({ key: STRING_KEYS.NAVIGATE_TO_KEPLR, @@ -46,7 +75,11 @@ export const ExternalNavKeplrDialog = ({ setIsOpen }: ElementProps) => { /> - + {stringGetter({ key: STRING_KEYS.LEARN_TO_EXPORT, diff --git a/src/views/dialogs/ExternalNavStrideDialog.tsx b/src/views/dialogs/ExternalNavStrideDialog.tsx new file mode 100644 index 0000000..2511f8b --- /dev/null +++ b/src/views/dialogs/ExternalNavStrideDialog.tsx @@ -0,0 +1,149 @@ +import { useCallback } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { useDispatch } from 'react-redux'; + +import { ButtonAction, ButtonSize, ButtonType } from '@/constants/buttons'; +import { DialogTypes } from '@/constants/dialogs'; +import { STRING_KEYS } from '@/constants/localization'; +import { useBreakpoints, useStringGetter, useURLConfigs } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Button } from '@/components/Button'; +import { Dialog, DialogPlacement } from '@/components/Dialog'; +import { Icon, IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; + +import { closeDialog, openDialog } from '@/state/dialogs'; + +type ElementProps = { + setIsOpen: (open: boolean) => void; +}; + +export const ExternalNavStrideDialog = ({ setIsOpen }: ElementProps) => { + const stringGetter = useStringGetter(); + const { strideZoneApp, accountExportLearnMore } = useURLConfigs(); + const dispatch = useDispatch(); + const { isTablet } = useBreakpoints(); + + const openExternalNavDialog = useCallback(() => { + dispatch(closeDialog()); + dispatch( + openDialog({ + type: DialogTypes.ExternalLink, + dialogProps: { + buttonText: ( + + {stringGetter({ key: STRING_KEYS.LIQUID_STAKE_ON_STRIDE })} + + + ), + link: strideZoneApp, + title: stringGetter({ key: STRING_KEYS.LIQUID_STAKING_AND_LEAVING }), + slotContent: stringGetter({ + key: STRING_KEYS.LIQUID_STAKING_AND_LEAVING_DESCRIPTION, + params: { + CTA: stringGetter({ key: STRING_KEYS.LIQUID_STAKE_ON_STRIDE }), + }, + }), + }, + }) + ); + }, [dispatch, stringGetter]); + + return ( + + + + + {stringGetter({ + key: STRING_KEYS.NAVIGATE_TO_STRIDE, + params: { + STRONG_YES: {stringGetter({ key: STRING_KEYS.YES })}, + }, + })} + + + + + + + + {stringGetter({ + key: STRING_KEYS.LEARN_TO_EXPORT, + params: { + STRONG_NO: {stringGetter({ key: STRING_KEYS.NO })}, + }, + })} + + + + + + + ); +}; + +const Styled: Record = {}; + +Styled.TextToggle = styled.div` + ${layoutMixins.stickyFooter} + color: var(--color-accent); + cursor: pointer; + + margin-top: auto; + + &:hover { + text-decoration: underline; + } +`; + +Styled.Content = styled.div` + ${layoutMixins.stickyArea0} + --stickyArea0-bottomHeight: 2rem; + --stickyArea0-bottomGap: 1rem; + --stickyArea0-totalInsetBottom: 0.5rem; + + ${layoutMixins.flexColumn} + gap: 1rem; +`; + +Styled.Button = styled(Button)` + --button-font: var(--font-base-book); + --button-padding: 0 1.5rem; + + gap: 0; + + justify-content: space-between; +`; + +Styled.IconButton = styled(IconButton)` + color: var(--color-text-0); + --color-border: var(--color-layer-6); +`; + +Styled.Span = styled.span` + display: flex; + align-items: center; + gap: 0.5ch; +`; diff --git a/src/views/dialogs/MnemonicExportDialog.tsx b/src/views/dialogs/MnemonicExportDialog.tsx index bbb4198..3b7c346 100644 --- a/src/views/dialogs/MnemonicExportDialog.tsx +++ b/src/views/dialogs/MnemonicExportDialog.tsx @@ -155,8 +155,7 @@ Styled.CautionIconContainer = styled.div` content: ''; width: 2.5rem; height: 2.5rem; - background-color: var(--color-error); - opacity: 0.1; + background-color: var(--color-gradient-error); } `; @@ -189,7 +188,7 @@ Styled.WordList = styled.div<{ isShowing?: boolean }>` padding: 1rem; &:hover { - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); } > :first-child { diff --git a/src/views/dialogs/MobileSignInDialog.tsx b/src/views/dialogs/MobileSignInDialog.tsx index 06769fc..3b9b978 100644 --- a/src/views/dialogs/MobileSignInDialog.tsx +++ b/src/views/dialogs/MobileSignInDialog.tsx @@ -183,7 +183,7 @@ Styled.QrCodeContainer = styled.figure<{ isShowing: boolean }>` transition: 0.2s; &:hover { - filter: brightness(1.1); + filter: brightness(var(--hover-filter-base)); } > * { diff --git a/src/views/dialogs/NewMarketMessageDetailsDialog.tsx b/src/views/dialogs/NewMarketMessageDetailsDialog.tsx index e43ca1f..a899a76 100644 --- a/src/views/dialogs/NewMarketMessageDetailsDialog.tsx +++ b/src/views/dialogs/NewMarketMessageDetailsDialog.tsx @@ -128,7 +128,7 @@ export const NewMarketMessageDetailsDialog = ({ {'['} {exchangeConfig?.map((exchange) => { return ( - @@ -139,7 +139,7 @@ export const NewMarketMessageDetailsDialog = ({ ))} {'},'} - + ); })} {']'} @@ -337,17 +337,22 @@ Styled.Text0 = styled.span` `; Styled.Code = styled.div` + height: 16.25rem; + overflow: auto; + display: block; background-color: var(--color-layer-1); padding: 1rem; border-radius: 10px; font: var(--font-mini-book); font-family: var(--fontFamily-monospace); margin-top: 1rem; - display: flex; - flex-direction: column; gap: 0rem; `; +Styled.ExchangeObject = styled.div` + padding: 1rem; +`; + Styled.Details = styled(Details)` --details-item-height: 1.5rem; `; diff --git a/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx b/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx index c65186b..23c560e 100644 --- a/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx +++ b/src/views/dialogs/OnboardingDialog/GenerateKeys.tsx @@ -25,7 +25,7 @@ import { Switch } from '@/components/Switch'; import { WithReceipt } from '@/components/WithReceipt'; import { WithTooltip } from '@/components/WithTooltip'; -import { getSelectedNetwork } from '@/state/appSelectors'; +import { getSelectedNetwork, getSelectedDydxChainId } from '@/state/appSelectors'; import { track } from '@/lib/analytics'; import { isTruthy } from '@/lib/isTruthy'; @@ -44,7 +44,6 @@ export const GenerateKeys = ({ onKeysDerived = () => {}, }: ElementProps) => { const stringGetter = useStringGetter(); - const { isMobile } = useBreakpoints(); const [shouldRememberMe, setShouldRememberMe] = useState(false); @@ -66,17 +65,30 @@ export const GenerateKeys = ({ try { await matchNetwork?.(); + return true; } catch (error) { - const { message, walletErrorType } = parseWalletError({ error, stringGetter }); + const { message, walletErrorType, isErrorExpected } = parseWalletError({ + error, + stringGetter, + }); + + if (!isErrorExpected) { + log('GenerateKeys/switchNetwork', error, { walletErrorType }); + } if (message) { - log('GenerateKeys/switchNetwork', error, { walletErrorType }); setError(message); - throw error; } + + return false; } }; + const switchNetworkAndDeriveKeys = async () => { + const networkSwitched = await switchNetwork(); + if (networkSwitched) await deriveKeys(); + }; + // 2. Derive keys from EVM account const { getWalletFromEvmSignature } = useDydxClient(); const { getSubaccounts } = useAccounts(); @@ -86,7 +98,8 @@ export const GenerateKeys = ({ EvmDerivedAccountStatus.Derived, ].includes(status); - const signTypedData = getSignTypedData(selectedNetwork); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); + const signTypedData = getSignTypedData(selectedDydxChainId); const { signTypedDataAsync } = useSignTypedData({ ...signTypedData, domain: { @@ -154,11 +167,16 @@ export const GenerateKeys = ({ setStatus(EvmDerivedAccountStatus.Derived); } catch (error) { setStatus(EvmDerivedAccountStatus.NotDerived); - const { message, walletErrorType } = parseWalletError({ error, stringGetter }); + const { message, walletErrorType, isErrorExpected } = parseWalletError({ + error, + stringGetter, + }); if (message) { setError(message); - log('GenerateKeys/deriveKeys', error, { walletErrorType }); + if (!isErrorExpected) { + log('GenerateKeys/deriveKeys', error, { walletErrorType }); + } } } }; @@ -231,7 +249,7 @@ export const GenerateKeys = ({ {!isMatchingNetwork ? ( + ); + + const submitButton = ( + : undefined + } + > + {stringGetter({ + key: buttonTextStringKey, + params: { + ORDER: stringGetter({ + key: confirmButtonConfig.stringKey, + }), + }, + })} + + ); + return ( - {!canAccountTrade || showConnectWallet ? ( + {!canAccountTrade ? ( ) : showDeposit ? ( - + depositButton ) : ( - + + {submitButton} + )} ); }; + +const Styled: Record = {}; + +Styled.Button = styled(Button)` + width: 100%; +`; + +Styled.WarningIcon = styled(Icon)` + color: var(--color-warning); +`; diff --git a/src/views/forms/TransferForm.tsx b/src/views/forms/TransferForm.tsx index 291e768..fcd83af 100644 --- a/src/views/forms/TransferForm.tsx +++ b/src/views/forms/TransferForm.tsx @@ -9,7 +9,6 @@ import { TransferInputField, TransferType } from '@/constants/abacus'; import { AlertType } from '@/constants/alerts'; import { ButtonShape, ButtonSize } from '@/constants/buttons'; import { STRING_KEYS } from '@/constants/localization'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; import { NumberSign } from '@/constants/numbers'; import { DydxChainAsset } from '@/constants/wallets'; @@ -18,7 +17,6 @@ import { useAccounts, useDydxClient, useRestrictions, - useSelectedNetwork, useStringGetter, useSubaccount, useTokenConfigs, @@ -41,6 +39,7 @@ import { TransferButtonAndReceipt } from '@/views/forms/TransferForm/TransferBut import { WithDetailsReceipt } from '@/components/WithDetailsReceipt'; import { getSubaccount } from '@/state/accountSelectors'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; import { getTransferInputs } from '@/state/inputsSelectors'; import abacusStateManager from '@/lib/abacus'; @@ -63,7 +62,7 @@ export const TransferForm = ({ const { dydxAddress } = useAccounts(); const { transfer } = useSubaccount(); const { nativeTokenBalance, usdcBalance } = useAccountBalance(); - const { selectedNetwork } = useSelectedNetwork(); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); const { tokensConfigs, usdcLabel, chainTokenLabel } = useTokenConfigs(); const { @@ -239,7 +238,7 @@ export const TransferForm = ({ const networkOptions = [ { - chainId: ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId, + chainId: selectedDydxChainId, label: ( {stringGetter({ key: STRING_KEYS.DYDX_CHAIN })} @@ -306,7 +305,7 @@ export const TransferForm = ({ label={ {stringGetter({ key: STRING_KEYS.DESTINATION })} - {isAddressValid && } + {isAddressValid && } } type={InputType.Text} @@ -322,7 +321,7 @@ export const TransferForm = ({ /> {networkOptions.map(({ chainId, label }) => ( @@ -439,10 +438,10 @@ Styled.InlineRow = styled.span` Styled.DestinationInputLabel = styled.span` ${layoutMixins.inlineRow} +`; - svg { - color: var(--color-positive); - } +Styled.CheckIcon = styled(Icon)` + color: var(--color-success); `; Styled.AddressValidationAlertMessage = styled(AlertMessage)` diff --git a/src/views/menus/AccountMenu.tsx b/src/views/menus/AccountMenu.tsx index 2796a88..f40b2b4 100644 --- a/src/views/menus/AccountMenu.tsx +++ b/src/views/menus/AccountMenu.tsx @@ -1,4 +1,4 @@ -import { memo } from 'react'; +import { ElementType, memo } from 'react'; import styled, { AnyStyledComponent, css } from 'styled-components'; import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import type { Dispatch } from '@reduxjs/toolkit'; @@ -7,7 +7,6 @@ import { OnboardingState } from '@/constants/account'; import { ButtonAction, ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons'; import { DialogTypes } from '@/constants/dialogs'; import { STRING_KEYS, StringGetterFunction, TOOLTIP_STRING_KEYS } from '@/constants/localization'; -import { isMainnet } from '@/constants/networks'; import { DydxChainAsset, wallets } from '@/constants/wallets'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -32,14 +31,15 @@ import { Icon, IconName } from '@/components/Icon'; import { IconButton } from '@/components/IconButton'; import { WithTooltip } from '@/components/WithTooltip'; +import { AppTheme } from '@/state/configs'; import { openDialog } from '@/state/dialogs'; import { getOnboardingState, getSubaccount } from '@/state/accountSelectors'; +import { getAppTheme } from '@/state/configsSelectors'; import { isTruthy } from '@/lib/isTruthy'; import { truncateAddress } from '@/lib/wallet'; import { MustBigNumber } from '@/lib/numbers'; -import { testFlags } from '@/lib/testFlags'; export const AccountMenu = () => { const stringGetter = useStringGetter(); @@ -50,6 +50,7 @@ export const AccountMenu = () => { const { freeCollateral } = useSelector(getSubaccount, shallowEqual) || {}; const { nativeTokenBalance } = useAccountBalance(); const { usdcLabel, chainTokenLabel } = useTokenConfigs(); + const theme = useSelector(getAppTheme); const { evmAddress, walletType, dydxAddress, hdKey } = useAccounts(); @@ -105,7 +106,7 @@ export const AccountMenu = () => { {walletType && ( - + )} @@ -177,9 +178,20 @@ export const AccountMenu = () => { label: stringGetter({ key: STRING_KEYS.PREFERENCES }), onSelect: () => dispatch(openDialog({ type: DialogTypes.Preferences })), }, + { + value: 'DisplaySettings', + icon: + theme === AppTheme.Light ? ( + + ) : ( + + ), + label: stringGetter({ key: STRING_KEYS.DISPLAY_SETTINGS }), + onSelect: () => dispatch(openDialog({ type: DialogTypes.DisplaySettings })), + }, ...(onboardingState === OnboardingState.AccountConnected && hdKey ? [ - (!isMainnet || testFlags.showMobileSignInOption) && { + { value: 'MobileQrSignIn', icon: , label: stringGetter({ key: STRING_KEYS.TITLE_SIGN_INTO_MOBILE }), @@ -189,16 +201,16 @@ export const AccountMenu = () => { value: 'MnemonicExport', icon: , label: {stringGetter({ key: STRING_KEYS.EXPORT_SECRET_PHRASE })}, - highlightColor: 'negative', + highlightColor: 'destroy', onSelect: () => dispatch(openDialog({ type: DialogTypes.MnemonicExport })), }, - ].filter(isTruthy) + ] : []), { value: 'Disconnect', icon: , label: stringGetter({ key: STRING_KEYS.DISCONNECT }), - highlightColor: 'negative', + highlightColor: 'destroy', onSelect: () => dispatch(openDialog({ type: DialogTypes.DisconnectWallet })), }, ].filter(isTruthy)} @@ -208,7 +220,7 @@ export const AccountMenu = () => { {onboardingState === OnboardingState.WalletConnected ? ( ) : onboardingState === OnboardingState.AccountConnected ? ( - walletType && + walletType && ) : null} {!isTablet && {truncateAddress(dydxAddress)}} diff --git a/src/views/menus/useGlobalCommands.tsx b/src/views/menus/useGlobalCommands.tsx index 017df38..504c052 100644 --- a/src/views/menus/useGlobalCommands.tsx +++ b/src/views/menus/useGlobalCommands.tsx @@ -6,19 +6,19 @@ import { TradeLayouts } from '@/constants/layout'; import { AssetIcon } from '@/components/AssetIcon'; -import { AppTheme, setAppTheme } from '@/state/configs'; +import { + AppTheme, + AppThemeSystemSetting, + AppColorMode, + setAppThemeSetting, + setAppColorMode, +} from '@/state/configs'; import { setSelectedTradeLayout } from '@/state/layout'; import { getAssets } from '@/state/assetsSelectors'; import { getPerpetualMarkets } from '@/state/perpetualsSelectors'; import { Asset, PerpetualMarket } from '@/constants/abacus'; -enum ThemeItems { - SetClassicTheme = 'SetDefaultTheme', - SetLightTheme = 'SetLightTheme', - SetDarkTheme = 'SetDarkTheme', -} - enum LayoutItems { setDefaultLayout = 'SetDefaultLayout', setReverseLayout = 'SetReverseLayout', @@ -53,24 +53,51 @@ export const useGlobalCommands = (): MenuConfig => { groupLabel: 'Themes', items: [ { - value: ThemeItems.SetClassicTheme, + value: AppTheme.Classic, label: 'Set Classic Theme', onSelect: () => { - dispatch(setAppTheme(AppTheme.Classic)); + dispatch(setAppThemeSetting(AppTheme.Classic)); }, }, { - value: ThemeItems.SetLightTheme, + value: AppThemeSystemSetting.System, + label: 'Set System Theme', + onSelect: () => { + dispatch(setAppThemeSetting(AppThemeSystemSetting.System)); + }, + }, + { + value: AppTheme.Light, label: 'Set Light Theme', onSelect: () => { - dispatch(setAppTheme(AppTheme.Light)); + dispatch(setAppThemeSetting(AppTheme.Light)); }, }, { - value: ThemeItems.SetDarkTheme, + value: AppTheme.Dark, label: 'Set Dark Theme', onSelect: () => { - dispatch(setAppTheme(AppTheme.Dark)); + dispatch(setAppThemeSetting(AppTheme.Dark)); + }, + }, + ], + }, + { + group: 'colorPreferences', + groupLabel: 'Color Preferences', + items: [ + { + value: AppColorMode.GreenUp, + label: 'Set Green is Up', + onSelect: () => { + dispatch(setAppColorMode(AppColorMode.GreenUp)); + }, + }, + { + value: AppColorMode.RedUp, + label: 'Set Red is Up', + onSelect: () => { + dispatch(setAppColorMode(AppColorMode.RedUp)); }, }, ], diff --git a/src/views/notifications/BlockRewardNotification/index.tsx b/src/views/notifications/BlockRewardNotification/index.tsx index 200522b..fce36ee 100644 --- a/src/views/notifications/BlockRewardNotification/index.tsx +++ b/src/views/notifications/BlockRewardNotification/index.tsx @@ -72,7 +72,7 @@ Styled.Notification = styled(Notification)` Styled.Output = styled(Output)` &:before { content: '+'; - color: var(--color-positive); + color: var(--color-success); margin-right: 0.5ch; } `; diff --git a/src/views/notifications/TradeNotification/index.tsx b/src/views/notifications/TradeNotification/index.tsx index d628b2d..b723f13 100644 --- a/src/views/notifications/TradeNotification/index.tsx +++ b/src/views/notifications/TradeNotification/index.tsx @@ -11,7 +11,7 @@ import { } from '@/constants/abacus'; import { STRING_KEYS } from '@/constants/localization'; -import { TRADE_TYPE_STRINGS, TradeTypes } from '@/constants/trade'; +import { ORDER_TYPE_STRINGS, TradeTypes } from '@/constants/trade'; import { useStringGetter } from '@/hooks'; import { layoutMixins } from '@/styles/layoutMixins'; @@ -48,7 +48,7 @@ export const TradeNotification = ({ isToast, data, notification }: TradeNotifica const { assetId } = marketData ?? {}; const orderType = ORDER_TYPE as KotlinIrEnumValues; const tradeType = TRADE_TYPES[orderType]; - const titleKey = tradeType && TRADE_TYPE_STRINGS[tradeType]?.tradeTypeKey; + const titleKey = tradeType && ORDER_TYPE_STRINGS[tradeType]?.orderTypeKey; const orderStatus = ORDER_STATUS as KotlinIrEnumValues; return ( diff --git a/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx b/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx index 3cb050b..f522a06 100644 --- a/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx +++ b/src/views/notifications/TransferStatusNotification/TransferStatusSteps.tsx @@ -1,18 +1,21 @@ import { useMemo } from 'react'; +import { useSelector } from 'react-redux'; import styled, { css, type AnyStyledComponent } from 'styled-components'; import { StatusResponse } from '@0xsquid/sdk'; -import { useStringGetter, useSelectedNetwork, useURLConfigs } from '@/hooks'; +import { STRING_KEYS } from '@/constants/localization'; +import { TransferNotificationTypes } from '@/constants/notifications'; + +import { useStringGetter, useURLConfigs } from '@/hooks'; + +import { layoutMixins } from '@/styles/layoutMixins'; import { Link } from '@/components/Link'; import { Icon, IconName } from '@/components/Icon'; import { LoadingDots } from '@/components/Loading/LoadingDots'; import { LoadingSpinner } from '@/components/Loading/LoadingSpinner'; -import { layoutMixins } from '@/styles/layoutMixins'; -import { STRING_KEYS } from '@/constants/localization'; -import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; -import { TransferNotificationTypes } from '@/constants/notifications'; +import { getSelectedDydxChainId } from '@/state/appSelectors'; type ElementProps = { status?: StatusResponse; @@ -32,9 +35,8 @@ enum TransferStatusStep { export const TransferStatusSteps = ({ className, status, type }: ElementProps & StyleProps) => { const stringGetter = useStringGetter(); - const { selectedNetwork } = useSelectedNetwork(); + const selectedDydxChainId = useSelector(getSelectedDydxChainId); const { mintscan: mintscanTxUrl } = useURLConfigs(); - const dydxChainId = ENVIRONMENT_CONFIG_MAP[selectedNetwork].dydxChainId; const { currentStep, steps } = useMemo(() => { const routeStatus = status?.routeStatus; @@ -55,7 +57,7 @@ export const TransferStatusSteps = ({ className, status, type }: ElementProps & link: type === TransferNotificationTypes.Deposit ? status?.fromChain?.transactionUrl - : routeStatus?.[0]?.chainId === dydxChainId && routeStatus[0].txHash + : routeStatus?.[0]?.chainId === selectedDydxChainId && routeStatus[0].txHash ? `${mintscanTxUrl?.replace('{tx_hash}', routeStatus[0].txHash.replace('0x', ''))}` : undefined, }, @@ -81,7 +83,7 @@ export const TransferStatusSteps = ({ className, status, type }: ElementProps & link: type === TransferNotificationTypes.Withdrawal ? status?.toChain?.transactionUrl - : currentStatus?.chainId === dydxChainId && currentStatus?.txHash + : currentStatus?.chainId === selectedDydxChainId && currentStatus?.txHash ? `${mintscanTxUrl?.replace('{tx_hash}', currentStatus.txHash.replace('0x', ''))}` : undefined, }, @@ -179,7 +181,7 @@ Styled.Icon = styled.div<{ state: 'complete' | 'default' }>` ${({ state }) => ({ ['complete']: css` - color: var(--color-positive); + color: var(--color-success); `, ['default']: css` color: var(--color-text-0); diff --git a/src/views/tables/OrdersTable/OrderActionsCell.tsx b/src/views/tables/OrdersTable/OrderActionsCell.tsx index e2fac52..e974384 100644 --- a/src/views/tables/OrdersTable/OrderActionsCell.tsx +++ b/src/views/tables/OrdersTable/OrderActionsCell.tsx @@ -82,6 +82,6 @@ Styled.ActionButton = styled(IconButton)` Styled.CancelButton = styled(Styled.ActionButton)` &:not(:disabled) { - --button-textColor: var(--color-negative); + --button-textColor: var(--color-red); } `; diff --git a/src/views/tables/TradingRewardHistoryTable.tsx b/src/views/tables/TradingRewardHistoryTable.tsx new file mode 100644 index 0000000..f856ed7 --- /dev/null +++ b/src/views/tables/TradingRewardHistoryTable.tsx @@ -0,0 +1,164 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; +import { shallowEqual, useSelector } from 'react-redux'; + +import { HistoricalTradingRewardsPeriods, HistoricalTradingReward } from '@/constants/abacus'; +import { STRING_KEYS, StringGetterFunction } from '@/constants/localization'; +import { useStringGetter, useTokenConfigs } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { AssetIcon } from '@/components/AssetIcon'; +import { Output, OutputType } from '@/components/Output'; +import { Table, TableCell, type ColumnDef } from '@/components/Table'; + +import { + getHistoricalTradingRewards, + getHistoricalTradingRewardsForPeriod, +} from '@/state/accountSelectors'; + +export enum TradingRewardHistoryTableColumnKey { + Event = 'Event', + Earned = 'Earned', +} + +const getTradingRewardHistoryTableColumnDef = ({ + key, + chainTokenLabel, + stringGetter, +}: { + key: TradingRewardHistoryTableColumnKey; + chainTokenLabel: string; + stringGetter: StringGetterFunction; +}): ColumnDef => ({ + ...( + { + [TradingRewardHistoryTableColumnKey.Event]: { + columnKey: TradingRewardHistoryTableColumnKey.Event, + getCellValue: (row) => row.startedAtInMilliseconds, + label: stringGetter({ key: STRING_KEYS.EVENT }), + renderCell: ({ startedAtInMilliseconds, endedAtInMilliseconds }) => ( + + {stringGetter({ key: STRING_KEYS.REWARDED })} + + {stringGetter({ + key: STRING_KEYS.FOR_TRADING, + params: { + PERIOD: ( + <> + + → + + + ), + }, + })} + + + ), + }, + [TradingRewardHistoryTableColumnKey.Earned]: { + columnKey: TradingRewardHistoryTableColumnKey.Earned, + getCellValue: (row) => row.amount, + label: stringGetter({ key: STRING_KEYS.EARNED }), + renderCell: ({ amount }) => ( + } + /> + ), + }, + } as Record> + )[key], +}); + +type ElementProps = { + columnKeys?: TradingRewardHistoryTableColumnKey[]; + period: HistoricalTradingRewardsPeriods; +}; + +type StyleProps = { + withOuterBorder?: boolean; + withInnerBorders?: boolean; +}; + +export const TradingRewardHistoryTable = ({ + period, + columnKeys = Object.values(TradingRewardHistoryTableColumnKey), + withOuterBorder, + withInnerBorders = true, +}: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + const { chainTokenLabel } = useTokenConfigs(); + + const periodTradingRewards = useSelector( + getHistoricalTradingRewardsForPeriod(period.name), + shallowEqual + ); + + return ( + row.startedAtInMilliseconds} + columns={columnKeys.map((key: TradingRewardHistoryTableColumnKey) => + getTradingRewardHistoryTableColumnDef({ + key, + chainTokenLabel, + stringGetter, + }) + )} + slotEmpty={ +
{stringGetter({ key: STRING_KEYS.EMPTY_HISTORICAL_REWARDS_DESCRIPTION })}
+ } + selectionBehavior="replace" + withOuterBorder={withOuterBorder} + withInnerBorders={withInnerBorders} + viewMoreConfig={{ initialNumRowsToShow: 5, numRowsPerPage: 10 }} + withScrollSnapColumns + withScrollSnapRows + /> + ); +}; + +const Styled: Record = {}; + +Styled.Table = styled(Table)` + --tableCell-padding: 0.5rem 0; + --tableHeader-backgroundColor: var(--color-layer-3); + --tableRow-backgroundColor: var(--color-layer-3); + --tableViewMore-borderColor: var(--color-layer-3); + + tbody { + font: var(--font-medium-book); + } +`; + +Styled.Rewarded = styled.span` + color: var(--color-text-2); +`; + +Styled.TimePeriod = styled.div` + ${layoutMixins.inlineRow} + + && { + color: var(--color-text-0); + font: var(--font-base-book); + } + + output { + color: var(--color-text-1); + font: var(--font-base-book); + } +`; + +Styled.AssetIcon = styled(AssetIcon)` + margin-left: 0.5ch; +`; diff --git a/tradingview/tradingview.tgz b/tradingview/tradingview.tgz index ebc537f..e845da8 100644 Binary files a/tradingview/tradingview.tgz and b/tradingview/tradingview.tgz differ