From ff9e741d3fca1ec7b5d140012faa6b67b8426ac5 Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 16 Sep 2024 14:45:30 +0500 Subject: [PATCH 001/137] feat: implement figma tokens resolver --- .../shared/api/figma-tokens/resolve/index.ts | 2 + .../resolve/resolved-categories.ts | 56 + .../api/figma-tokens/resolve/resolver.ts | 74 + .../tokens/curve-figma-design.tokens.json | 6103 +++++++++++++++++ .../tokens/curve-figma-design.types.ts | 3 + .../shared/api/figma-tokens/tokens/index.ts | 3 + .../api/figma-tokens/tokens/variants.types.ts | 30 + 7 files changed, 6271 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/index.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.tokens.json create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.types.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/index.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/variants.types.ts diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/index.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/index.ts new file mode 100644 index 000000000..6aa7ff6fa --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/index.ts @@ -0,0 +1,2 @@ +export * from './resolved-categories' +export * from './resolver' diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts new file mode 100644 index 000000000..847fcbe5a --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts @@ -0,0 +1,56 @@ +import { + resolveTableTypographyVariants, + resolveTypographyVariants, + type ResolvedTypography, +} from '@/shared/ui/Typography' +import { curveFigmaDesignTokens, type CurveFigmaDesignTokens, type ScreenType } from '../tokens' +import { resolveFigmaTokens, type ResolvedValue } from './resolver' + +export const GridCategory = '00_grid' as const +export const PrimitivesCategory = '00_primitives' as const +export const EffectCategory = '00_effect' as const +export const SurfacesAndTextCategory = '01_surfaces&text' as const +export const MappedSizesAndSpacesCategory = '01_mapped_sizes&spaces' as const +export const TypographyCategory = 'typography' as const +export const ThemeCategory = '02_theme' as const +export const FontCategory = '02_font' as const + +export type ResolvedFigmaTokens = ResolvedValue + +export type FigmaTypography = ResolvedFigmaTokens[typeof TypographyCategory] +export type FigmaPrimitives = ResolvedFigmaTokens[typeof PrimitivesCategory] +export type FigmaEffects = ResolvedFigmaTokens[typeof EffectCategory] +export type FigmaGrid = ResolvedFigmaTokens[typeof GridCategory] +export type FigmaSurfacesAndText = ResolvedFigmaTokens[typeof SurfacesAndTextCategory] +export type FigmaMappedSizesAndSpaces = ResolvedFigmaTokens[typeof MappedSizesAndSpacesCategory] +export type FigmaTheme = ResolvedFigmaTokens[typeof ThemeCategory] +export type FigmaThemes = Record + +export type FigmaTokens = { + typography: ResolvedTypography + primitives: FigmaPrimitives + effects: FigmaEffects + grid: FigmaGrid + surfacesAndText: FigmaSurfacesAndText + mappedSizesAndSpaces: FigmaMappedSizesAndSpaces + themes: FigmaThemes +} + +const figmaTokensDesktop: ResolvedFigmaTokens = resolveFigmaTokens(curveFigmaDesignTokens) +const figmaTokensMobile: ResolvedFigmaTokens = resolveFigmaTokens(curveFigmaDesignTokens, 'mobile') + +export const figmaTokens: FigmaTokens = { + typography: { + ...resolveTypographyVariants(figmaTokensDesktop[TypographyCategory]), + ...resolveTableTypographyVariants(figmaTokensDesktop[TypographyCategory]), + }, + primitives: figmaTokensDesktop[PrimitivesCategory], + effects: figmaTokensDesktop[EffectCategory], + grid: figmaTokensDesktop[GridCategory], + surfacesAndText: figmaTokensDesktop[SurfacesAndTextCategory], + mappedSizesAndSpaces: figmaTokensDesktop[MappedSizesAndSpacesCategory], + themes: { + desktop: figmaTokensDesktop[ThemeCategory], + mobile: figmaTokensMobile[ThemeCategory], + }, +} as const diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts new file mode 100644 index 000000000..19b4de3fb --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts @@ -0,0 +1,74 @@ +import type { CurveFigmaDesignTokens, ScreenType } from '../tokens' + +export type ResolvedValue = T extends { type: string; value: infer V } + ? V extends string + ? V extends `{${string}}` + ? ResolvedTokenValue + : V + : V + : T extends object + ? { [K in keyof T]: ResolvedValue } + : T + +export type ResolvedTokenValue = TokenPath extends `{${infer Path}}` + ? Path extends keyof TokenTree + ? TokenTree[Path] extends { value: infer V } + ? V + : never + : Path extends `${infer FirstKey}.${infer RestOfPath}` + ? FirstKey extends keyof TokenTree + ? ResolvedTokenValue + : ResolvedTokenValue + : never + : never + +export function resolveFigmaTokens( + tokenTree: T, + screenType: ScreenType = 'desktop', +): ResolvedValue { + const resolveTokenValue = (tokenValue: any, rootTokens: any): any => { + if (typeof tokenValue === 'object' && tokenValue !== null) { + if ('type' in tokenValue && 'value' in tokenValue) { + return resolveTokenValue(tokenValue.value, rootTokens) + } + return Object.fromEntries( + Object.entries(tokenValue).map(([key, val]) => [key, resolveTokenValue(val, rootTokens)]), + ) + } + if (typeof tokenValue === 'string' && tokenValue.startsWith('{') && tokenValue.endsWith('}')) { + const tokenPath = tokenValue.slice(1, -1).split('.') + const resolvedValue = resolveTokenPath(tokenPath, rootTokens) + + const finalValue = resolveTokenValue(resolvedValue, rootTokens) + + if (typeof finalValue === 'object') { + throw new Error( + `Unable to resolve token: ${tokenValue}. Resolved value is an object: ${JSON.stringify(finalValue)}`, + ) + } + return finalValue + } + return tokenValue + } + + const resolvePathSegment = (current: any, segment: string): any => { + if (segment in current) return current[segment] + if (screenType in current) return current[screenType] + if ('default' in current) return current.default + if ('inverted' in current) return current.inverted + if (!(segment in current)) return current + } + + const resolveTokenPath = (path: string[], root: any): any => { + return path.reduce((acc, segment) => { + const resolved = resolvePathSegment(acc, segment) + if (resolved === undefined) { + throw new Error(`Unable to resolve token: ${path.join('.')}`) + } + return resolved + }, root) + } + + const newTokenTree = JSON.parse(JSON.stringify(tokenTree)) + return resolveTokenValue(newTokenTree, newTokenTree) as ResolvedValue +} diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.tokens.json b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.tokens.json new file mode 100644 index 000000000..779a48a28 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.tokens.json @@ -0,0 +1,6103 @@ +{ + "00_grid": { + "12-col_main": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 12, + "offset": 36 + } + }, + "12-col_cards": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 12, + "offset": 24 + } + }, + "no margin": { + "12-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 12, + "offset": 0 + } + }, + "11-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 11, + "offset": 0 + } + }, + "10-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 10, + "offset": 0 + } + }, + "9-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 9, + "offset": 0 + } + }, + "8-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 8, + "offset": 0 + } + }, + "7-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 7, + "offset": 0 + } + }, + "6-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 6, + "offset": 0 + } + }, + "5-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 5, + "offset": 0 + } + }, + "4-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 4, + "offset": 0 + } + }, + "3-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 3, + "offset": 0 + } + }, + "2-col": { + "description": null, + "type": "custom-grid", + "value": { + "pattern": "columns", + "gutterSize": 24, + "alignment": "stretch", + "count": 2, + "offset": 0 + } + } + } + }, + "02_font": { + "heading": { + "xxl": { + "description": "To be used only in Hero Banners", + "type": "custom-fontStyle", + "value": { + "fontSize": 64, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": -2.56, + "lineHeight": 64, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "mbold": { + "description": "To be used for large items, such as page titles, large navigation items", + "type": "custom-fontStyle", + "value": { + "fontSize": 32, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": -1.28, + "lineHeight": 36, + "paragraphIndent": 0, + "paragraphSpacing": 72, + "textCase": "uppercase" + } + }, + "mlight": { + "type": "custom-fontStyle", + "value": { + "fontSize": 32, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": -1.28, + "lineHeight": 36, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "uppercase" + } + }, + "sbold": { + "description": "To be used for medium items, such as section titles, small card titles, chart titles", + "type": "custom-fontStyle", + "value": { + "fontSize": 24, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": -0.48, + "lineHeight": 28, + "paragraphIndent": 0, + "paragraphSpacing": 16, + "textCase": "uppercase" + } + }, + "xsbold": { + "description": "To be used for the smallest highlighted items, such as small section titles, etc", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "uppercase" + } + }, + "xsmedium": { + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "capitalize" + } + } + }, + "body": { + "mregular": { + "description": "For all the body of the app", + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 24, + "paragraphIndent": 0, + "paragraphSpacing": 12, + "textCase": "none" + } + }, + "mbold": { + "description": "For all the highlighted items of body of the app", + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 24, + "paragraphIndent": 0, + "paragraphSpacing": 12, + "textCase": "none" + } + }, + "sregular": { + "description": "For all the smaller informational items in the body of the app", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 8, + "textCase": "none" + } + }, + "sbold": { + "description": "For all the smaller informational items that need to be highlighted in the body of the app", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 8, + "textCase": "none" + } + }, + "xsregular": { + "description": "For the very fine details in the body of the app", + "type": "custom-fontStyle", + "value": { + "fontSize": 12, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 8, + "textCase": "none" + } + }, + "xsbold": { + "description": "For the very fine details in the body of the app that need to be highlighted", + "type": "custom-fontStyle", + "value": { + "fontSize": 12, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 8, + "textCase": "none" + } + } + }, + "button-label": { + "xs": { + "description": "To be used ONLY on button labels.", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "s": { + "description": "To be used ONLY on button labels.", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 24, + "paragraphIndent": 0, + "paragraphSpacing": 20, + "textCase": "uppercase" + } + }, + "m": { + "description": "To be used ONLY on button labels.", + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 40, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "uppercase" + } + } + }, + "table": { + "header": { + "m": { + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 16, + "textCase": "none" + } + }, + "s": { + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 14, + "textCase": "none" + } + } + }, + "cell": { + "l": { + "description": "This style should never be used outside of a table cell.\nIt applies to the larger labels of items in the first row.", + "type": "custom-fontStyle", + "value": { + "fontSize": 20, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 20, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "mregular": { + "description": "This style should never be used outside of a table cell.\nIt applies to the Default labels of items of the first line of a cell.", + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "mbold": { + "description": "This style should never be used outside of a table cell.\nIt applies to highlighted items of the first line of a cell.", + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 600, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "sregular": { + "description": "This style should never be used outside of a table cell.\nIt applies to default item of the second line of a cell.", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "sbold": { + "description": "This style should never be used outside of a table cell.\nIt applies to highlighted items of the second line of a cell.", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + } + } + }, + "highlighted": { + "xsnotional": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "type": "custom-fontStyle", + "value": { + "fontSize": 12, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 500, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "xs": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "type": "custom-fontStyle", + "value": { + "fontSize": 12, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 14, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "s": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "type": "custom-fontStyle", + "value": { + "fontSize": 14, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "m": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "type": "custom-fontStyle", + "value": { + "fontSize": 16, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 16, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "l": { + "type": "custom-fontStyle", + "value": { + "fontSize": 24, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": 0, + "lineHeight": 24, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "xl": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "type": "custom-fontStyle", + "value": { + "fontSize": 32, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": -1.28, + "lineHeight": 36, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + }, + "xxl": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "type": "custom-fontStyle", + "value": { + "fontSize": 64, + "textDecoration": "none", + "fontFamily": "Mona Sans", + "fontWeight": 700, + "fontStyle": "normal", + "fontStretch": "normal", + "letterSpacing": -2.56, + "lineHeight": 64, + "paragraphIndent": 0, + "paragraphSpacing": 0, + "textCase": "none" + } + } + } + }, + "00_effect": { + "activetabshadow": { + "0": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 0, + "color": "#0e3f7e0a", + "offsetX": 0, + "offsetY": 0, + "spread": 1 + } + }, + "1": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 1, + "color": "#2a33450a", + "offsetX": 1, + "offsetY": 0, + "spread": -0.5 + } + }, + "2": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 3, + "color": "#2a33460a", + "offsetX": 3, + "offsetY": 0, + "spread": -1.5 + } + }, + "3": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 6, + "color": "#2a33460a", + "offsetX": 6, + "offsetY": 0, + "spread": -3 + } + }, + "4": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 1, + "color": "#2a33450a", + "offsetX": -1, + "offsetY": 0, + "spread": -0.5 + } + }, + "5": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 3, + "color": "#2a33460a", + "offsetX": -3, + "offsetY": 0, + "spread": -1.5 + } + }, + "6": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 6, + "color": "#2a33460a", + "offsetX": -6, + "offsetY": 0, + "spread": -3 + } + }, + "description": null + }, + "elevation": { + "level 3": { + "0": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 0, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 0, + "spread": 1 + } + }, + "1": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 1, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 1, + "spread": -0.5 + } + }, + "2": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 3, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 3, + "spread": -1.5 + } + }, + "3": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 8, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 8, + "spread": -4 + } + }, + "4": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 16, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 16, + "spread": -8 + } + }, + "5": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 32, + "color": "#2a33451a", + "offsetX": 0, + "offsetY": 32, + "spread": -16 + } + }, + "description": null + }, + "level 2": { + "0": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 0, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 0, + "spread": 1 + } + }, + "1": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 1, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 1, + "spread": -0.5 + } + }, + "2": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 3, + "color": "#2a334624", + "offsetX": 0, + "offsetY": 3, + "spread": -1.5 + } + }, + "3": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 6, + "color": "#2a334624", + "offsetX": 0, + "offsetY": 6, + "spread": -3 + } + }, + "4": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 8, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 8, + "spread": -6 + } + }, + "5": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 12, + "color": "#2a334514", + "offsetX": 0, + "offsetY": 12, + "spread": -6 + } + }, + "description": null + }, + "level 1": { + "0": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 0, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 0, + "spread": 1 + } + }, + "1": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 1, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 1, + "spread": -0.5 + } + }, + "2": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 3, + "color": "#2a334624", + "offsetX": 0, + "offsetY": 3, + "spread": -1.5 + } + }, + "3": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 4, + "color": "#2a334524", + "offsetX": 0, + "offsetY": 4, + "spread": -2 + } + }, + "4": { + "type": "custom-shadow", + "value": { + "shadowType": "dropShadow", + "radius": 8, + "color": "#2a334514", + "offsetX": 0, + "offsetY": 8, + "spread": -8 + } + }, + "description": null + }, + "level -1": { + "description": null, + "type": "custom-shadow", + "value": { + "shadowType": "innerShadow", + "radius": 0, + "color": "#3b3833ff", + "offsetX": 1, + "offsetY": 1, + "spread": 0 + } + }, + "level -2": { + "description": null, + "type": "custom-shadow", + "value": { + "shadowType": "innerShadow", + "radius": 0, + "color": "#3b3833ff", + "offsetX": 2, + "offsetY": 2, + "spread": 0 + } + } + } + }, + "02_theme": { + "light": { + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.1.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.1.outline}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.2.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.2.outline}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.3.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.3.outline}" + } + }, + "highlight": { + "outline": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.highlight}" + }, + "fill": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.highlight}" + } + }, + "app": { + "background": { + "type": "color", + "value": "#f0edebff", + "blendMode": "normal" + } + } + }, + "text": { + "textcolors": { + "primary": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.primary}" + }, + "secondary": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.secondary}" + }, + "tertiary": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.tertiary}" + }, + "highlight": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.highlight}" + }, + "disabled": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.disabled}" + }, + "success": { + "type": "color", + "value": "{00_primitives.light.greens.500}" + }, + "alert": { + "type": "color", + "value": "{00_primitives.light.reds.500}" + }, + "warning": { + "type": "color", + "value": "{00_primitives.light.reds.400}" + } + }, + "fontfamily": { + "heading": { + "type": "string", + "value": "Mona Sans" + }, + "body": { + "type": "string", + "value": "Mona Sans" + }, + "mono": { + "type": "string", + "value": "Mona Sans" + }, + "button": { + "type": "string", + "value": "Mona Sans" + } + } + }, + "feedback": { + "warning": { + "type": "color", + "value": "{00_primitives.light.reds.300}" + }, + "success": { + "type": "color", + "value": "{00_primitives.light.greens.300}" + }, + "alert": { + "type": "color", + "value": "{00_primitives.light.reds.500}" + } + }, + "color": { + "neutral": { + "25": { + "type": "color", + "value": "{00_primitives.light.grays.25}" + }, + "50": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "75": { + "type": "color", + "value": "{00_primitives.light.grays.75}" + }, + "100": { + "type": "color", + "value": "{00_primitives.light.grays.100}" + }, + "150": { + "type": "color", + "value": "{00_primitives.light.grays.150}" + }, + "200": { + "type": "color", + "value": "{00_primitives.light.grays.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.light.grays.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.light.grays.400}" + }, + "500": { + "type": "color", + "value": "{00_primitives.light.grays.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.light.grays.600}" + }, + "700": { + "type": "color", + "value": "{00_primitives.light.grays.700}" + }, + "750": { + "type": "color", + "value": "{00_primitives.light.grays.750}" + }, + "800": { + "type": "color", + "value": "{00_primitives.light.grays.800}" + }, + "850": { + "type": "color", + "value": "{00_primitives.light.grays.850}" + }, + "900": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + }, + "950": { + "type": "color", + "value": "{00_primitives.light.grays.950}" + }, + "975": { + "type": "color", + "value": "{00_primitives.light.grays.975}" + } + }, + "primary": { + "50": { + "type": "color", + "value": "{00_primitives.light.blues.50}" + }, + "100": { + "type": "color", + "value": "{00_primitives.light.blues.100}" + }, + "200": { + "type": "color", + "value": "{00_primitives.light.blues.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.light.blues.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.light.blues.400}" + }, + "500": { + "type": "color", + "value": "{00_primitives.light.blues.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.light.blues.600}" + }, + "700": { + "type": "color", + "value": "{00_primitives.light.blues.700}" + }, + "800": { + "type": "color", + "value": "{00_primitives.light.blues.800}" + }, + "900": { + "type": "color", + "value": "{00_primitives.light.blues.900}" + }, + "950": { + "type": "color", + "value": "{00_primitives.light.blues.950}" + } + }, + "secondary": { + "100": { + "type": "color", + "value": "{00_primitives.light.greens.100}" + }, + "200": { + "type": "color", + "value": "{00_primitives.light.greens.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.light.greens.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.light.greens.400}" + }, + "500": { + "type": "color", + "value": "{00_primitives.light.greens.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.light.greens.600}" + }, + "700": { + "type": "color", + "value": "{00_primitives.light.greens.700}" + }, + "800": { + "type": "color", + "value": "{00_primitives.light.greens.800}" + } + }, + "tertiary": { + "200": { + "type": "color", + "value": "{00_primitives.light.reds.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.light.reds.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.light.reds.400}" + }, + "600": { + "type": "color", + "value": "{00_primitives.light.reds.500}" + } + } + }, + "button": { + "primary": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.blues.500}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.button.primary.default.fill}" + } + } + }, + "focus outline width": { + "type": "dimension", + "value": 2 + }, + "focus outline": { + "type": "color", + "value": "{02_theme.light.color.primary.500}" + }, + "secondary": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.blues.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.color.neutral.900}" + } + } + }, + "ghost": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + } + } + }, + "radius": { + "md": { + "type": "dimension", + "value": 0 + }, + "xs": { + "type": "dimension", + "value": 0 + }, + "sm": { + "type": "dimension", + "value": 0 + }, + "lg": { + "type": "dimension", + "value": 0 + } + }, + "success": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.greens.400}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.greens.300}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.950}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.greens.200}" + } + } + }, + "alert": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.reds.500}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.reds.400}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.reds.500}" + } + } + }, + "navigation": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.secondary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.primary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.1.fill}" + }, + "label & icon 2": { + "type": "color", + "value": "{02_theme.light.text.textcolors.primary}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.highlight.fill}" + } + } + }, + "outlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.950}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.light.grays.300}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.blues.500}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.light.blues.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.disabled}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.text.textcolors.disabled}" + } + } + } + }, + "tabs": { + "contained": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.secondary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.color.neutral.300}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.color.neutral.900}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.1.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.highlight.outline}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.highlight.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.color.neutral.500}" + } + } + }, + "underlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.secondary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.highlight.outline}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.highlight.outline}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.color.neutral.500}" + } + }, + "container border": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.1.outline}" + } + }, + "overlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.secondary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.color.neutral.500}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.highlight.outline}" + }, + "fill": { + "type": "color", + "value": "{01_surfaces&text.light.light.layer.3.fill}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.color.neutral.500}" + } + } + } + }, + "toggles": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.primary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.3.fill}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{00_primitives.light.grays.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.color.neutral.900}" + } + } + }, + "radius": { + "md": { + "type": "color", + "value": "{01_mapped_sizes&spaces.light.radius.md}" + }, + "xl": { + "type": "color", + "value": "{01_mapped_sizes&spaces.light.radius.lg}" + }, + "sm": { + "type": "color", + "value": "{01_mapped_sizes&spaces.light.radius.sm}" + }, + "xs": { + "type": "color", + "value": "{01_mapped_sizes&spaces.light.radius.xs}" + }, + "square": { + "type": "dimension", + "value": 0 + }, + "rounded": { + "type": "dimension", + "value": "{01_mapped_sizes&spaces.light.radius.round}" + } + }, + "chips": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.secondary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.2.fill}" + }, + "stroke": { + "type": "color", + "value": "{02_theme.light.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.color.neutral.900}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.light.text.textcolors.highlight}" + }, + "fill": { + "type": "color", + "value": "{02_theme.light.layer.2.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.light.layer.highlight.outline}" + } + } + }, + "table": { + "header fill": { + "type": "color", + "value": "{01_surfaces&text.light.light.tables.header fill}" + } + }, + "input & select": { + "base": { + "default": { + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.100}" + }, + "border": { + "default": { + "type": "color", + "value": "{00_primitives.light.grays.400}" + }, + "error": { + "type": "color", + "value": "{02_theme.light.feedback.alert}" + }, + "active": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.highlight}" + }, + "filled": { + "type": "color", + "value": "{00_primitives.light.grays.850}" + } + } + }, + "nested": { + "nested": { + "type": "color", + "value": "{00_primitives.light.grays.10}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.100}" + }, + "border": { + "default": { + "type": "color", + "value": "{00_primitives.light.grays.400}" + }, + "active": { + "type": "color", + "value": "{01_surfaces&text.light.light.text.highlight}" + }, + "filled": { + "type": "color", + "value": "{00_primitives.light.grays.850}" + }, + "error": { + "type": "color", + "value": "{02_theme.light.feedback.alert}" + } + } + } + }, + "large": { + "default": { + "fill": { + "type": "color", + "value": "{00_primitives.light.grays.150}" + } + } + } + } + }, + "dark": { + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.1.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.1.outline}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.2.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.2.outline}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.3.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.3.outline}" + } + }, + "highlight": { + "outline": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.highlight}" + }, + "fill": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.highlight}" + } + }, + "app": { + "background": { + "type": "color", + "value": "#12110fff", + "blendMode": "normal" + } + } + }, + "text": { + "textcolors": { + "primary": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.primary}" + }, + "secondary": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.secondary}" + }, + "tertiary": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.tertiary}" + }, + "highlight": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.highlight}" + }, + "disabled": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.disabled}" + }, + "success": { + "type": "color", + "value": "{00_primitives.dark.greens.400}" + }, + "alert": { + "type": "color", + "value": "{00_primitives.dark.reds.500}" + }, + "warning": { + "type": "color", + "value": "{00_primitives.dark.reds.300}" + } + }, + "fontfamily": { + "heading": { + "type": "string", + "value": "Mona Sans" + }, + "body": { + "type": "string", + "value": "Mona Sans" + }, + "mono": { + "type": "string", + "value": "Mona Sans" + }, + "button": { + "type": "string", + "value": "Mona Sans" + } + } + }, + "feedback": { + "warning": { + "type": "color", + "value": "{00_primitives.dark.reds.300}" + }, + "success": { + "type": "color", + "value": "{00_primitives.dark.greens.400}" + }, + "alert": { + "type": "color", + "value": "{00_primitives.dark.reds.500}" + } + }, + "color": { + "neutral": { + "25": { + "type": "color", + "value": "{00_primitives.dark.grays.975}" + }, + "50": { + "type": "color", + "value": "{00_primitives.dark.grays.950}" + }, + "75": { + "type": "color", + "value": "{00_primitives.dark.grays.900}" + }, + "100": { + "type": "color", + "value": "{00_primitives.dark.grays.850}" + }, + "150": { + "type": "color", + "value": "{00_primitives.dark.grays.800}" + }, + "200": { + "type": "color", + "value": "{00_primitives.dark.grays.750}" + }, + "300": { + "type": "color", + "value": "{00_primitives.dark.grays.700}" + }, + "400": { + "type": "color", + "value": "{00_primitives.dark.grays.600}" + }, + "500": { + "type": "color", + "value": "{00_primitives.dark.grays.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.dark.grays.400}" + }, + "700": { + "type": "color", + "value": "{00_primitives.dark.grays.300}" + }, + "750": { + "type": "color", + "value": "{00_primitives.dark.grays.200}" + }, + "800": { + "type": "color", + "value": "{00_primitives.dark.grays.150}" + }, + "850": { + "type": "color", + "value": "{00_primitives.dark.grays.100}" + }, + "900": { + "type": "color", + "value": "{00_primitives.dark.grays.75}" + }, + "950": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + }, + "975": { + "type": "color", + "value": "{00_primitives.dark.grays.25}" + } + }, + "primary": { + "50": { + "type": "color", + "value": "{00_primitives.dark.blues.950}" + }, + "100": { + "type": "color", + "value": "{00_primitives.dark.blues.900}" + }, + "200": { + "type": "color", + "value": "{00_primitives.dark.blues.800}" + }, + "300": { + "type": "color", + "value": "{00_primitives.dark.blues.700}" + }, + "400": { + "type": "color", + "value": "{00_primitives.dark.blues.600}" + }, + "500": { + "type": "color", + "value": "{00_primitives.dark.blues.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.dark.blues.400}" + }, + "700": { + "type": "color", + "value": "{00_primitives.dark.blues.300}" + }, + "800": { + "type": "color", + "value": "{00_primitives.dark.blues.200}" + }, + "900": { + "type": "color", + "value": "{00_primitives.dark.blues.100}" + }, + "950": { + "type": "color", + "value": "{00_primitives.dark.blues.50}" + } + }, + "secondary": { + "100": { + "type": "color", + "value": "{00_primitives.dark.greens.800}" + }, + "200": { + "type": "color", + "value": "{00_primitives.dark.greens.700}" + }, + "300": { + "type": "color", + "value": "{00_primitives.dark.greens.600}" + }, + "400": { + "type": "color", + "value": "{00_primitives.dark.greens.500}" + }, + "500": { + "type": "color", + "value": "{00_primitives.dark.greens.400}" + }, + "600": { + "type": "color", + "value": "{00_primitives.dark.greens.300}" + }, + "700": { + "type": "color", + "value": "{00_primitives.dark.greens.200}" + }, + "800": { + "type": "color", + "value": "{00_primitives.dark.greens.100}" + } + }, + "tertiary": { + "200": { + "type": "color", + "value": "{00_primitives.dark.reds.500}" + }, + "300": { + "type": "color", + "value": "{00_primitives.dark.reds.400}" + }, + "400": { + "type": "color", + "value": "{00_primitives.dark.reds.300}" + }, + "600": { + "type": "color", + "value": "{00_primitives.dark.reds.200}" + } + } + }, + "button": { + "primary": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.blues.500}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.900}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.button.primary.default.fill}" + } + } + }, + "focus outline width": { + "type": "dimension", + "value": 2 + }, + "focus outline": { + "type": "color", + "value": "{02_theme.dark.color.primary.500}" + }, + "secondary": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.900}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.900}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.blues.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.color.neutral.50}" + } + } + }, + "ghost": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.blues.800}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.850}" + } + } + }, + "radius": { + "md": { + "type": "dimension", + "value": 0 + }, + "xs": { + "type": "dimension", + "value": 0 + }, + "sm": { + "type": "dimension", + "value": 0 + }, + "lg": { + "type": "dimension", + "value": 0 + } + }, + "success": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.900}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.greens.300}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.greens.500}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.950}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.greens.200}" + } + } + }, + "alert": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.reds.500}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.reds.400}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.reds.500}" + } + } + }, + "navigation": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.secondary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.1.fill}" + }, + "label & icon 2": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.fill}" + } + } + }, + "outlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.grays.50}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.dark.grays.700}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.dark.blues.500}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.dark.blues.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.disabled}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.disabled}" + } + } + } + }, + "tabs": { + "contained": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.secondary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.color.neutral.200}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.color.neutral.900}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.color.neutral.950}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.1.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.outline}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.color.neutral.950}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.color.neutral.500}" + } + } + }, + "underlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.secondary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.outline}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.outline}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.color.neutral.500}" + } + }, + "container border": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.1.outline}" + } + }, + "overlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.secondary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.color.neutral.500}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.outline}" + }, + "fill": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.layer.3.fill}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.color.neutral.500}" + } + } + } + }, + "toggles": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.primary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.highlight}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.3.fill}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.color.neutral.950}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.color.neutral.900}" + } + } + }, + "radius": { + "md": { + "type": "color", + "value": "{01_mapped_sizes&spaces.dark.radius.md}" + }, + "xl": { + "type": "color", + "value": "{01_mapped_sizes&spaces.dark.radius.lg}" + }, + "sm": { + "type": "color", + "value": "{01_mapped_sizes&spaces.dark.radius.sm}" + }, + "xs": { + "type": "color", + "value": "{01_mapped_sizes&spaces.dark.radius.xs}" + }, + "square": { + "type": "dimension", + "value": 0 + }, + "rounded": { + "type": "dimension", + "value": "{01_mapped_sizes&spaces.dark.radius.round}" + } + }, + "chips": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.text.textcolors.secondary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.2.fill}" + }, + "stroke": { + "type": "color", + "value": "{02_theme.dark.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.color.neutral.900}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.dark.color.neutral.950}" + }, + "fill": { + "type": "color", + "value": "{02_theme.dark.layer.2.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.dark.layer.highlight.outline}" + } + } + }, + "table": { + "header fill": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.tables.header fill}" + } + }, + "input & select": { + "base": { + "default": { + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.850}" + }, + "border": { + "default": { + "type": "color", + "value": "{00_primitives.dark.grays.600}" + }, + "error": { + "type": "color", + "value": "{02_theme.dark.feedback.alert}" + }, + "active": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.highlight}" + }, + "filled": { + "type": "color", + "value": "{00_primitives.dark.grays.75}" + } + } + }, + "nested": { + "nested": { + "type": "color", + "value": "{00_primitives.dark.grays.850}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.850}" + }, + "border": { + "default": { + "type": "color", + "value": "{00_primitives.dark.grays.600}" + }, + "active": { + "type": "color", + "value": "{01_surfaces&text.dark.dark.text.highlight}" + }, + "filled": { + "type": "color", + "value": "{00_primitives.dark.grays.75}" + }, + "error": { + "type": "color", + "value": "{02_theme.dark.feedback.alert}" + } + } + } + }, + "large": { + "default": { + "fill": { + "type": "color", + "value": "{00_primitives.dark.grays.975}" + } + } + } + } + }, + "chad": { + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.1.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.1.outline}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.2.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.2.outline}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.3.fill}" + }, + "outline": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.3.outline}" + } + }, + "highlight": { + "outline": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.highlight}" + }, + "fill": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.highlight}" + } + }, + "app": { + "background": { + "type": "color", + "value": "#f2f2f7ff", + "blendMode": "normal" + } + } + }, + "text": { + "textcolors": { + "primary": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.primary}" + }, + "secondary": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.secondary}" + }, + "tertiary": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.tertiary}" + }, + "highlight": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.highlight}" + }, + "disabled": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.disabled}" + }, + "success": { + "type": "color", + "value": "{00_primitives.chad.greens.500}" + }, + "alert": { + "type": "color", + "value": "{00_primitives.chad.reds.500}" + }, + "warning": { + "type": "color", + "value": "{00_primitives.chad.reds.400}" + } + }, + "fontfamily": { + "heading": { + "type": "string", + "value": "Minecraft" + }, + "body": { + "type": "string", + "value": "Hubot Sans" + }, + "mono": { + "type": "string", + "value": "Hubot Sans" + }, + "button": { + "type": "string", + "value": "Minecraft" + } + } + }, + "feedback": { + "warning": { + "type": "color", + "value": "{00_primitives.chad.reds.300}" + }, + "success": { + "type": "color", + "value": "{00_primitives.chad.greens.400}" + }, + "alert": { + "type": "color", + "value": "{00_primitives.chad.reds.500}" + } + }, + "color": { + "neutral": { + "25": { + "type": "color", + "value": "{00_primitives.chad.grays.25}" + }, + "50": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "75": { + "type": "color", + "value": "{00_primitives.chad.grays.75}" + }, + "100": { + "type": "color", + "value": "{00_primitives.chad.grays.100}" + }, + "150": { + "type": "color", + "value": "{00_primitives.chad.grays.150}" + }, + "200": { + "type": "color", + "value": "{00_primitives.chad.grays.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.chad.grays.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.chad.grays.400}" + }, + "500": { + "type": "color", + "value": "{00_primitives.chad.grays.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.chad.grays.600}" + }, + "700": { + "type": "color", + "value": "{00_primitives.chad.grays.700}" + }, + "750": { + "type": "color", + "value": "{00_primitives.chad.grays.750}" + }, + "800": { + "type": "color", + "value": "{00_primitives.chad.grays.800}" + }, + "850": { + "type": "color", + "value": "{00_primitives.chad.grays.850}" + }, + "900": { + "type": "color", + "value": "{00_primitives.chad.grays.900}" + }, + "950": { + "type": "color", + "value": "{00_primitives.chad.grays.950}" + }, + "975": { + "type": "color", + "value": "{00_primitives.chad.grays.975}" + } + }, + "primary": { + "50": { + "type": "color", + "value": "{00_primitives.chad.violet.50}" + }, + "100": { + "type": "color", + "value": "{00_primitives.chad.violet.100}" + }, + "200": { + "type": "color", + "value": "{00_primitives.chad.violet.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.chad.violet.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.chad.violet.400}" + }, + "500": { + "type": "color", + "value": "{00_primitives.chad.violet.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.chad.violet.600}" + }, + "700": { + "type": "color", + "value": "{00_primitives.chad.violet.700}" + }, + "800": { + "type": "color", + "value": "{00_primitives.chad.violet.800}" + }, + "900": { + "type": "color", + "value": "{00_primitives.chad.violet.900}" + }, + "950": { + "type": "color", + "value": "{00_primitives.chad.violet.950}" + } + }, + "secondary": { + "100": { + "type": "color", + "value": "{00_primitives.chad.greens.100}" + }, + "200": { + "type": "color", + "value": "{00_primitives.chad.greens.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.chad.greens.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.chad.greens.400}" + }, + "500": { + "type": "color", + "value": "{00_primitives.chad.greens.500}" + }, + "600": { + "type": "color", + "value": "{00_primitives.chad.greens.600}" + }, + "700": { + "type": "color", + "value": "{00_primitives.chad.greens.700}" + }, + "800": { + "type": "color", + "value": "{00_primitives.chad.greens.800}" + } + }, + "tertiary": { + "200": { + "type": "color", + "value": "{00_primitives.chad.reds.200}" + }, + "300": { + "type": "color", + "value": "{00_primitives.chad.reds.300}" + }, + "400": { + "type": "color", + "value": "{00_primitives.chad.reds.400}" + }, + "600": { + "type": "color", + "value": "{00_primitives.chad.reds.500}" + } + } + }, + "button": { + "primary": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.500}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.button.primary.default.fill}" + } + } + }, + "focus outline width": { + "type": "dimension", + "value": 2 + }, + "focus outline": { + "type": "color", + "value": "{02_theme.chad.color.primary.600}" + }, + "secondary": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.900}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.color.primary.950}" + } + } + }, + "ghost": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.highlight}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.disabled}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.950}" + } + } + }, + "radius": { + "md": { + "type": "dimension", + "value": 0 + }, + "xs": { + "type": "dimension", + "value": 0 + }, + "sm": { + "type": "dimension", + "value": 0 + }, + "lg": { + "type": "dimension", + "value": 0 + } + }, + "success": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.900}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.greens.400}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.greens.500}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.950}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.greens.200}" + } + } + }, + "alert": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.reds.500}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.reds.400}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.grays.900}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.reds.500}" + } + } + }, + "navigation": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.secondary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.1.fill}" + }, + "label & icon 2": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.950}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.fill}" + } + } + }, + "outlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.950}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.chad.grays.300}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.violet.500}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.chad.violet.500}" + } + }, + "disabled": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.disabled}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.disabled}" + } + } + } + }, + "tabs": { + "contained": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.secondary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.color.primary.200}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.color.primary.950}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.1.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.outline}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.900}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.color.neutral.500}" + } + } + }, + "underlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.secondary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.outline}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.outline}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.color.neutral.500}" + } + }, + "container border": { + "type": "color", + "value": "{02_theme.chad.layer.1.outline}" + } + }, + "overlined": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.secondary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.color.neutral.500}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.outline}" + }, + "fill": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.layer.3.fill}" + } + }, + "active": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.highlight}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.color.neutral.500}" + } + } + } + }, + "toggles": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.highlight}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.3.fill}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{00_primitives.chad.grays.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.color.primary.800}" + } + } + }, + "radius": { + "md": { + "type": "dimension", + "value": 0 + }, + "xl": { + "type": "dimension", + "value": 0 + }, + "sm": { + "type": "dimension", + "value": 0 + }, + "xs": { + "type": "dimension", + "value": 0 + }, + "square": { + "type": "dimension", + "value": 0 + }, + "rounded": { + "type": "dimension", + "value": 0 + } + }, + "chips": { + "default": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.secondary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.1.fill}" + }, + "stroke": { + "type": "color", + "value": "{02_theme.chad.layer.2.outline}" + } + }, + "hover": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.color.neutral.50}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.color.primary.950}" + } + }, + "current": { + "label & icon": { + "type": "color", + "value": "{02_theme.chad.text.textcolors.primary}" + }, + "fill": { + "type": "color", + "value": "{02_theme.chad.layer.2.fill}" + }, + "outline": { + "type": "color", + "value": "{02_theme.chad.layer.highlight.outline}" + } + } + }, + "table": { + "header fill": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.tables.header fill}" + } + }, + "input & select": { + "base": { + "default": { + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.50}" + }, + "border": { + "default": { + "type": "color", + "value": "{00_primitives.chad.violet.200}" + }, + "error": { + "type": "color", + "value": "{02_theme.chad.feedback.alert}" + }, + "active": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.highlight}" + }, + "filled": { + "type": "color", + "value": "{00_primitives.chad.violet.400}" + } + } + }, + "nested": { + "nested": { + "type": "color", + "value": "{00_primitives.chad.violet.50}" + }, + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.50}" + }, + "border": { + "default": { + "type": "color", + "value": "{00_primitives.chad.violet.200}" + }, + "active": { + "type": "color", + "value": "{01_surfaces&text.chad.chad.text.highlight}" + }, + "filled": { + "type": "color", + "value": "{00_primitives.chad.violet.400}" + }, + "error": { + "type": "color", + "value": "{02_theme.chad.feedback.alert}" + } + } + } + }, + "large": { + "default": { + "fill": { + "type": "color", + "value": "{00_primitives.chad.violet.50}" + } + } + } + } + } + }, + "00_primitives": { + "grays": { + "10": { + "type": "color", + "value": "#fdfcfcff", + "blendMode": "normal" + }, + "25": { + "type": "color", + "value": "#fafafaff", + "blendMode": "normal" + }, + "50": { + "type": "color", + "value": "#f8f7f7ff", + "blendMode": "normal" + }, + "75": { + "type": "color", + "value": "#f6f4f4ff", + "blendMode": "normal" + }, + "100": { + "type": "color", + "value": "#eeecebff", + "blendMode": "normal" + }, + "150": { + "type": "color", + "value": "#e7e4e2ff", + "blendMode": "normal" + }, + "200": { + "type": "color", + "value": "#dedbd8ff", + "blendMode": "normal" + }, + "300": { + "type": "color", + "value": "#d4d0ccff", + "blendMode": "normal" + }, + "400": { + "type": "color", + "value": "#bbb6afff", + "blendMode": "normal" + }, + "500": { + "type": "color", + "value": "#968e84ff", + "blendMode": "normal" + }, + "600": { + "type": "color", + "value": "#746e66ff", + "blendMode": "normal" + }, + "700": { + "type": "color", + "value": "#5a554fff", + "blendMode": "normal" + }, + "750": { + "type": "color", + "value": "#494540ff", + "blendMode": "normal" + }, + "800": { + "type": "color", + "value": "#3b3834ff", + "blendMode": "normal" + }, + "850": { + "type": "color", + "value": "#302e2aff", + "blendMode": "normal" + }, + "900": { + "type": "color", + "value": "#252420ff", + "blendMode": "normal" + }, + "950": { + "type": "color", + "value": "#1f1e1bff", + "blendMode": "normal" + }, + "975": { + "type": "color", + "value": "#191815ff", + "blendMode": "normal" + } + }, + "greens": { + "100": { + "type": "color", + "value": "#d4f7e3ff", + "blendMode": "normal" + }, + "200": { + "type": "color", + "value": "#a8efc6ff", + "blendMode": "normal" + }, + "300": { + "type": "color", + "value": "#32ce79ff", + "blendMode": "normal" + }, + "400": { + "type": "color", + "value": "#27b86cff", + "blendMode": "normal" + }, + "500": { + "type": "color", + "value": "#1fa25eff", + "blendMode": "normal" + }, + "600": { + "type": "color", + "value": "#167d4aff", + "blendMode": "normal" + }, + "700": { + "type": "color", + "value": "#0f5c38ff", + "blendMode": "normal" + }, + "800": { + "type": "color", + "value": "#0b3d26ff", + "blendMode": "normal" + } + }, + "reds": { + "200": { + "type": "color", + "value": "#ffd88bff", + "blendMode": "normal" + }, + "300": { + "type": "color", + "value": "#ffc300ff", + "blendMode": "normal" + }, + "400": { + "type": "color", + "value": "#f77f00ff", + "blendMode": "normal" + }, + "500": { + "type": "color", + "value": "#ed242fff", + "blendMode": "normal" + }, + "600": { + "type": "color", + "value": "#d41e26ff", + "blendMode": "normal" + }, + "700": { + "type": "color", + "value": "#b0151fff", + "blendMode": "normal" + }, + "800": { + "type": "color", + "value": "#8c111cff", + "blendMode": "normal" + } + }, + "blues": { + "50": { + "type": "color", + "value": "#fefaefff", + "blendMode": "normal" + }, + "100": { + "type": "color", + "value": "#d5dbf0ff", + "blendMode": "normal" + }, + "200": { + "type": "color", + "value": "#acbef1ff", + "blendMode": "normal" + }, + "300": { + "type": "color", + "value": "#839ff2ff", + "blendMode": "normal" + }, + "400": { + "type": "color", + "value": "#5a81f3ff", + "blendMode": "normal" + }, + "500": { + "type": "color", + "value": "#3162f4ff", + "blendMode": "normal" + }, + "600": { + "type": "color", + "value": "#2c55d5ff", + "blendMode": "normal" + }, + "700": { + "type": "color", + "value": "#2747b5ff", + "blendMode": "normal" + }, + "800": { + "type": "color", + "value": "#223995ff", + "blendMode": "normal" + }, + "900": { + "type": "color", + "value": "#1d2c75ff", + "blendMode": "normal" + }, + "950": { + "type": "color", + "value": "#171e55ff", + "blendMode": "normal" + } + }, + "violet": { + "50": { + "type": "color", + "value": "#efedfcff", + "blendMode": "normal" + }, + "100": { + "type": "color", + "value": "#dbd9f7ff", + "blendMode": "normal" + }, + "200": { + "type": "color", + "value": "#c6c4f2ff", + "blendMode": "normal" + }, + "300": { + "type": "color", + "value": "#b0aeeeff", + "blendMode": "normal" + }, + "400": { + "type": "color", + "value": "#9997e2ff", + "blendMode": "normal" + }, + "500": { + "type": "color", + "value": "#6a68b7ff", + "blendMode": "normal" + }, + "600": { + "type": "color", + "value": "#5f5caeff", + "blendMode": "normal" + }, + "700": { + "type": "color", + "value": "#554fa5ff", + "blendMode": "normal" + }, + "800": { + "type": "color", + "value": "#4a4395ff", + "blendMode": "normal" + }, + "900": { + "type": "color", + "value": "#3e3684ff", + "blendMode": "normal" + }, + "950": { + "type": "color", + "value": "#2f2862ff", + "blendMode": "normal" + } + }, + "spacing": { + "50": { + "type": "dimension", + "value": 0 + }, + "100": { + "type": "dimension", + "value": 2 + }, + "200": { + "type": "dimension", + "value": 4 + }, + "300": { + "type": "dimension", + "value": 8 + }, + "350": { + "type": "dimension", + "value": 14 + }, + "400": { + "type": "dimension", + "value": 16 + }, + "500": { + "type": "dimension", + "value": 24 + }, + "600": { + "type": "dimension", + "value": 32 + }, + "700": { + "type": "dimension", + "value": 48 + }, + "800": { + "type": "dimension", + "value": 64 + } + }, + "sizing": { + "50": { + "type": "dimension", + "value": 4 + }, + "100": { + "type": "dimension", + "value": 8 + }, + "125": { + "type": "dimension", + "value": 12 + }, + "150": { + "type": "dimension", + "value": 14 + }, + "200": { + "type": "dimension", + "value": 16 + }, + "250": { + "type": "dimension", + "value": 20 + }, + "300": { + "type": "dimension", + "value": 24 + }, + "350": { + "type": "dimension", + "value": 28 + }, + "400": { + "type": "dimension", + "value": 32 + }, + "500": { + "type": "dimension", + "value": 40 + }, + "600": { + "type": "dimension", + "value": 48 + }, + "700": { + "type": "dimension", + "value": 64 + }, + "800": { + "type": "dimension", + "value": 88 + } + } + }, + "01_mapped_sizes&spaces": { + "desktop": { + "radius": { + "round": { + "type": "dimension", + "value": 9999 + }, + "xs": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.200}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.300}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.500}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.700}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.800}" + } + }, + "typography": { + "lineheight": { + "xs": { + "type": "dimension", + "value": 14 + }, + "sm": { + "type": "dimension", + "value": 16 + }, + "md": { + "type": "dimension", + "value": 24 + }, + "lg": { + "type": "dimension", + "value": 28 + }, + "xl": { + "type": "dimension", + "value": 40 + }, + "xxl": { + "type": "dimension", + "value": 64 + } + }, + "fontweight": { + "extra light": { + "type": "dimension", + "value": 200 + }, + "light": { + "type": "dimension", + "value": 300 + }, + "normal": { + "type": "dimension", + "value": 400 + }, + "medium": { + "type": "dimension", + "value": 500 + }, + "semi bold": { + "type": "dimension", + "value": 600 + }, + "bold": { + "type": "dimension", + "value": 700 + }, + "extra bold": { + "type": "dimension", + "value": 800 + } + }, + "fontsize": { + "xs": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.125}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.150}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.200}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.300}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.400}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.700}" + } + } + }, + "spacing": { + "xs": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.200}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.300}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.400}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.500}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.600}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.700}" + }, + "xxs": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.100}" + } + }, + "sizing": { + "xxs": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.100}" + }, + "xs": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.200}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.300}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.400}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.500}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.600}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.700}" + }, + "3xl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.800}" + } + }, + "iconsize": { + "xxs": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.125}" + }, + "xs": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.150}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.200}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.250}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.350}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.500}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.600}" + }, + "3xl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.700}" + }, + "4xl": { + "type": "dimension", + "value": "{00_primitives.desktop.sizing.800}" + } + }, + "grid": { + "column spacing": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.500}" + }, + "row spacing": { + "type": "dimension", + "value": "{00_primitives.desktop.spacing.500}" + } + } + }, + "mobile": { + "radius": { + "round": { + "type": "dimension", + "value": 9999 + }, + "xs": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.100}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.200}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.400}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.600}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.700}" + } + }, + "typography": { + "lineheight": { + "xs": { + "type": "dimension", + "value": 12 + }, + "sm": { + "type": "dimension", + "value": 14 + }, + "md": { + "type": "dimension", + "value": 16 + }, + "lg": { + "type": "dimension", + "value": 24 + }, + "xl": { + "type": "dimension", + "value": 32 + }, + "xxl": { + "type": "dimension", + "value": 40 + } + }, + "fontweight": { + "extra light": { + "type": "dimension", + "value": 200 + }, + "light": { + "type": "dimension", + "value": 300 + }, + "normal": { + "type": "dimension", + "value": 400 + }, + "medium": { + "type": "dimension", + "value": 500 + }, + "semi bold": { + "type": "dimension", + "value": 600 + }, + "bold": { + "type": "dimension", + "value": 700 + }, + "extra bold": { + "type": "dimension", + "value": 800 + } + }, + "fontsize": { + "xs": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.125}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.150}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.200}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.250}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.350}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.500}" + } + } + }, + "spacing": { + "xs": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.100}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.200}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.300}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.400}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.500}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.600}" + }, + "xxs": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.100}" + } + }, + "sizing": { + "xxs": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.50}" + }, + "xs": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.150}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.200}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.300}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.400}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.500}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.600}" + }, + "3xl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.700}" + } + }, + "iconsize": { + "xxs": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.100}" + }, + "xs": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.125}" + }, + "sm": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.150}" + }, + "md": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.250}" + }, + "lg": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.300}" + }, + "xl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.400}" + }, + "xxl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.500}" + }, + "3xl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.600}" + }, + "4xl": { + "type": "dimension", + "value": "{00_primitives.mobile.sizing.700}" + } + }, + "grid": { + "column spacing": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.500}" + }, + "row spacing": { + "type": "dimension", + "value": "{00_primitives.mobile.spacing.500}" + } + } + } + }, + "01_surfaces&text": { + "default": { + "light": { + "text": { + "primary": { + "type": "color", + "value": "{00_primitives.default.grays.950}" + }, + "secondary": { + "type": "color", + "value": "{00_primitives.default.grays.700}" + }, + "tertiary": { + "type": "color", + "value": "{00_primitives.default.grays.500}" + }, + "highlight": { + "type": "color", + "value": "{00_primitives.default.blues.500}" + }, + "disabled": { + "type": "color", + "value": "{00_primitives.default.grays.400}" + } + }, + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{00_primitives.default.grays.50}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.grays.300}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{00_primitives.default.grays.100}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.grays.200}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{00_primitives.default.grays.50}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.grays.300}" + } + }, + "highlight": { + "type": "color", + "value": "{00_primitives.default.blues.500}" + } + }, + "tables": { + "header fill": { + "type": "color", + "value": "{00_primitives.default.grays.200}" + } + } + }, + "dark": { + "text": { + "primary": { + "type": "color", + "value": "{00_primitives.default.grays.50}" + }, + "secondary": { + "type": "color", + "value": "{00_primitives.default.grays.300}" + }, + "tertiary": { + "type": "color", + "value": "{00_primitives.default.grays.400}" + }, + "highlight": { + "type": "color", + "value": "{00_primitives.default.blues.500}" + }, + "disabled": { + "type": "color", + "value": "{00_primitives.default.grays.500}" + } + }, + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{00_primitives.default.grays.950}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.grays.900}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{00_primitives.default.grays.900}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.grays.800}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{00_primitives.default.grays.800}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.grays.700}" + } + }, + "highlight": { + "type": "color", + "value": "{00_primitives.default.blues.500}" + } + }, + "tables": { + "header fill": { + "type": "color", + "value": "{00_primitives.default.grays.800}" + } + } + }, + "chad": { + "text": { + "primary": { + "type": "color", + "value": "{00_primitives.default.grays.950}" + }, + "secondary": { + "type": "color", + "value": "{00_primitives.default.grays.700}" + }, + "tertiary": { + "type": "color", + "value": "{00_primitives.default.grays.500}" + }, + "highlight": { + "type": "color", + "value": "{00_primitives.default.violet.600}" + }, + "disabled": { + "type": "color", + "value": "{00_primitives.default.grays.400}" + } + }, + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{00_primitives.default.violet.100}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.violet.300}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{00_primitives.default.violet.200}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.violet.400}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{00_primitives.default.violet.300}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.default.violet.500}" + } + }, + "highlight": { + "type": "color", + "value": "{00_primitives.default.violet.800}" + } + }, + "tables": { + "header fill": { + "type": "color", + "value": "{00_primitives.default.violet.400}" + } + } + } + }, + "inverted": { + "light": { + "text": { + "primary": { + "type": "color", + "value": "{00_primitives.inverted.grays.50}" + }, + "secondary": { + "type": "color", + "value": "{00_primitives.inverted.grays.300}" + }, + "tertiary": { + "type": "color", + "value": "{00_primitives.inverted.grays.400}" + }, + "highlight": { + "type": "color", + "value": "{00_primitives.inverted.blues.500}" + }, + "disabled": { + "type": "color", + "value": "{00_primitives.inverted.grays.500}" + } + }, + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.950}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.grays.600}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.900}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.grays.750}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.750}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.grays.600}" + } + }, + "highlight": { + "type": "color", + "value": "{00_primitives.inverted.blues.500}" + } + }, + "tables": { + "header fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.800}" + } + } + }, + "dark": { + "text": { + "primary": { + "type": "color", + "value": "{00_primitives.inverted.grays.950}" + }, + "secondary": { + "type": "color", + "value": "{00_primitives.inverted.grays.700}" + }, + "tertiary": { + "type": "color", + "value": "{00_primitives.inverted.grays.600}" + }, + "highlight": { + "type": "color", + "value": "{00_primitives.inverted.blues.500}" + }, + "disabled": { + "type": "color", + "value": "{00_primitives.inverted.grays.400}" + } + }, + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.75}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.grays.300}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.100}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.grays.200}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.50}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.grays.300}" + } + }, + "highlight": { + "type": "color", + "value": "{00_primitives.inverted.blues.500}" + } + }, + "tables": { + "header fill": { + "type": "color", + "value": "{00_primitives.inverted.grays.200}" + } + } + }, + "chad": { + "text": { + "primary": { + "type": "color", + "value": "{00_primitives.inverted.grays.50}" + }, + "secondary": { + "type": "color", + "value": "{00_primitives.inverted.grays.300}" + }, + "tertiary": { + "type": "color", + "value": "{00_primitives.inverted.grays.400}" + }, + "highlight": { + "type": "color", + "value": "{00_primitives.inverted.violet.400}" + }, + "disabled": { + "type": "color", + "value": "{00_primitives.inverted.grays.500}" + } + }, + "layer": { + "1": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.violet.950}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.violet.800}" + } + }, + "2": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.violet.800}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.violet.600}" + } + }, + "3": { + "fill": { + "type": "color", + "value": "{00_primitives.inverted.violet.700}" + }, + "outline": { + "type": "color", + "value": "{00_primitives.inverted.violet.500}" + } + }, + "highlight": { + "type": "color", + "value": "{00_primitives.inverted.violet.400}" + } + }, + "tables": { + "header fill": { + "type": "color", + "value": "{00_primitives.inverted.violet.800}" + } + } + } + } + }, + "typography": { + "heading": { + "xxl": { + "description": "To be used only in Hero Banners", + "fontSize": { + "type": "dimension", + "value": 64 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": -2.56 + }, + "lineHeight": { + "type": "dimension", + "value": 64 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "mbold": { + "description": "To be used for large items, such as page titles, large navigation items", + "fontSize": { + "type": "dimension", + "value": 32 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": -1.28 + }, + "lineHeight": { + "type": "dimension", + "value": 36 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 72 + }, + "textCase": { + "type": "string", + "value": "uppercase" + } + }, + "mlight": { + "fontSize": { + "type": "dimension", + "value": 32 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": -1.28 + }, + "lineHeight": { + "type": "dimension", + "value": 36 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "uppercase" + } + }, + "sbold": { + "description": "To be used for medium items, such as section titles, small card titles, chart titles", + "fontSize": { + "type": "dimension", + "value": 24 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": -0.48 + }, + "lineHeight": { + "type": "dimension", + "value": 28 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 16 + }, + "textCase": { + "type": "string", + "value": "uppercase" + } + }, + "xsbold": { + "description": "To be used for the smallest highlighted items, such as small section titles, etc", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "uppercase" + } + }, + "xsmedium": { + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "capitalize" + } + } + }, + "body": { + "mregular": { + "description": "For all the body of the app", + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 24 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 12 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "mbold": { + "description": "For all the highlighted items of body of the app", + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 24 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 12 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "sregular": { + "description": "For all the smaller informational items in the body of the app", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 8 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "sbold": { + "description": "For all the smaller informational items that need to be highlighted in the body of the app", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 8 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "xsregular": { + "description": "For the very fine details in the body of the app", + "fontSize": { + "type": "dimension", + "value": 12 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 8 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "xsbold": { + "description": "For the very fine details in the body of the app that need to be highlighted", + "fontSize": { + "type": "dimension", + "value": 12 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 8 + }, + "textCase": { + "type": "string", + "value": "none" + } + } + }, + "buttonlabel": { + "xs": { + "description": "To be used ONLY on button labels.", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "s": { + "description": "To be used ONLY on button labels.", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 24 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 20 + }, + "textCase": { + "type": "string", + "value": "uppercase" + } + }, + "m": { + "description": "To be used ONLY on button labels.", + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 40 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "uppercase" + } + } + }, + "table": { + "header": { + "m": { + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 16 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "s": { + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 14 + }, + "textCase": { + "type": "string", + "value": "none" + } + } + }, + "cell": { + "l": { + "description": "This style should never be used outside of a table cell.\nIt applies to the larger labels of items in the first row.", + "fontSize": { + "type": "dimension", + "value": 20 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 20 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "mregular": { + "description": "This style should never be used outside of a table cell.\nIt applies to the Default labels of items of the first line of a cell.", + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "mbold": { + "description": "This style should never be used outside of a table cell.\nIt applies to highlighted items of the first line of a cell.", + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 600 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "sregular": { + "description": "This style should never be used outside of a table cell.\nIt applies to default item of the second line of a cell.", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "sbold": { + "description": "This style should never be used outside of a table cell.\nIt applies to highlighted items of the second line of a cell.", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + } + } + }, + "highlighted": { + "xsnotional": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "fontSize": { + "type": "dimension", + "value": 12 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 500 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "xs": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "fontSize": { + "type": "dimension", + "value": 12 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 14 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "s": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "fontSize": { + "type": "dimension", + "value": 14 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "m": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "fontSize": { + "type": "dimension", + "value": 16 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 16 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "l": { + "fontSize": { + "type": "dimension", + "value": 24 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": 0 + }, + "lineHeight": { + "type": "dimension", + "value": 24 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "xl": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "fontSize": { + "type": "dimension", + "value": 32 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": -1.28 + }, + "lineHeight": { + "type": "dimension", + "value": 36 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + }, + "xxl": { + "description": "To be used on indvidual numbers and values that need to be highlighted. Not to be used in tables.", + "fontSize": { + "type": "dimension", + "value": 64 + }, + "textDecoration": { + "type": "string", + "value": "none" + }, + "fontFamily": { + "type": "string", + "value": "Mona Sans" + }, + "fontWeight": { + "type": "number", + "value": 700 + }, + "fontStyle": { + "type": "string", + "value": "normal" + }, + "fontStretch": { + "type": "string", + "value": "normal" + }, + "letterSpacing": { + "type": "dimension", + "value": -2.56 + }, + "lineHeight": { + "type": "dimension", + "value": 64 + }, + "paragraphIndent": { + "type": "dimension", + "value": 0 + }, + "paragraphSpacing": { + "type": "dimension", + "value": 0 + }, + "textCase": { + "type": "string", + "value": "none" + } + } + } + } +} diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.types.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.types.ts new file mode 100644 index 000000000..1ef124a2b --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/curve-figma-design.types.ts @@ -0,0 +1,3 @@ +import curveFigmaDesignTokens from './curve-figma-design.tokens.json' + +export type CurveFigmaDesignTokens = typeof curveFigmaDesignTokens diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/index.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/index.ts new file mode 100644 index 000000000..9ae33a8c6 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/index.ts @@ -0,0 +1,3 @@ +export * from './curve-figma-design.types' +export { default as curveFigmaDesignTokens } from './curve-figma-design.tokens.json' +export * from './variants.types' diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/variants.types.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/variants.types.ts new file mode 100644 index 000000000..0b6800699 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/tokens/variants.types.ts @@ -0,0 +1,30 @@ +export type ScreenType = 'desktop' | 'mobile' + +export type TextCase = 'none' | 'uppercase' | 'lowercase' | 'capitalize' +export type TextDecoration = 'none' | 'underline' | 'line-through' +export type FontStyle = 'normal' | 'italic' | 'oblique' +export type FontStretch = 'normal' | 'condensed' | 'expanded' + +export type StrokeAlign = 'center' | 'inside' | 'outside' +export type StrokeCap = 'none' | 'round' | 'square' | 'arrow_lines' | 'arrow_equilateral' | 'mixed' +export type StrokeJoin = 'miter' | 'bevel' | 'round' + +export type GridPattern = 'rows' | 'columns' | 'grid' +export type GridAlignment = 'stretch' | 'center' | 'min' | 'max' + +export type EffectType = 'dropShadow' | 'innerShadow' | 'layerBlur' | 'backgroundBlur' + +export type FigmaTypographyToken = { + description?: string + fontSize: number + textDecoration: TextDecoration + fontFamily: string + fontWeight: number + fontStyle: FontStyle + fontStretch: FontStretch + letterSpacing: number + lineHeight: number + paragraphIndent: number + paragraphSpacing: number + textCase: TextCase +} From 0d1259bb77972dc60b1ddf05d6e0f2e4f14dc4cf Mon Sep 17 00:00:00 2001 From: Ignat Date: Wed, 18 Sep 2024 14:45:30 +0500 Subject: [PATCH 002/137] feat: implement figma tokens validation --- .../api/figma-tokens/extract-figma-values.ts | 73 + .../src/shared/api/figma-tokens/index.ts | 3 + .../validation/analyze_figma_tokens.py | 36 + .../curve-figma-design.tokens.schema.json | 1939 +++++++++++++++++ .../validation/validate-figma-tokens.js | 16 + 5 files changed, 2067 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/index.ts create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/validation/curve-figma-design.tokens.schema.json create mode 100644 packages/curve-ui-kit/src/shared/api/figma-tokens/validation/validate-figma-tokens.js diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts new file mode 100644 index 000000000..a83bda6cc --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts @@ -0,0 +1,73 @@ +/** + * Extracts values from a Figma token object, excluding specified keys. + * @param obj - The Figma token object to extract values from. + * @param excludeKeys - An array of keys to exclude from extraction. + * @returns An array of extracted values. + */ +export function extractValues>( + obj: T, + excludeKeys: string[] = [], +): ExtractedValues { + return Object.entries(obj) + .filter(([key]) => !excludeKeys.includes(key)) + .map(([, value]) => value) as ExtractedValues +} + +/** + * Extracts key-value pairs from a Figma token object, excluding specified keys. + * @param obj - The Figma token object to extract key-value pairs from. + * @param excludeKeys - An array of keys to exclude from extraction. + * @returns An object containing the extracted key-value pairs. + */ +export function extractPairs>( + obj: T, + excludeKeys: string[] = [], +): ExtractedKeyValuePairs { + return Object.entries(obj).reduce( + (acc, [key, value]) => { + if (!excludeKeys.includes(key)) { + // @ts-expect-error + acc[key] = value + } + return acc + }, + {} as ExtractedKeyValuePairs, + ) +} + +/** + * Extracts a number from a value of unknown type. + * @param value - The value to extract a number from. + * @returns A number if extraction is successful. + * @throws Error if extraction fails. + */ +export function extractNumber(value: unknown): number { + if (typeof value === 'number') { + return value + } + + if (typeof value === 'string') { + const parsed = parseFloat(value) + if (!isNaN(parsed)) { + return parsed + } + } + + if (typeof value === 'object' && value !== null && 'value' in value) { + return extractNumber((value as { value: unknown }).value) + } + + throw new Error(`Unable to extract number from value: ${JSON.stringify(value)}`) +} + +export type FigmaValueObject = { + [key in K]: V +} + +type ExcludeKeys = Exclude + +export type ExtractedValues = Array]> + +export type ExtractedKeyValuePairs = { + [P in ExcludeKeys]: T[P] +} diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/index.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/index.ts new file mode 100644 index 000000000..ed7b0a2ef --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/index.ts @@ -0,0 +1,3 @@ +export * from './resolve' +export * from './tokens' +export * from './extract-figma-values' diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py new file mode 100644 index 000000000..803442122 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py @@ -0,0 +1,36 @@ +import json +import re +from collections import defaultdict + +def analyze_json_file(file_path): + with open(file_path, 'r') as file: + data = json.load(file) + + references = defaultdict(set) + reference_pattern = re.compile(r'\{([^}]+)\}') + + def traverse(obj, path): + if isinstance(obj, dict): + for key, value in obj.items(): + new_path = path + [key] + if isinstance(value, str): + matches = reference_pattern.findall(value) + for match in matches: + ref_parts = match.split('.') + if len(ref_parts) >= 3: + ref_key = '.'.join(ref_parts[:3]) + references['.'.join(path[:2])].add(ref_key) + traverse(value, new_path) + elif isinstance(obj, list): + for i, item in enumerate(obj): + traverse(item, path + [str(i)]) + + traverse(data, []) + + for category, refs in sorted(references.items()): + print(f"\n{category}:") + for ref in sorted(refs): + print(f" - {ref}") + +file_path = '../curve-figma-design-tokens/curve-figma-design.tokens.json' +analyze_json_file(file_path) diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/curve-figma-design.tokens.schema.json b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/curve-figma-design.tokens.schema.json new file mode 100644 index 000000000..b569a01d9 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/curve-figma-design.tokens.schema.json @@ -0,0 +1,1939 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/CurveFigmaTokens", + "definitions": { + "0": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "$ref": "#/definitions/0_Type" + }, + "value": { + "$ref": "#/definitions/0_Value" + } + }, + "required": ["type", "value"], + "title": "0" + }, + "1": { + "type": "object", + "additionalProperties": false, + "properties": { + "fill": { + "$ref": "#/definitions/ColumnSpacing" + }, + "outline": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["fill", "outline"], + "title": "1" + }, + "CurveFigmaTokens": { + "type": "object", + "additionalProperties": false, + "properties": { + "00_grid": { + "$ref": "#/definitions/00_Grid" + }, + "02_font": { + "$ref": "#/definitions/02_Font" + }, + "00_effect": { + "$ref": "#/definitions/00_Effect" + }, + "02_theme": { + "$ref": "#/definitions/02_Theme" + }, + "00_primitives": { + "$ref": "#/definitions/00_Primitives" + }, + "01_mapped_sizes&spaces": { + "$ref": "#/definitions/01_MappedSizesSpaces" + }, + "01_surfaces&text": { + "$ref": "#/definitions/01_SurfacesText" + }, + "typography": { + "$ref": "#/definitions/CurveFigmaTokensTypography" + } + }, + "required": [ + "00_effect", + "00_grid", + "00_primitives", + "01_mapped_sizes&spaces", + "01_surfaces&text", + "02_font", + "02_theme", + "typography" + ], + "title": "CurveFigmaTokens" + }, + "00_Effect": { + "type": "object", + "additionalProperties": false, + "properties": { + "activetabshadow": { + "$ref": "#/definitions/Activetabshadow" + }, + "elevation": { + "$ref": "#/definitions/Elevation" + } + }, + "required": ["activetabshadow", "elevation"], + "title": "00_Effect" + }, + "Activetabshadow": { + "type": "object", + "additionalProperties": false, + "properties": { + "0": { + "$ref": "#/definitions/0" + }, + "1": { + "$ref": "#/definitions/0" + }, + "2": { + "$ref": "#/definitions/0" + }, + "3": { + "$ref": "#/definitions/0" + }, + "4": { + "$ref": "#/definitions/0" + }, + "5": { + "$ref": "#/definitions/0" + }, + "6": { + "$ref": "#/definitions/0" + }, + "description": { + "type": "null" + } + }, + "required": ["0", "1", "2", "3", "4", "description"], + "title": "Activetabshadow" + }, + "0_Value": { + "type": "object", + "additionalProperties": false, + "properties": { + "shadowType": { + "$ref": "#/definitions/ShadowType" + }, + "radius": { + "type": "integer" + }, + "color": { + "type": "string" + }, + "offsetX": { + "type": "integer" + }, + "offsetY": { + "type": "integer" + }, + "spread": { + "type": "number" + } + }, + "required": ["color", "offsetX", "offsetY", "radius", "shadowType", "spread"], + "title": "0_Value" + }, + "Elevation": { + "type": "object", + "additionalProperties": false, + "properties": { + "level 3": { + "$ref": "#/definitions/Activetabshadow" + }, + "level 2": { + "$ref": "#/definitions/Activetabshadow" + }, + "level 1": { + "$ref": "#/definitions/Activetabshadow" + }, + "level -1": { + "$ref": "#/definitions/Level" + }, + "level -2": { + "$ref": "#/definitions/Level" + } + }, + "required": ["level -1", "level -2", "level 1", "level 2", "level 3"], + "title": "Elevation" + }, + "Level": { + "type": "object", + "additionalProperties": false, + "properties": { + "description": { + "type": "null" + }, + "type": { + "$ref": "#/definitions/0_Type" + }, + "value": { + "$ref": "#/definitions/0_Value" + } + }, + "required": ["description", "type", "value"], + "title": "Level" + }, + "00_Grid": { + "type": "object", + "additionalProperties": false, + "properties": { + "12-col_main": { + "$ref": "#/definitions/12-_ColCards" + }, + "12-col_cards": { + "$ref": "#/definitions/12-_ColCards" + }, + "no margin": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/12-_ColCards" + } + } + }, + "required": ["12-col_cards", "12-col_main", "no margin"], + "title": "00_Grid" + }, + "12-ColCardsValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "$ref": "#/definitions/Pattern" + }, + "gutterSize": { + "type": "integer" + }, + "alignment": { + "$ref": "#/definitions/Alignment" + }, + "count": { + "type": "integer" + }, + "offset": { + "type": "integer" + } + }, + "required": ["alignment", "count", "gutterSize", "offset", "pattern"], + "title": "12-ColCardsValue" + }, + "12-_ColCards": { + "type": "object", + "additionalProperties": false, + "properties": { + "description": { + "type": "null" + }, + "type": { + "$ref": "#/definitions/12-ColCardsType" + }, + "value": { + "$ref": "#/definitions/12-ColCardsValue" + } + }, + "required": ["description", "type", "value"], + "title": "12-_ColCards" + }, + "00_Primitives": { + "type": "object", + "additionalProperties": false, + "properties": { + "grays": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Blue" + } + }, + "greens": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Blue" + } + }, + "reds": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Blue" + } + }, + "blues": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Blue" + } + }, + "violet": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Blue" + } + }, + "spacing": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Sizing" + } + }, + "sizing": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Sizing" + } + } + }, + "required": ["blues", "grays", "greens", "reds", "sizing", "spacing", "violet"], + "title": "00_Primitives" + }, + "Blue": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "$ref": "#/definitions/BlueType" + }, + "value": { + "type": "string" + }, + "blendMode": { + "$ref": "#/definitions/BlendMode" + } + }, + "required": ["blendMode", "type", "value"], + "title": "Blue" + }, + "Sizing": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "$ref": "#/definitions/RoundType" + }, + "value": { + "type": "number" + } + }, + "required": ["type", "value"], + "title": "Sizing" + }, + "01_MappedSizesSpaces": { + "type": "object", + "additionalProperties": false, + "properties": { + "desktop": { + "$ref": "#/definitions/Desktop" + }, + "mobile": { + "$ref": "#/definitions/Desktop" + } + }, + "required": ["desktop", "mobile"], + "title": "01_MappedSizesSpaces" + }, + "Desktop": { + "type": "object", + "additionalProperties": false, + "properties": { + "radius": { + "$ref": "#/definitions/DesktopRadius" + }, + "typography": { + "$ref": "#/definitions/DesktopTypography" + }, + "spacing": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "sizing": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "iconsize": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "grid": { + "$ref": "#/definitions/Grid" + } + }, + "required": ["grid", "iconsize", "radius", "sizing", "spacing", "typography"], + "title": "Desktop" + }, + "Grid": { + "type": "object", + "additionalProperties": false, + "properties": { + "column spacing": { + "$ref": "#/definitions/ColumnSpacing" + }, + "row spacing": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["column spacing", "row spacing"], + "title": "Grid" + }, + "ColumnSpacing": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "$ref": "#/definitions/BlueType" + }, + "value": { + "type": "string" + } + }, + "required": ["type", "value"], + "title": "ColumnSpacing" + }, + "DesktopRadius": { + "type": "object", + "additionalProperties": false, + "properties": { + "round": { + "$ref": "#/definitions/Sizing" + }, + "xs": { + "$ref": "#/definitions/ColumnSpacing" + }, + "sm": { + "$ref": "#/definitions/ColumnSpacing" + }, + "md": { + "$ref": "#/definitions/ColumnSpacing" + }, + "lg": { + "$ref": "#/definitions/ColumnSpacing" + }, + "xl": { + "$ref": "#/definitions/ColumnSpacing" + }, + "xxl": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["lg", "md", "sm", "xl", "xs"], + "title": "DesktopRadius" + }, + "DesktopTypography": { + "type": "object", + "additionalProperties": false, + "properties": { + "lineheight": { + "$ref": "#/definitions/Lineheight" + }, + "fontweight": { + "$ref": "#/definitions/Fontweight" + }, + "fontsize": { + "$ref": "#/definitions/Fontsize" + } + }, + "required": ["fontsize", "fontweight", "lineheight"], + "title": "DesktopTypography" + }, + "Fontsize": { + "type": "object", + "additionalProperties": false, + "properties": { + "xs": { + "$ref": "#/definitions/ColumnSpacing" + }, + "sm": { + "$ref": "#/definitions/ColumnSpacing" + }, + "md": { + "$ref": "#/definitions/ColumnSpacing" + }, + "lg": { + "$ref": "#/definitions/ColumnSpacing" + }, + "xl": { + "$ref": "#/definitions/ColumnSpacing" + }, + "xxl": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["lg", "md", "sm", "xl", "xs", "xxl"], + "title": "Fontsize" + }, + "Fontweight": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra light": { + "$ref": "#/definitions/Sizing" + }, + "light": { + "$ref": "#/definitions/Sizing" + }, + "normal": { + "$ref": "#/definitions/Sizing" + }, + "medium": { + "$ref": "#/definitions/Sizing" + }, + "semi bold": { + "$ref": "#/definitions/Sizing" + }, + "bold": { + "$ref": "#/definitions/Sizing" + }, + "extra bold": { + "$ref": "#/definitions/Sizing" + } + }, + "required": ["bold", "extra bold", "extra light", "light", "medium", "normal", "semi bold"], + "title": "Fontweight" + }, + "Lineheight": { + "type": "object", + "additionalProperties": false, + "properties": { + "xs": { + "$ref": "#/definitions/Sizing" + }, + "sm": { + "$ref": "#/definitions/Sizing" + }, + "md": { + "$ref": "#/definitions/Sizing" + }, + "lg": { + "$ref": "#/definitions/Sizing" + }, + "xl": { + "$ref": "#/definitions/Sizing" + }, + "xxl": { + "$ref": "#/definitions/Sizing" + } + }, + "required": ["lg", "md", "sm", "xl", "xs", "xxl"], + "title": "Lineheight" + }, + "01_SurfacesText": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/InvertedClass" + }, + "inverted": { + "$ref": "#/definitions/InvertedClass" + } + }, + "required": ["default", "inverted"], + "title": "01_SurfacesText" + }, + "InvertedClass": { + "type": "object", + "additionalProperties": false, + "properties": { + "light": { + "$ref": "#/definitions/DarkClass" + }, + "dark": { + "$ref": "#/definitions/DarkClass" + }, + "chad": { + "$ref": "#/definitions/DarkClass" + } + }, + "required": ["chad", "dark", "light"], + "title": "InvertedClass" + }, + "DarkClass": { + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "$ref": "#/definitions/PurpleText" + }, + "layer": { + "$ref": "#/definitions/PurpleLayer" + }, + "tables": { + "$ref": "#/definitions/TablesClass" + } + }, + "required": ["layer", "tables", "text"], + "title": "DarkClass" + }, + "PurpleLayer": { + "type": "object", + "additionalProperties": false, + "properties": { + "1": { + "$ref": "#/definitions/1" + }, + "2": { + "$ref": "#/definitions/1" + }, + "3": { + "$ref": "#/definitions/1" + }, + "highlight": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["1", "2", "3", "highlight"], + "title": "PurpleLayer" + }, + "TablesClass": { + "type": "object", + "additionalProperties": false, + "properties": { + "header fill": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["header fill"], + "title": "TablesClass" + }, + "PurpleText": { + "type": "object", + "additionalProperties": false, + "properties": { + "primary": { + "$ref": "#/definitions/ColumnSpacing" + }, + "secondary": { + "$ref": "#/definitions/ColumnSpacing" + }, + "tertiary": { + "$ref": "#/definitions/ColumnSpacing" + }, + "highlight": { + "$ref": "#/definitions/ColumnSpacing" + }, + "disabled": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["disabled", "highlight", "primary", "secondary", "tertiary"], + "title": "PurpleText" + }, + "02_Font": { + "type": "object", + "additionalProperties": false, + "properties": { + "heading": { + "$ref": "#/definitions/02_FontHeading" + }, + "body": { + "$ref": "#/definitions/02_FontBody" + }, + "button-label": { + "$ref": "#/definitions/ButtonLabel" + }, + "table": { + "$ref": "#/definitions/02_FontTable" + }, + "highlighted": { + "$ref": "#/definitions/02_FontHighlighted" + } + }, + "required": ["body", "button-label", "heading", "highlighted", "table"], + "title": "02_Font" + }, + "02_FontBody": { + "type": "object", + "additionalProperties": false, + "properties": { + "mregular": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "mbold": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "sregular": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "sbold": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "xsregular": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "xsbold": { + "$ref": "#/definitions/ButtonLabelMbold" + } + }, + "required": ["mbold", "mregular", "sbold", "sregular", "xsbold", "xsregular"], + "title": "02_FontBody" + }, + "ButtonLabelMbold": { + "type": "object", + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/MboldType" + }, + "value": { + "$ref": "#/definitions/MboldValue" + } + }, + "required": ["description", "type", "value"], + "title": "ButtonLabelMbold" + }, + "MboldValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "fontSize": { + "type": "integer" + }, + "textDecoration": { + "$ref": "#/definitions/Text" + }, + "fontFamily": { + "$ref": "#/definitions/FontFamily" + }, + "fontWeight": { + "type": "integer" + }, + "fontStyle": { + "$ref": "#/definitions/BlendMode" + }, + "fontStretch": { + "$ref": "#/definitions/BlendMode" + }, + "letterSpacing": { + "type": "number" + }, + "lineHeight": { + "type": "integer" + }, + "paragraphIndent": { + "type": "integer" + }, + "paragraphSpacing": { + "type": "integer" + }, + "textCase": { + "$ref": "#/definitions/Text" + } + }, + "required": [ + "fontFamily", + "fontSize", + "fontStretch", + "fontStyle", + "fontWeight", + "letterSpacing", + "lineHeight", + "paragraphIndent", + "paragraphSpacing", + "textCase", + "textDecoration" + ], + "title": "MboldValue" + }, + "ButtonLabel": { + "type": "object", + "additionalProperties": false, + "properties": { + "xs": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "s": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "m": { + "$ref": "#/definitions/ButtonLabelMbold" + } + }, + "required": ["m", "s", "xs"], + "title": "ButtonLabel" + }, + "02_FontHeading": { + "type": "object", + "additionalProperties": false, + "properties": { + "xxl": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "mbold": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "mlight": { + "$ref": "#/definitions/Mlight" + }, + "sbold": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "xsbold": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "xsmedium": { + "$ref": "#/definitions/Mlight" + } + }, + "required": ["mbold", "mlight", "sbold", "xsbold", "xsmedium", "xxl"], + "title": "02_FontHeading" + }, + "Mlight": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "$ref": "#/definitions/MboldType" + }, + "value": { + "$ref": "#/definitions/MboldValue" + } + }, + "required": ["type", "value"], + "title": "Mlight" + }, + "02_FontHighlighted": { + "type": "object", + "additionalProperties": false, + "properties": { + "xsnotional": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "xs": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "s": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "m": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "l": { + "$ref": "#/definitions/Mlight" + }, + "xl": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "xxl": { + "$ref": "#/definitions/ButtonLabelMbold" + } + }, + "required": ["l", "m", "s", "xl", "xs", "xsnotional", "xxl"], + "title": "02_FontHighlighted" + }, + "02_FontTable": { + "type": "object", + "additionalProperties": false, + "properties": { + "header": { + "$ref": "#/definitions/PurpleHeader" + }, + "cell": { + "$ref": "#/definitions/PurpleCell" + } + }, + "required": ["cell", "header"], + "title": "02_FontTable" + }, + "PurpleCell": { + "type": "object", + "additionalProperties": false, + "properties": { + "l": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "mregular": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "mbold": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "sregular": { + "$ref": "#/definitions/ButtonLabelMbold" + }, + "sbold": { + "$ref": "#/definitions/ButtonLabelMbold" + } + }, + "required": ["l", "mbold", "mregular", "sbold", "sregular"], + "title": "PurpleCell" + }, + "PurpleHeader": { + "type": "object", + "additionalProperties": false, + "properties": { + "m": { + "$ref": "#/definitions/Mlight" + }, + "s": { + "$ref": "#/definitions/Mlight" + } + }, + "required": ["m", "s"], + "title": "PurpleHeader" + }, + "02_Theme": { + "type": "object", + "additionalProperties": false, + "properties": { + "light": { + "$ref": "#/definitions/Dark" + }, + "dark": { + "$ref": "#/definitions/Dark" + }, + "chad": { + "$ref": "#/definitions/02_ThemeChad" + } + }, + "required": ["chad", "dark", "light"], + "title": "02_Theme" + }, + "02_ThemeChad": { + "type": "object", + "additionalProperties": false, + "properties": { + "layer": { + "$ref": "#/definitions/FluffyLayer" + }, + "text": { + "$ref": "#/definitions/FluffyText" + }, + "feedback": { + "$ref": "#/definitions/Feedback" + }, + "color": { + "$ref": "#/definitions/Color" + }, + "button": { + "$ref": "#/definitions/Button" + }, + "tabs": { + "$ref": "#/definitions/Tabs" + }, + "toggles": { + "$ref": "#/definitions/Toggles" + }, + "radius": { + "$ref": "#/definitions/ChadRadius" + }, + "chips": { + "$ref": "#/definitions/Chips" + }, + "table": { + "$ref": "#/definitions/TablesClass" + }, + "input & select": { + "$ref": "#/definitions/InputSelect" + } + }, + "required": [ + "button", + "chips", + "color", + "feedback", + "input & select", + "layer", + "radius", + "table", + "tabs", + "text", + "toggles" + ], + "title": "02_ThemeChad" + }, + "Button": { + "type": "object", + "additionalProperties": false, + "properties": { + "primary": { + "$ref": "#/definitions/Alert" + }, + "focus outline width": { + "$ref": "#/definitions/Sizing" + }, + "focus outline": { + "$ref": "#/definitions/ColumnSpacing" + }, + "secondary": { + "$ref": "#/definitions/Alert" + }, + "ghost": { + "$ref": "#/definitions/Ghost" + }, + "radius": { + "$ref": "#/definitions/ButtonRadius" + }, + "success": { + "$ref": "#/definitions/Alert" + }, + "alert": { + "$ref": "#/definitions/Alert" + }, + "navigation": { + "$ref": "#/definitions/Navigation" + }, + "outlined": { + "$ref": "#/definitions/Outlined" + } + }, + "required": [ + "alert", + "focus outline", + "focus outline width", + "ghost", + "navigation", + "outlined", + "primary", + "radius", + "secondary", + "success" + ], + "title": "Button" + }, + "Alert": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/CurrentClass" + }, + "hover": { + "$ref": "#/definitions/CurrentClass" + }, + "disabled": { + "$ref": "#/definitions/CurrentClass" + } + }, + "required": ["default", "disabled", "hover"], + "title": "Alert" + }, + "CurrentClass": { + "type": "object", + "additionalProperties": false, + "properties": { + "label & icon": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fill": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["fill", "label & icon"], + "title": "CurrentClass" + }, + "Ghost": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/GhostDefault" + }, + "hover": { + "$ref": "#/definitions/CurrentClass" + }, + "disabled": { + "$ref": "#/definitions/CurrentClass" + } + }, + "required": ["default", "disabled", "hover"], + "title": "Ghost" + }, + "GhostDefault": { + "type": "object", + "additionalProperties": false, + "properties": { + "label & icon": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["label & icon"], + "title": "GhostDefault" + }, + "Navigation": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/GhostDefault" + }, + "hover": { + "$ref": "#/definitions/PurpleHover" + }, + "current": { + "$ref": "#/definitions/CurrentClass" + } + }, + "required": ["current", "default", "hover"], + "title": "Navigation" + }, + "PurpleHover": { + "type": "object", + "additionalProperties": false, + "properties": { + "label & icon": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fill": { + "$ref": "#/definitions/ColumnSpacing" + }, + "label & icon 2": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["fill", "label & icon", "label & icon 2"], + "title": "PurpleHover" + }, + "Outlined": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/DisabledClass" + }, + "hover": { + "$ref": "#/definitions/DisabledClass" + }, + "disabled": { + "$ref": "#/definitions/DisabledClass" + } + }, + "required": ["default", "disabled", "hover"], + "title": "Outlined" + }, + "DisabledClass": { + "type": "object", + "additionalProperties": false, + "properties": { + "label & icon": { + "$ref": "#/definitions/ColumnSpacing" + }, + "outline": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["label & icon", "outline"], + "title": "DisabledClass" + }, + "ButtonRadius": { + "type": "object", + "additionalProperties": false, + "properties": { + "md": { + "$ref": "#/definitions/Sizing" + }, + "xs": { + "$ref": "#/definitions/Sizing" + }, + "sm": { + "$ref": "#/definitions/Sizing" + }, + "lg": { + "$ref": "#/definitions/Sizing" + } + }, + "required": ["lg", "md", "sm", "xs"], + "title": "ButtonRadius" + }, + "Chips": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/ChipsDefault" + }, + "hover": { + "$ref": "#/definitions/CurrentClass" + }, + "current": { + "$ref": "#/definitions/Current" + } + }, + "required": ["current", "default", "hover"], + "title": "Chips" + }, + "Current": { + "type": "object", + "additionalProperties": false, + "properties": { + "label & icon": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fill": { + "$ref": "#/definitions/ColumnSpacing" + }, + "outline": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["fill", "label & icon", "outline"], + "title": "Current" + }, + "ChipsDefault": { + "type": "object", + "additionalProperties": false, + "properties": { + "label & icon": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fill": { + "$ref": "#/definitions/ColumnSpacing" + }, + "stroke": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["fill", "label & icon", "stroke"], + "title": "ChipsDefault" + }, + "Color": { + "type": "object", + "additionalProperties": false, + "properties": { + "neutral": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "primary": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "secondary": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "tertiary": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ColumnSpacing" + } + } + }, + "required": ["neutral", "primary", "secondary", "tertiary"], + "title": "Color" + }, + "Feedback": { + "type": "object", + "additionalProperties": false, + "properties": { + "warning": { + "$ref": "#/definitions/ColumnSpacing" + }, + "success": { + "$ref": "#/definitions/ColumnSpacing" + }, + "alert": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["alert", "success", "warning"], + "title": "Feedback" + }, + "InputSelect": { + "type": "object", + "additionalProperties": false, + "properties": { + "base": { + "$ref": "#/definitions/Base" + }, + "large": { + "$ref": "#/definitions/Large" + } + }, + "required": ["base", "large"], + "title": "InputSelect" + }, + "Base": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/BaseDefault" + }, + "nested": { + "$ref": "#/definitions/Nested" + } + }, + "required": ["default", "nested"], + "title": "Base" + }, + "BaseDefault": { + "type": "object", + "additionalProperties": false, + "properties": { + "fill": { + "$ref": "#/definitions/ColumnSpacing" + }, + "border": { + "$ref": "#/definitions/Border" + } + }, + "required": ["border", "fill"], + "title": "BaseDefault" + }, + "Border": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/ColumnSpacing" + }, + "error": { + "$ref": "#/definitions/ColumnSpacing" + }, + "active": { + "$ref": "#/definitions/ColumnSpacing" + }, + "filled": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["active", "default", "error", "filled"], + "title": "Border" + }, + "Nested": { + "type": "object", + "additionalProperties": false, + "properties": { + "nested": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fill": { + "$ref": "#/definitions/ColumnSpacing" + }, + "border": { + "$ref": "#/definitions/Border" + } + }, + "required": ["border", "fill", "nested"], + "title": "Nested" + }, + "Large": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/LargeDefault" + } + }, + "required": ["default"], + "title": "Large" + }, + "LargeDefault": { + "type": "object", + "additionalProperties": false, + "properties": { + "fill": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["fill"], + "title": "LargeDefault" + }, + "FluffyLayer": { + "type": "object", + "additionalProperties": false, + "properties": { + "1": { + "$ref": "#/definitions/1" + }, + "2": { + "$ref": "#/definitions/1" + }, + "3": { + "$ref": "#/definitions/1" + }, + "highlight": { + "$ref": "#/definitions/1" + }, + "app": { + "$ref": "#/definitions/App" + } + }, + "required": ["1", "2", "3", "app", "highlight"], + "title": "FluffyLayer" + }, + "App": { + "type": "object", + "additionalProperties": false, + "properties": { + "background": { + "$ref": "#/definitions/Blue" + } + }, + "required": ["background"], + "title": "App" + }, + "ChadRadius": { + "type": "object", + "additionalProperties": false, + "properties": { + "md": { + "$ref": "#/definitions/Sizing" + }, + "xl": { + "$ref": "#/definitions/Sizing" + }, + "sm": { + "$ref": "#/definitions/Sizing" + }, + "xs": { + "$ref": "#/definitions/Sizing" + }, + "square": { + "$ref": "#/definitions/Sizing" + }, + "rounded": { + "$ref": "#/definitions/Sizing" + } + }, + "required": ["md", "rounded", "sm", "square", "xl", "xs"], + "title": "ChadRadius" + }, + "Tabs": { + "type": "object", + "additionalProperties": false, + "properties": { + "contained": { + "$ref": "#/definitions/Contained" + }, + "underlined": { + "$ref": "#/definitions/Underlined" + }, + "overlined": { + "$ref": "#/definitions/Overlined" + } + }, + "required": ["contained", "overlined", "underlined"], + "title": "Tabs" + }, + "Contained": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/CurrentClass" + }, + "hover": { + "$ref": "#/definitions/CurrentClass" + }, + "current": { + "$ref": "#/definitions/Current" + }, + "active": { + "$ref": "#/definitions/Current" + } + }, + "required": ["active", "current", "default", "hover"], + "title": "Contained" + }, + "Overlined": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/DisabledClass" + }, + "hover": { + "$ref": "#/definitions/DisabledClass" + }, + "current": { + "$ref": "#/definitions/Current" + }, + "active": { + "$ref": "#/definitions/DisabledClass" + } + }, + "required": ["active", "current", "default", "hover"], + "title": "Overlined" + }, + "Underlined": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/DisabledClass" + }, + "hover": { + "$ref": "#/definitions/DisabledClass" + }, + "current": { + "$ref": "#/definitions/DisabledClass" + }, + "active": { + "$ref": "#/definitions/DisabledClass" + }, + "container border": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["active", "container border", "current", "default", "hover"], + "title": "Underlined" + }, + "FluffyText": { + "type": "object", + "additionalProperties": false, + "properties": { + "textcolors": { + "$ref": "#/definitions/Textcolors" + }, + "fontfamily": { + "$ref": "#/definitions/Fontfamily" + } + }, + "required": ["fontfamily", "textcolors"], + "title": "FluffyText" + }, + "Fontfamily": { + "type": "object", + "additionalProperties": false, + "properties": { + "heading": { + "$ref": "#/definitions/ColumnSpacing" + }, + "body": { + "$ref": "#/definitions/ColumnSpacing" + }, + "mono": { + "$ref": "#/definitions/ColumnSpacing" + }, + "button": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["body", "button", "heading", "mono"], + "title": "Fontfamily" + }, + "Textcolors": { + "type": "object", + "additionalProperties": false, + "properties": { + "primary": { + "$ref": "#/definitions/ColumnSpacing" + }, + "secondary": { + "$ref": "#/definitions/ColumnSpacing" + }, + "tertiary": { + "$ref": "#/definitions/ColumnSpacing" + }, + "highlight": { + "$ref": "#/definitions/ColumnSpacing" + }, + "disabled": { + "$ref": "#/definitions/ColumnSpacing" + }, + "success": { + "$ref": "#/definitions/ColumnSpacing" + }, + "alert": { + "$ref": "#/definitions/ColumnSpacing" + }, + "warning": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["alert", "disabled", "highlight", "primary", "secondary", "success", "tertiary", "warning"], + "title": "Textcolors" + }, + "Toggles": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/definitions/GhostDefault" + }, + "hover": { + "$ref": "#/definitions/CurrentClass" + }, + "current": { + "$ref": "#/definitions/CurrentClass" + } + }, + "required": ["current", "default", "hover"], + "title": "Toggles" + }, + "Dark": { + "type": "object", + "additionalProperties": false, + "properties": { + "layer": { + "$ref": "#/definitions/FluffyLayer" + }, + "text": { + "$ref": "#/definitions/FluffyText" + }, + "feedback": { + "$ref": "#/definitions/Feedback" + }, + "color": { + "$ref": "#/definitions/Color" + }, + "button": { + "$ref": "#/definitions/Button" + }, + "tabs": { + "$ref": "#/definitions/Tabs" + }, + "toggles": { + "$ref": "#/definitions/Toggles" + }, + "radius": { + "$ref": "#/definitions/DarkRadius" + }, + "chips": { + "$ref": "#/definitions/Chips" + }, + "table": { + "$ref": "#/definitions/TablesClass" + }, + "input & select": { + "$ref": "#/definitions/InputSelect" + } + }, + "required": [ + "button", + "chips", + "color", + "feedback", + "input & select", + "layer", + "radius", + "table", + "tabs", + "text", + "toggles" + ], + "title": "Dark" + }, + "DarkRadius": { + "type": "object", + "additionalProperties": false, + "properties": { + "md": { + "$ref": "#/definitions/ColumnSpacing" + }, + "xl": { + "$ref": "#/definitions/ColumnSpacing" + }, + "sm": { + "$ref": "#/definitions/ColumnSpacing" + }, + "xs": { + "$ref": "#/definitions/ColumnSpacing" + }, + "square": { + "$ref": "#/definitions/Sizing" + }, + "rounded": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": ["md", "rounded", "sm", "square", "xl", "xs"], + "title": "DarkRadius" + }, + "CurveFigmaTokensTypography": { + "type": "object", + "additionalProperties": false, + "properties": { + "heading": { + "$ref": "#/definitions/TypographyHeading" + }, + "body": { + "$ref": "#/definitions/TypographyBody" + }, + "buttonlabel": { + "$ref": "#/definitions/Buttonlabel" + }, + "table": { + "$ref": "#/definitions/TypographyTable" + }, + "highlighted": { + "$ref": "#/definitions/TypographyHighlighted" + } + }, + "required": ["body", "buttonlabel", "heading", "highlighted", "table"], + "title": "CurveFigmaTokensTypography" + }, + "TypographyBody": { + "type": "object", + "additionalProperties": false, + "properties": { + "mregular": { + "$ref": "#/definitions/MlightClass" + }, + "mbold": { + "$ref": "#/definitions/MlightClass" + }, + "sregular": { + "$ref": "#/definitions/MlightClass" + }, + "sbold": { + "$ref": "#/definitions/MlightClass" + }, + "xsregular": { + "$ref": "#/definitions/MlightClass" + }, + "xsbold": { + "$ref": "#/definitions/MlightClass" + } + }, + "required": ["mbold", "mregular", "sbold", "sregular", "xsbold", "xsregular"], + "title": "TypographyBody" + }, + "MlightClass": { + "type": "object", + "additionalProperties": false, + "properties": { + "description": { + "type": "string" + }, + "fontSize": { + "$ref": "#/definitions/Sizing" + }, + "textDecoration": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fontFamily": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fontWeight": { + "$ref": "#/definitions/Sizing" + }, + "fontStyle": { + "$ref": "#/definitions/ColumnSpacing" + }, + "fontStretch": { + "$ref": "#/definitions/ColumnSpacing" + }, + "letterSpacing": { + "$ref": "#/definitions/Sizing" + }, + "lineHeight": { + "$ref": "#/definitions/Sizing" + }, + "paragraphIndent": { + "$ref": "#/definitions/Sizing" + }, + "paragraphSpacing": { + "$ref": "#/definitions/Sizing" + }, + "textCase": { + "$ref": "#/definitions/ColumnSpacing" + } + }, + "required": [ + "fontFamily", + "fontSize", + "fontStretch", + "fontStyle", + "fontWeight", + "letterSpacing", + "lineHeight", + "paragraphIndent", + "paragraphSpacing", + "textCase", + "textDecoration" + ], + "title": "MlightClass" + }, + "Buttonlabel": { + "type": "object", + "additionalProperties": false, + "properties": { + "xs": { + "$ref": "#/definitions/MlightClass" + }, + "s": { + "$ref": "#/definitions/MlightClass" + }, + "m": { + "$ref": "#/definitions/MlightClass" + } + }, + "required": ["m", "s", "xs"], + "title": "Buttonlabel" + }, + "TypographyHeading": { + "type": "object", + "additionalProperties": false, + "properties": { + "xxl": { + "$ref": "#/definitions/MlightClass" + }, + "mbold": { + "$ref": "#/definitions/MlightClass" + }, + "mlight": { + "$ref": "#/definitions/MlightClass" + }, + "sbold": { + "$ref": "#/definitions/MlightClass" + }, + "xsbold": { + "$ref": "#/definitions/MlightClass" + }, + "xsmedium": { + "$ref": "#/definitions/MlightClass" + } + }, + "required": ["mbold", "mlight", "sbold", "xsbold", "xsmedium", "xxl"], + "title": "TypographyHeading" + }, + "TypographyHighlighted": { + "type": "object", + "additionalProperties": false, + "properties": { + "xsnotional": { + "$ref": "#/definitions/MlightClass" + }, + "xs": { + "$ref": "#/definitions/MlightClass" + }, + "s": { + "$ref": "#/definitions/MlightClass" + }, + "m": { + "$ref": "#/definitions/MlightClass" + }, + "l": { + "$ref": "#/definitions/MlightClass" + }, + "xl": { + "$ref": "#/definitions/MlightClass" + }, + "xxl": { + "$ref": "#/definitions/MlightClass" + } + }, + "required": ["l", "m", "s", "xl", "xs", "xsnotional", "xxl"], + "title": "TypographyHighlighted" + }, + "TypographyTable": { + "type": "object", + "additionalProperties": false, + "properties": { + "header": { + "$ref": "#/definitions/FluffyHeader" + }, + "cell": { + "$ref": "#/definitions/FluffyCell" + } + }, + "required": ["cell", "header"], + "title": "TypographyTable" + }, + "FluffyCell": { + "type": "object", + "additionalProperties": false, + "properties": { + "l": { + "$ref": "#/definitions/MlightClass" + }, + "mregular": { + "$ref": "#/definitions/MlightClass" + }, + "mbold": { + "$ref": "#/definitions/MlightClass" + }, + "sregular": { + "$ref": "#/definitions/MlightClass" + }, + "sbold": { + "$ref": "#/definitions/MlightClass" + } + }, + "required": ["l", "mbold", "mregular", "sbold", "sregular"], + "title": "FluffyCell" + }, + "FluffyHeader": { + "type": "object", + "additionalProperties": false, + "properties": { + "m": { + "$ref": "#/definitions/MlightClass" + }, + "s": { + "$ref": "#/definitions/MlightClass" + } + }, + "required": ["m", "s"], + "title": "FluffyHeader" + }, + "0_Type": { + "type": "string", + "enum": ["custom-shadow"], + "title": "0_Type" + }, + "ShadowType": { + "type": "string", + "enum": ["dropShadow", "innerShadow"], + "title": "ShadowType" + }, + "12-ColCardsType": { + "type": "string", + "enum": ["custom-grid"], + "title": "12-ColCardsType" + }, + "Alignment": { + "type": "string", + "enum": ["stretch"], + "title": "Alignment" + }, + "Pattern": { + "type": "string", + "enum": ["columns"], + "title": "Pattern" + }, + "BlendMode": { + "type": "string", + "enum": ["normal"], + "title": "BlendMode" + }, + "BlueType": { + "type": "string", + "enum": ["color", "dimension", "string"], + "title": "BlueType" + }, + "RoundType": { + "type": "string", + "enum": ["dimension", "number"], + "title": "RoundType" + }, + "MboldType": { + "type": "string", + "enum": ["custom-fontStyle"], + "title": "MboldType" + }, + "FontFamily": { + "type": "string", + "enum": ["Mona Sans"], + "title": "FontFamily" + }, + "Text": { + "type": "string", + "enum": ["none", "uppercase", "capitalize"], + "title": "Text" + } + } +} diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/validate-figma-tokens.js b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/validate-figma-tokens.js new file mode 100644 index 000000000..3c4b00e59 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/validate-figma-tokens.js @@ -0,0 +1,16 @@ +import Ajv from 'ajv' + +const ajv = new Ajv() + +import schema from './curve-figma-design.tokens.schema.json' assert { type: 'json' } +import curveFigmaDesignTokens from '../tokens/curve-figma-design.tokens.json' assert { type: 'json' } + +const validate = ajv.compile(schema) +const valid = validate(curveFigmaDesignTokens) + +if (!valid) { + console.error('Figma tokens validation errors:', validate.errors) + process.exit(1) +} else { + console.log('Figma tokens JSON file successfully validated.') +} From 9ebd95fe4d66a0f7a7acc8611261d00e7b873c9c Mon Sep 17 00:00:00 2001 From: Ignat Date: Thu, 19 Sep 2024 15:45:30 +0500 Subject: [PATCH 003/137] =?UTF-8?q?feat:=20add=20`curve=E2=80=93ui?= =?UTF-8?q?=E2=80=93kit`=20package=20with=20`MUI`=20&=20`storybook`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 21 +- .gitignore | 4 + package.json | 4 +- packages/curve-ui-kit/package.json | 45 + packages/curve-ui-kit/tsconfig.json | 24 + packages/curve-ui-kit/turbo.json | 13 + turbo.json | 20 +- yarn.lock | 6054 ++++++++++++++++++++++++++- 8 files changed, 5949 insertions(+), 236 deletions(-) create mode 100644 packages/curve-ui-kit/package.json create mode 100644 packages/curve-ui-kit/tsconfig.json create mode 100644 packages/curve-ui-kit/turbo.json diff --git a/.eslintrc.js b/.eslintrc.js index 195f86e9e..d33a1facb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,33 +4,34 @@ module.exports = { extends: ['custom'], settings: { next: { - rootDir: ['apps/*/', 'packages/ui/*/', 'packages/onboard-helpers/*/'] - } + rootDir: ['apps/*/', 'packages/ui/*/', 'packages/onboard-helpers/*/', 'packages/curve-ui-kit/*/'], + }, }, overrides: [ // enforce Feature Sliced rules for loan app (except 'pages' folder) and curve-lib { files: [ 'apps/loan/src/{app,widgets,features,entities,shared}/**/*.{ts,tsx}', - 'packages/curve-lib/src/shared/**/*.ts' + 'packages/curve-lib/src/shared/**/*.ts', + 'packages/curve-ui-kit/src/**/*.{ts,tsx}', ], rules: { 'import/order': 'error', // feature-sliced/import-order 'import/no-internal-modules': 'error', // feature-sliced/public-api - 'boundaries/element-types': 'error' // feature-sliced/layers-slices - } + 'boundaries/element-types': 'error', // feature-sliced/layers-slices + }, }, // warn about Feature Sliced rules for main and lend apps, plus loan 'pages' folder { files: [ 'apps/{main,lend}/src/{app,pages,widgets,features,entities,shared}/**/*.{ts,tsx}', - 'apps/loan/src/pages/**/*.{ts,tsx}' + 'apps/loan/src/pages/**/*.{ts,tsx}', ], rules: { 'import/order': 'warn', // feature-sliced/import-order 'import/no-internal-modules': 'warn', // feature-sliced/public-api - 'boundaries/element-types': 'warn' // feature-sliced/layers-slices - } - } - ] + 'boundaries/element-types': 'warn', // feature-sliced/layers-slices + }, + }, + ], } diff --git a/.gitignore b/.gitignore index 875857171..df0ce53c3 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,7 @@ report.*.json # hardhat tests/cache + +# storybook +storybook-static +*storybook.log diff --git a/package.json b/package.json index c33838c41..f3e1b6c88 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "lint": "turbo lint", "lint:fix": "turbo lint -- --fix", "format": "prettier --write \"**/*.{ts,tsx,md}\"", - "prepare": "is-ci || husky" + "prepare": "is-ci || husky", + "storybook": "turbo run storybook --filter=curve-ui-kit", + "storybook:build": "turbo run storybook:build --filter=curve-ui-kit" }, "devDependencies": { "@commitlint/cli": "^19.5.0", diff --git a/packages/curve-ui-kit/package.json b/packages/curve-ui-kit/package.json new file mode 100644 index 000000000..295d29490 --- /dev/null +++ b/packages/curve-ui-kit/package.json @@ -0,0 +1,45 @@ +{ + "name": "curve-ui-kit", + "version": "0.1.0", + "type": "module", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "MIT", + "private": true, + "scripts": { + "lint": "eslint \"**/*.ts*\"", + "validate:figma-tokens": "node src/shared/api/figma-tokens/validation/validate-figma-tokens.js", + "storybook": "yarn validate:figma-tokens && storybook dev -p 6006 --no-open", + "build:storybook": "yarn validate:figma-tokens && storybook build" + }, + "dependencies": { + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@mui/material": "^6.1.4", + "@mui/utils": "^6.1.4" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + }, + "devDependencies": { + "@chromatic-com/storybook": "^2.0.2", + "@storybook/addon-a11y": "^8.3.5", + "@storybook/addon-docs": "^8.3.5", + "@storybook/addon-essentials": "^8.3.5", + "@storybook/addon-interactions": "^8.3.5", + "@storybook/addon-themes": "^8.3.5", + "@storybook/blocks": "^8.3.5", + "@storybook/nextjs": "^8.3.5", + "@storybook/react": "^8.3.5", + "@storybook/test": "^8.3.5", + "@types/react": "*", + "@types/react-dom": "*", + "ajv": "^8.17.1", + "prop-types": "^15.8.1", + "react-docgen-typescript": "^2.2.2", + "storybook": "^8.3.5", + "tsconfig": "*", + "type-fest": "^4.26.1" + } +} diff --git a/packages/curve-ui-kit/tsconfig.json b/packages/curve-ui-kit/tsconfig.json new file mode 100644 index 000000000..985713485 --- /dev/null +++ b/packages/curve-ui-kit/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "tsconfig/ui.json", + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "baseUrl": "./src", + "paths": { + "@/*": ["*"] + } + }, + "exclude": ["node_modules"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "vite.config.mts", + "**/*.d.ts", + "src/shared/api/figma-tokens/validation/validate-figma-tokens.js" + ] +} diff --git a/packages/curve-ui-kit/turbo.json b/packages/curve-ui-kit/turbo.json new file mode 100644 index 000000000..106504014 --- /dev/null +++ b/packages/curve-ui-kit/turbo.json @@ -0,0 +1,13 @@ +{ + "extends": ["//"], + "tasks": { + "build:storybook": { + "dependsOn": ["^build:storybook"], + "outputs": ["storybook-static/**"] + }, + "storybook": { + "dependsOn": ["^storybook"], + "outputs": ["storybook-static/**"] + } + } +} diff --git a/turbo.json b/turbo.json index 9bd8eff4c..f6b278014 100644 --- a/turbo.json +++ b/turbo.json @@ -1,8 +1,6 @@ { "$schema": "https://turborepo.org/schema.json", - "globalDependencies": [ - "**/.env.*local" - ], + "globalDependencies": ["**/.env.*local"], "globalEnv": [ "NEXT_PUBLIC_MAINTENANCE_MESSAGE", "NEXT_PUBLIC_ETHEREUM_DEV_RPC_URL", @@ -35,20 +33,16 @@ ], "tasks": { "build": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "dist/**", - "out/**", - ".next/**", - "!.next/cache/**" - ] + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", "!**/*.stories.{tsx,jsx,mdx}"], + "outputs": ["dist/**", "out/**", ".next/**", "!.next/cache/**", "storybook-static/**"] }, "lint": {}, "dev": { "cache": false, "persistent": true - } + }, + "build:storybook": {}, + "storybook": { "cache": false, "persistent": true } } } diff --git a/yarn.lock b/yarn.lock index 793cf2509..0c568e4ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 8 cacheKey: 10c0 +"@adobe/css-tools@npm:^4.4.0": + version: 4.4.0 + resolution: "@adobe/css-tools@npm:4.4.0" + checksum: 10c0/d65ddc719389bf469097df80fb16a8af48a973dea4b57565789d70ac8e7ab4987e6dc0095da3ed5dc16c1b6f8960214a7590312eeda8abd543d91fd0f59e6c94 + languageName: node + linkType: hard + "@adraffy/ens-normalize@npm:1.10.0": version: 1.10.0 resolution: "@adraffy/ens-normalize@npm:1.10.0" @@ -38,6 +45,26 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": "npm:^7.24.7" + picocolors: "npm:^1.0.0" + checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/code-frame@npm:7.25.7" + dependencies: + "@babel/highlight": "npm:^7.25.7" + picocolors: "npm:^1.0.0" + checksum: 10c0/14825c298bdec914caf3d24d1383b6d4cd6b030714686004992f4fc251831ecf432236652896f99d5d341f17170ae9a07b58d8d7b15aa0df8cfa1c5a7d5474bc + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": version: 7.23.5 resolution: "@babel/code-frame@npm:7.23.5" @@ -48,16 +75,6 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": "npm:^7.24.7" - picocolors: "npm:^1.0.0" - checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" @@ -72,6 +89,36 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.25.7, @babel/compat-data@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/compat-data@npm:7.25.8" + checksum: 10c0/8b81c17580e5fb4cbb6a3c52079f8c283fc59c0c6bd2fe14cfcf9c44b32d2eaab71b02c5633e2c679f5896f73f8ac4036ba2e67a4c806e8f428e4b11f526d7f4 + languageName: node + linkType: hard + +"@babel/core@npm:^7.18.9, @babel/core@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/core@npm:7.25.2" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.7" + "@babel/generator": "npm:^7.25.0" + "@babel/helper-compilation-targets": "npm:^7.25.2" + "@babel/helper-module-transforms": "npm:^7.25.2" + "@babel/helpers": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.0" + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.2" + "@babel/types": "npm:^7.25.2" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 + languageName: node + linkType: hard + "@babel/core@npm:^7.21.0, @babel/core@npm:^7.21.3": version: 7.23.5 resolution: "@babel/core@npm:7.23.5" @@ -95,26 +142,26 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" +"@babel/core@npm:^7.24.4": + version: 7.25.8 + resolution: "@babel/core@npm:7.25.8" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" + "@babel/code-frame": "npm:^7.25.7" + "@babel/generator": "npm:^7.25.7" + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-module-transforms": "npm:^7.25.7" + "@babel/helpers": "npm:^7.25.7" + "@babel/parser": "npm:^7.25.8" + "@babel/template": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.8" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 + checksum: 10c0/8411ea506e6f7c8a39ab5c1524b00589fa3b087edb47389708f7fe07170929192171734666e3ea10b95a951643a531a6d09eedfe071572c9ea28516646265086 languageName: node linkType: hard @@ -153,6 +200,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/generator@npm:7.25.7" + dependencies: + "@babel/types": "npm:^7.25.7" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/c03a26c79864d60d04ce36b649c3fa0d6fd7b2bf6a22e22854a0457aa09206508392dd73ee40e7bc8d50b3602f9ff068afa47770cda091d332e7db1ca382ee96 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -162,6 +221,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.7" + dependencies: + "@babel/types": "npm:^7.25.7" + checksum: 10c0/2f020b0fa9d336b5778485cc2de3141561ec436a7591b685457a5bcdae4ce41d9ddee68169c95504e0789e5a4327e73b8b7e72e5b60e82e96d730c4d19255248 + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" @@ -171,6 +239,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.7" + dependencies: + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/e9dc5a7920a1d74150dec53ccd5e34f2b31ae307df7cdeec6289866f7bda97ecb1328b49a7710ecde5db5b6daad768c904a030f9a0fa3184963b0017622c42aa + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" @@ -197,6 +275,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-compilation-targets@npm:7.25.7" + dependencies: + "@babel/compat-data": "npm:^7.25.7" + "@babel/helper-validator-option": "npm:^7.25.7" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/705be7e5274a3fdade68e3e2cf42e2b600316ab52794e13b91299a16f16c926f15886b6e9d6df20eb943ccc1cdba5a363d4766f8d01e47b8e6f4e01175f5e66c + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" @@ -216,6 +307,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-member-expression-to-functions": "npm:^7.25.7" + "@babel/helper-optimise-call-expression": "npm:^7.25.7" + "@babel/helper-replace-supers": "npm:^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/405c3c1a137acda1206380a96993cf2cfd808b3bee1c11c4af47ee0f03a20858497aa53394d6adc5431793c543be5e02010620e871a5ab39d938ae90a54b50f2 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" @@ -229,6 +337,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + regexpu-core: "npm:^6.1.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/75919fd5a67cd7be8497b56f7b9ed6b4843cb401956ba8d403aa9ae5b005bc28e35c7f27e704d820edbd1154394ed7a7984d4719916795d89d716f6980fe8bd4 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.4.3": version: 0.4.3 resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" @@ -244,6 +365,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.22.6" + "@babel/helper-plugin-utils": "npm:^7.22.5" + debug: "npm:^4.1.1" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.14.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/f777fe0ee1e467fdaaac059c39ed203bdc94ef2465fb873316e9e1acfc511a276263724b061e3b0af2f6d7ad3ff174f2bb368fde236a860e0f650fda43d7e022 + languageName: node + linkType: hard + "@babel/helper-environment-visitor@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-environment-visitor@npm:7.18.9" @@ -305,6 +441,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.7" + dependencies: + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/1e948162ab48d84593a7c6ec9570d14c906146f1697144fc369c59dbeb00e4a062da67dd06cb0d8f98a044cd8389002dcf2ab6f5613d99c35748307846ec63fc + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.0.0": version: 7.18.6 resolution: "@babel/helper-module-imports@npm:7.18.6" @@ -314,6 +460,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" + dependencies: + "@babel/traverse": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-module-imports@npm:7.22.15" @@ -323,13 +479,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" +"@babel/helper-module-imports@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-module-imports@npm:7.25.7" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/0fd0c3673835e5bf75558e184bcadc47c1f6dd2fe2016d53ebe1e5a6ae931a44e093015c2f9a6651c1a89f25c76d9246710c2b0b460b95ee069c464f2837fa2c languageName: node linkType: hard @@ -362,6 +518,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-module-transforms@npm:7.25.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.7" + "@babel/helper-simple-access": "npm:^7.25.7" + "@babel/helper-validator-identifier": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/f37fa7d1d4df21690535b278468cbd5faf0133a3080f282000cfa4f3ffc9462a1458f866b04b6a2f2d1eec4691236cba9a867da61270dab3ab19846e62f05090 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" @@ -371,6 +541,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.7" + dependencies: + "@babel/types": "npm:^7.25.7" + checksum: 10c0/19b4cc7e77811b1fedca4928dbc14026afef913c2ba4142e5e110ebdcb5c3b2efc0f0fbee9f362c23a194674147b9d627adea71c289b9be08b9067bc0085308b + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.16.7 resolution: "@babel/helper-plugin-utils@npm:7.16.7" @@ -385,6 +564,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-plugin-utils@npm:7.25.7" + checksum: 10c0/241f8cf3c5b7700e91cab7cfe5b432a3c710ae3cd5bb96dc554da536a6d25f5b9f000cc0c0917501ceb4f76ba92599ee3beb25e10adaf96be59f8df89a842faf + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -398,6 +584,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-wrap-function": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/972d84876adce6ab61c87a2df47e1afc790b73cff0d1767d0a1c5d9f7aa5e91d8c581a272b66b2051a26cfbb167d8a780564705e488e3ce1f477f1c15059bc5f + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-replace-supers@npm:7.22.20" @@ -411,6 +610,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-replace-supers@npm:7.25.7" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.25.7" + "@babel/helper-optimise-call-expression": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/761d64ee74429f7326a6aa65e2cd5bfcb8de9e3bc3f1efb14b8f610d2410f003b0fca52778dc801d49ff8fbc90b057e8f51b27c62b0b05c95eaf23140ca1287b + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -430,6 +642,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-simple-access@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-simple-access@npm:7.25.7" + dependencies: + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/eed1b499bfb4f613c18debd61517e3de77b6da2727ca025aa05ac81599e0269f1dddb5237db04e8bb598115d015874752e0a7f11ff38672d74a4976097417059 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" @@ -439,6 +661,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.7" + dependencies: + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/5804adb893849a9d8cfb548e3812566a81d95cb0c9a10d66b52912d13f488e577c33063bf19bc06ac70e6333162a7370d67ba1a1c3544d37fb50d5f4a00db4de + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-split-export-declaration@npm:7.18.6" @@ -527,6 +759,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-validator-option@npm:7.25.7" + checksum: 10c0/12ed418c8e3ed9ed44c8c80d823f4e42d399b5eb2e423adccb975e31a31a008cd3b5d8eab688b31f740caff4a1bb28fe06ea2fa7d635aee34cc0ad6995d50f0a + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -538,6 +777,17 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helper-wrap-function@npm:7.25.7" + dependencies: + "@babel/template": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/b5d412f72697f4a4ce4cb9784fbaf82501c63cf95066c0eadd3179e3439cbbf0aa5fa4858d93590083671943cd357aeb87286958df34aa56fdf8a4c9dea39755 + languageName: node + linkType: hard + "@babel/helpers@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helpers@npm:7.23.5" @@ -559,6 +809,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/helpers@npm:7.25.7" + dependencies: + "@babel/template": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/3b3ae9e373bd785414195ef8f59976a69d5a6ebe0ef2165fdcc5165e5c3ee09e0fcee94bb457df2ddb8c0532e4146d0a9b7a96b3497399a4bff4ffe196b30228 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.18.6": version: 7.18.6 resolution: "@babel/highlight@npm:7.18.6" @@ -593,6 +853,29 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/highlight@npm:7.25.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.7" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/1f5894fdb0a0af6101fb2822369b2eeeae32cbeae2ef73ff73fc6a0a4a20471565cd9cfa589f54ed69df66adeca7c57266031ca9134b7bd244d023a488d419aa + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": "npm:^7.25.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + languageName: node + linkType: hard + "@babel/parser@npm:^7.18.10, @babel/parser@npm:^7.20.5": version: 7.20.5 resolution: "@babel/parser@npm:7.20.5" @@ -611,14 +894,37 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" +"@babel/parser@npm:^7.25.7, @babel/parser@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/parser@npm:7.25.8" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/types": "npm:^7.25.8" bin: parser: ./bin/babel-parser.js - checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + checksum: 10c0/a1a13845b7e8dda4c970791814a4bbf60004969882f18f470e260ad822d2e1f8941948f851e9335895563610f240fa6c98481ce8019865e469502bbf21daafa4 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/c6ba97c39973897a2ab021c4a77221e1e93e853a5811d498db325da1bd692e41fa521db6d91bb709ccafd4e54ddd00869ffb35846923c3ccd49d46124b316904 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ac284868bf410f952c6959b0d77708464127160416f003b05c8127d30e64792d671abc167ebf778b17707e32174223ea8d3ff487276991fa90297d92f0dac6e2 languageName: node linkType: hard @@ -633,6 +939,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/1bffc0a20c8c82b4c77515eb4c99b961b38184116f008bb42bed4e12d3379ba7b2bc6cf299bcea8118d645bb7a5e0caa83969842f16dd1fce49fb3a050e4ac65 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" @@ -646,6 +963,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10c0/32223f012614a0b2657579317ded7d0d09af2aa316285715c5012f974d0f15c2ce2fe0d8e80fdd9bac6c10c21c93cc925a9dfd6c8e21ce7ba1a9fe06a58088b4 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" @@ -658,6 +988,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/aa2ee7a5954d187de6cbcca0e0b64cfb79c4d224c332d1eb1e0e4afd92ef1a1f4bc4af24f66154097ccb348c08121a875456f47baed220b1b9e93584e6a19b65 + languageName: node + linkType: hard + "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -678,6 +1020,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + "@babel/plugin-syntax-class-properties@npm:^7.12.13": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" @@ -733,6 +1086,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.24.1, @babel/plugin-syntax-import-assertions@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0fee0d971f3c654749fdf92e09b6556bba26ab014c8e99b7252f6a7f1ca108f17edd7ceefb5401d7b7008e98ab1b6f8c3c6a5db72862e7c7b2fcd649d000d690 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" @@ -744,6 +1108,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fe00cdb96fd289ab126830a98e1dcf5ab7b529a6ef1c01a72506b5e7b1197d6e46c3c4d029cd90d1d61eb9a15ef77c282d156d0c02c7e32f168bb09d84150db4 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -777,6 +1152,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/17db499c31fcfaa94d5408726d943955d51d478353d1e2dd84eda6024f7e3d104b9456a77f8aabfae0db7f4dc32f810d08357112f7fcbe305e7c9fcf5b3cac13 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -876,6 +1262,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ed51fd81a5cf571a89fc4cf4c0e3b0b91285c367237374c133d2e5e718f3963cfa61b81997df39220a8837dc99f9e9a8ab7701d259c09fae379e4843d9db60c2 + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -899,6 +1296,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c8d75ead93f130bf113b6d29493aca695092661ef039336d2a227169c3b7895aa5e9bcc548c42a95a6eaaaf49e512317b00699940bd40ccefd77443e703d3935 + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" @@ -913,6 +1321,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-remap-async-to-generator": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1698d0757d3dc895047120346cdbe6d539dae4a7bb930caf958c3623e89c850d378d1ebd971a1a8b4cba39c8f001cd9c25a1d6f430099022ab1e87aeddb5dd88 + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" @@ -926,6 +1347,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-remap-async-to-generator": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1dbefba9c1455f7a92b8c59a93c622091db945294c936fc2c09b1648308c5b4cb2ecaae92baae0d07a324ab890a8a2ee27ceb046bc120932845d27aede275821 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" @@ -937,6 +1371,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b1e77492295d1b271ef850a81b0404cf3d0dd6a2bcbeab28a0fd99e61c6de4bda91dff583bb42138eec61bf71282bdd3b1bebcb53b7e373035e77fd6ba66caeb + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" @@ -948,6 +1393,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b2057e00535cd0e8bd5ee5d4640aa2e952564aeafb1bcf4e7b6de33442422877bb0ca8669ad0a48262ec077271978c61eae87b6b3bc8f472d830fa781d6f7e44 + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" @@ -960,6 +1416,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.24.1, @babel/plugin-transform-class-properties@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1f41e6934b20ad3e05df63959cff9bc600ff3119153b9acbbd44c1731e7df04866397e6e17799173f4c53cdee6115e155632859aee20bf47ec7dcef3f2168a47 + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" @@ -973,6 +1441,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-class-static-block@npm:7.25.8" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10c0/4f37853aef6920875022bbb2d7c6523218d9d718291464e2cacd9cc6f2c22d86a69948d8ea38f9248843bbfe9343f3fd18cf16b1615560124198bf999e3ba612 + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.23.5": version: 7.23.5 resolution: "@babel/plugin-transform-classes@npm:7.23.5" @@ -992,6 +1472,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-classes@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-replace-supers": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8121781e1d8acd80e6169019106f73a399475ad9c895c1988a344dfed5a6ddd340938ac55123dc1e423bb8f25f255f5d11031116ad756ba3c314595a97c973af + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" @@ -1004,6 +1500,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/template": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7ad0a1c126f50935a02e77d438ebc39078a9d644b3a60de60bec32c5d9f49e7f2b193fcecb8c61bb1bc3cdd4af1e93f72d022d448511fa76a171527c633cd1bf + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" @@ -1015,6 +1523,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a563123b2fb267e03aa50104005f00b56226a685938906c42c1b251462e0cc9fc89e587d5656d3324159071eb8ebda8c68a6011f11d5a00fb1436cb5a5411b7b + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" @@ -1027,6 +1546,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7f1db3ec20b7fae46db4a9c4c257d75418b0896b72c0a3de20b3044f952801480f0a2e75ebb0d64f13e8cd4db0e49aa42c5c0edff372b23c41679b1ea5dd3ed4 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" @@ -1038,6 +1569,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b4079981e2db19737a0f1a00254e7388e2d3c01ce36e9fd826e4d86d3c1755339495e29c71fd7c84a068201ec24687328d48f3bf53b32b6d6224f51d9a34da74 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/e4946090ff6d88d54b78265ee653079ec34c117ac046e22f66f7c4ac44249cdc2dfca385bc5bf4386db668b9948eeb12985589500188bc252e684c7714c31475 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" @@ -1050,6 +1604,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9726abc1b07771a9c1e3670908ac425d21e29f54c775d10ed7a4e2bc0a18e07600f70bbc531deba3fb3ff7f6763c189200593264c6f784dac583e653b66fe754 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" @@ -1062,6 +1627,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.7" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c8537b9f3cddc5a8d3710f6980196dc7a0f4389f8f82617312a5f7b8b15bcd8ddaeba783c687c3ac6031eb0a4ba0bc380a98da6bf7efe98e225602a98ad42a1e + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" @@ -1074,6 +1651,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1, @babel/plugin-transform-export-namespace-from@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8a2e1205dd727a96a9adef0e981d68c61b1c286480b9136e2aa67ce3e2c742be4f87feb9fb4c5548a401aba0953d43d66e9ec36a54dea6a7c15f1ee9345baf57 + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-for-of@npm:7.23.3" @@ -1085,6 +1673,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-for-of@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/08a37a1742368a422d095c998ed76f60f6bf3f9cc060033be121d803fd2dddc08fe543e48ee49c022bdc9ed80893ca79d084958d83d30684178b088774754277 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-function-name@npm:7.23.3" @@ -1098,6 +1698,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-function-name@npm:7.25.7" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ca98e1116c0ada7211ed43e4b7f21ca15f95bbbdad70f2fbe1ec2d90a97daedf9f22fcb0a25c8b164a5e394f509f2e4d1f7609d26dc938a58d37c5ee9b80088a + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" @@ -1110,6 +1723,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2a6cf69ebe8deebc39c56adae75d609e16786dc4cbd83577eefdc838bd89ca8974671d47e2669b8e65ef9b7ace427f7c2c5a9fc6aa09247b10e141d15fee81cf + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-literals@npm:7.23.3" @@ -1121,6 +1745,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-literals@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c2c2488102f33e566f45becdcb632e53bd052ecfb2879deb07a614b3e9437e3b624c3b16d080096d50b0b622edebd03e438acbf9260bcc41167897963f64560e + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" @@ -1133,6 +1768,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9adc2634c94b283b682fbf71bbec553bd8448196213491a0ef9ea167993c9c36dcb2fbefbd834e113cfed843a67290131bc99e463f8702043c3f4e3a99bb807e + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" @@ -1144,6 +1790,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d6936b98ae4d3daed850dc4e064042ea4375f815219ba9d8591373bf1fba4cfdb5be42623ae8882f2d666cc34af650a4855e2a5ad89e3c235d73a6f172f9969c + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" @@ -1156,6 +1813,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c0bc999206c3834c090e6559a6c8a55d7672d3573104e832223ebe7df99bd1b82fc850e15ba32f512c84b0db1cdb613b66fa60abe9abb9c7e8dcbff91649b356 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" @@ -1169,6 +1838,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-simple-access": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2f1c945fc3c9b690b0ddcf2c80156b2e4fbf2cf15aac43ac8fe6e4b34125869528839a53d07c564e62e4aed394ebdc1d2c3b796b547374455522581c11b7599c + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" @@ -1183,6 +1865,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-validator-identifier": "npm:^7.25.7" + "@babel/traverse": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95eaea7082636710c61e49e58b3907e85ec79db4327411d3784f28592509fbe94a53cc3d20a36a1cf245efc6d3f0017eae15b45ffd645c1ab949bb4e1670e6bb + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" @@ -1195,6 +1891,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8849ab04eecdb73cd37e2d7289449fa5256331832b0304c220b2a6aaa12e2d2dd87684f2813412d1fc5bdb3d6b55cc08c6386d3273fe05a65177c09bee5b6769 + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" @@ -1207,6 +1915,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/eb55fec55dc930cd122911f3e4a421320fa8b1b4de85bfd7ef11b46c611ec69b0213c114a6e1c6bc224d6b954ff183a0caa7251267d5258ecc0f00d6d9ca1d52 + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-new-target@npm:7.23.3" @@ -1218,6 +1938,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-new-target@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8e5dce6d027e0f3fd394578ea1af7f515de157793a15c23a5aad7034a6d8a4005ef280238e67a232bb4dd4fafd3a264fed462deb149128ddd9ce59ff6f575cff + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" @@ -1230,6 +1961,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3cb7c44cffccae42e104755acb31b4f00bc27d8c88102ae6f30dca508832f98fa5b746bead0fc7c0c6ddcf83f336829be4b64245c6c7ce26b3ef591937ec54a4 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" @@ -1242,6 +1984,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.24.1, @babel/plugin-transform-numeric-separator@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d23b3ebc50513f24510791ac2cad43e3c6ea08579f54dccfd4ed5e5d5084f02da0576ea42ea999fb51e1f94f42857cac96a1a29ac6728fc262fbe87ec966dc18 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" @@ -1257,6 +2010,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1, @babel/plugin-transform-object-rest-spread@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.8" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/plugin-transform-parameters": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/058d5f5bb61068997fb78855011dd175d441da84717640852bbfd12a5919acf8d8c5a14c1debfe87d230f3f4c47c22fcad3d7fa1acd72e5e48b2fff93b6c1dd9 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-object-super@npm:7.23.3" @@ -1269,6 +2035,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-object-super@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-replace-supers": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7f2968d4da997101b63fd3b74445c9b16f56bd32cd8a0a16c368af9d3e983e7675c1b05d18601f32307cb06e7d884ee11d13ff18a1f6830c0db243a9a852afab + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" @@ -1281,6 +2059,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f4360e62ca4aa998db31548d0ef06836d958bcb29dee58f5c62d0c29b6b2bff1b54871195bd032825fe3dd79a4fd8275e165148c8d4b57694bcf72135c8f7d24 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" @@ -1294,6 +2083,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.25.7, @babel/plugin-transform-optional-chaining@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a1cdbfc249619fa6b37e57f81600701281629d86a57e616b0c2b29816d0c43114a2296ce089564afd3aa7870c8aad62e907658ffef2c110662af14ee23d5247f + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-parameters@npm:7.23.3" @@ -1305,6 +2106,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-parameters@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b40ba70278842ce1e800d7ab400df730994941550da547ef453780023bd61a9b8acf4b9fb8419c1b5bcbe09819a1146ff59369db11db07eb71870bef86a12422 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" @@ -1317,6 +2129,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/92e076f63f7c4696e1321dafdd56c4212eb41784cdadba0ebc39091f959a76d357c3df61a6c668be81d6b6ad8964ee458e85752ab0c6cfbbaf2066903edda732 + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" @@ -1331,6 +2155,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.8" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-create-class-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/61b5e3a4eb94caf38d6e9ff7bff1ac8927758141aaa4891036d3490866ecee53beaefd7893519fec42a4c55f33374a17fc0e49694cdaf95668082073f0fe4a79 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" @@ -1342,6 +2179,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6d5bccdc772207906666ad5201bd91e4e132e1d806dbcf4163a1d08e18c57cc3795578c4e10596514bcd6afaf9696f478ea4f0dea890176d93b9cb077b9e5c55 + languageName: node + linkType: hard + "@babel/plugin-transform-react-constant-elements@npm:^7.21.3": version: 7.23.3 resolution: "@babel/plugin-transform-react-constant-elements@npm:7.23.3" @@ -1364,6 +2212,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-react-display-name@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a0c537cc7c328ed7468d3b6a37bf0d9cb15d94afcdf3f2849ce6e5a68494fc61f0fa4fc529482a6b95b00f3c5c734f310bf18085293bff40702789f06c816f36 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-development@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" @@ -1375,6 +2234,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-development@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.7" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a3dc14644d09a6d22875af7b5584393ab53e467e0531cd192fc6242504dacaffa421e89265ba7f84fd4edef2b7b100d2e2ebf092a4dce2b55cf9c5fe29390c18 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": version: 7.23.4 resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" @@ -1390,6 +2260,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-module-imports": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/plugin-syntax-jsx": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6766b0357b8bbfcb77fca5350f06cf822c89bbe75ddcaea24614601ef23957504da24e76597d743038ce8fa081373b0663c8ad0c86d7c7226e8185f0680b8b56 + languageName: node + linkType: hard + "@babel/plugin-transform-react-pure-annotations@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.23.3" @@ -1402,6 +2287,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-pure-annotations@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d92c9b511850fb6dea71966a0d4f313d67e317db7fc3633a7ff2e27d6df2e95cbc91c4c25abdb6c8db651fcda842a0cb7433835a8a9d4a3fdc5d452068428101 + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" @@ -1414,14 +2311,53 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-regenerator@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7ee3a57c4050bc908ef7ac392d810826b294970a7182f4ec34a8ca93dbe36deb21bc862616d46a6f3d881d6b5749930e1679e875b638a00866d844a4250df212 + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.22.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4e6d61f6c9757592661cfbd2c39c4f61551557b98cb5f0995ef10f5540f67e18dde8a42b09716d58943b6e4b7ef5c9bcf19902839e7328a4d49149e0fecdbfcd + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/920c98130daff6c1288fb13a9a2d2e45863bba93e619cb88d90e1f5b5cb358a3ee8880a425a3adb1b4bd5dbb6bd0500eea3370fc612633045eec851b08cc586c + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:^7.24.3": + version: 7.25.7 + resolution: "@babel/plugin-transform-runtime@npm:7.25.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4e6d61f6c9757592661cfbd2c39c4f61551557b98cb5f0995ef10f5540f67e18dde8a42b09716d58943b6e4b7ef5c9bcf19902839e7328a4d49149e0fecdbfcd + checksum: 10c0/9b2514e9079361ac8e7e500ffd522dad869d61a3894302da7e29bbac80de00276c8a1b4394d1dcf0b51c57b2c854919928df9648be336139fdf1d6ecd6d1bb32 languageName: node linkType: hard @@ -1436,6 +2372,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4250f89a0072f0f400be7a2e3515227b8e2518737899bd57d497e5173284a0e05d812e4a3c219ffcd484e9fa9a01c19fce5acd77bbb898f4d594512c56701eb4 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-spread@npm:7.23.3" @@ -1448,6 +2395,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-spread@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/258bd1b52388cd7425d0ae25fa39538734f7540ea503a1d8a72211d33f6f214cb4e3b73d6cd03016cbcff5d41169f1e578b9ea331965ad224d223591983e90a7 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" @@ -1459,6 +2418,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0e466cfc3ca1e0db4bb11eb630215b0e1f43066d7678325e5ddadcf5a118b2351a528f67205729c32ac5b78ab68ab7f40517dd33bcb1fb6b456509f5f54ce097 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" @@ -1470,6 +2440,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a3455303b6841cb536ac66d1a2d03c194b9f371519482d8d1e8edbd33bf5ca7cdd5db1586b2b0ea5f909ebf74a0eafacf0fb28d257e4905445282dcdccfa6139 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" @@ -1481,6 +2462,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ce1a0744a900b05de1372a70508c4148f17eb941c482da26eb369b9f0347570dce45470c8a86d907bc3a0443190344da1e18489ecfecb30388ab6178e8a9916b + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.23.3": version: 7.23.5 resolution: "@babel/plugin-transform-typescript@npm:7.23.5" @@ -1495,6 +2487,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-typescript@npm:7.25.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.7" + "@babel/helper-create-class-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.7" + "@babel/plugin-syntax-typescript": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5fa839b9560221698edff5e00b5cccc658c7875efaa7971c66d478f5b026770f12dd47b1be024463a44f9e29b4e14e8ddddbf4a2b324b0b94f58370dd5ae7195 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" @@ -1506,6 +2513,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8b1f71fda0a832c6e26ba4c00f99e9033e6f9b36ced542a512921f4ad861a70e2fec2bd54a91a5ca2efa46aaa8c8893e4c602635c4ef172bd3ed6eef3178c70b + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" @@ -1518,6 +2536,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b4bfcf7529138d00671bf5cdfe606603d52cfe57ec1be837da57683f404fc0b0c171834a02515eb03379e5c806121866d097b90e31cb437d21d0ea59368ad82b + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" @@ -1530,6 +2560,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/73ae34c02ea8b7ac7e4efa690f8c226089c074e3fef658d2a630ad898a93550d84146ce05e073c271c8b2bbba61cbbfd5a2002a7ea940dcad3274e5b5dcb6bcf + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" @@ -1542,6 +2584,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/39e45ae3db7adfc3457b1d6ba5608ffbace957ad019785967e5357a6639f261765bda12363f655d39265f5a2834af26327037751420191d0b73152ccc7ce3c35 + languageName: node + linkType: hard + "@babel/preset-env@npm:^7.20.2": version: 7.23.5 resolution: "@babel/preset-env@npm:7.23.5" @@ -1632,6 +2686,84 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.24.4": + version: 7.25.8 + resolution: "@babel/preset-env@npm:7.25.8" + dependencies: + "@babel/compat-data": "npm:^7.25.8" + "@babel/helper-compilation-targets": "npm:^7.25.7" + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-validator-option": "npm:^7.25.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.7" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.25.7" + "@babel/plugin-syntax-import-attributes": "npm:^7.25.7" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.8" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.7" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.25.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.7" + "@babel/plugin-transform-class-properties": "npm:^7.25.7" + "@babel/plugin-transform-class-static-block": "npm:^7.25.8" + "@babel/plugin-transform-classes": "npm:^7.25.7" + "@babel/plugin-transform-computed-properties": "npm:^7.25.7" + "@babel/plugin-transform-destructuring": "npm:^7.25.7" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.7" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.7" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.8" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.25.7" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.8" + "@babel/plugin-transform-for-of": "npm:^7.25.7" + "@babel/plugin-transform-function-name": "npm:^7.25.7" + "@babel/plugin-transform-json-strings": "npm:^7.25.8" + "@babel/plugin-transform-literals": "npm:^7.25.7" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.8" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.7" + "@babel/plugin-transform-modules-amd": "npm:^7.25.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.7" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.7" + "@babel/plugin-transform-modules-umd": "npm:^7.25.7" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.7" + "@babel/plugin-transform-new-target": "npm:^7.25.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.25.8" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.8" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.8" + "@babel/plugin-transform-object-super": "npm:^7.25.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.8" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.8" + "@babel/plugin-transform-parameters": "npm:^7.25.7" + "@babel/plugin-transform-private-methods": "npm:^7.25.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.8" + "@babel/plugin-transform-property-literals": "npm:^7.25.7" + "@babel/plugin-transform-regenerator": "npm:^7.25.7" + "@babel/plugin-transform-reserved-words": "npm:^7.25.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.7" + "@babel/plugin-transform-spread": "npm:^7.25.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.7" + "@babel/plugin-transform-template-literals": "npm:^7.25.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.25.7" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.7" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.7" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.7" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.7" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.10.6" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.38.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a45cd64ca082262998f6cf508b413ff8a9e967bf33e58337a1fe41c6c939a4c25cc73cd58387792c00d43905cf5fb0ea5ef88dfdc2addf2e8133743088c86c72 + languageName: node + linkType: hard + "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -1661,6 +2793,22 @@ __metadata: languageName: node linkType: hard +"@babel/preset-react@npm:^7.24.1": + version: 7.25.7 + resolution: "@babel/preset-react@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-validator-option": "npm:^7.25.7" + "@babel/plugin-transform-react-display-name": "npm:^7.25.7" + "@babel/plugin-transform-react-jsx": "npm:^7.25.7" + "@babel/plugin-transform-react-jsx-development": "npm:^7.25.7" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b133b1a2f46c70a337d8b1ef442e09e3dbdaecb0d6bed8f1cb64dfddc31c16e248b017385ab909caeebd8462111c9c0e1c5409deb10f2be5cb5bcfdaa4d27718 + languageName: node + linkType: hard + "@babel/preset-typescript@npm:^7.21.0": version: 7.23.3 resolution: "@babel/preset-typescript@npm:7.23.3" @@ -1676,6 +2824,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.24.1": + version: 7.25.7 + resolution: "@babel/preset-typescript@npm:7.25.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.7" + "@babel/helper-validator-option": "npm:^7.25.7" + "@babel/plugin-syntax-jsx": "npm:^7.25.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.25.7" + "@babel/plugin-transform-typescript": "npm:^7.25.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8dc1258e3c5230bbe42ff9811f08924509238e6bd32fa0b7b0c0a6c5e1419512a8e1f733e1b114454d367b7c164beca2cf33acf2ed9e0d99be010c1c5cdbef0c + languageName: node + linkType: hard + "@babel/regjsgen@npm:^0.8.0": version: 0.8.0 resolution: "@babel/regjsgen@npm:0.8.0" @@ -1701,7 +2864,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.25.6": +"@babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.25.6, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.25.6 resolution: "@babel/runtime@npm:7.25.6" dependencies: @@ -1710,6 +2873,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/runtime@npm:7.25.7" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/86b7829d2fc9343714a9afe92757cf96c4dc799006ca61d73cda62f4b9e29bfa1ce36794955bc6cb4c188f5b10db832c949339895e1bbe81a69022d9d578ce29 + languageName: node + linkType: hard + "@babel/template@npm:^7.18.10": version: 7.18.10 resolution: "@babel/template@npm:7.18.10" @@ -1743,6 +2915,32 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/template@npm:7.25.7" + dependencies: + "@babel/code-frame": "npm:^7.25.7" + "@babel/parser": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" + checksum: 10c0/8ae9e36e4330ee83d4832531d1d9bec7dc2ef6a2a8afa1ef1229506fd60667abcb17f306d1c3d7e582251270597022990c845d5d69e7add70a5aea66720decb9 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/generator": "npm:^7.25.6" + "@babel/parser": "npm:^7.25.6" + "@babel/template": "npm:^7.25.0" + "@babel/types": "npm:^7.25.6" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + languageName: node + linkType: hard + "@babel/traverse@npm:^7.23.5": version: 7.23.5 resolution: "@babel/traverse@npm:7.23.5" @@ -1761,18 +2959,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" +"@babel/traverse@npm:^7.25.7": + version: 7.25.7 + resolution: "@babel/traverse@npm:7.25.7" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.6" - "@babel/parser": "npm:^7.25.6" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" + "@babel/code-frame": "npm:^7.25.7" + "@babel/generator": "npm:^7.25.7" + "@babel/parser": "npm:^7.25.7" + "@babel/template": "npm:^7.25.7" + "@babel/types": "npm:^7.25.7" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + checksum: 10c0/75d73e52c507a7a7a4c7971d6bf4f8f26fdd094e0d3a0193d77edf6a5efa36fc3db91ec5cc48e8b94e6eb5d5ad21af0a1040e71309172851209415fd105efb1a languageName: node linkType: hard @@ -1794,6 +2992,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.8" + "@babel/helper-validator-identifier": "npm:^7.24.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + languageName: node + linkType: hard + "@babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.5, @babel/types@npm:^7.4.4": version: 7.20.5 resolution: "@babel/types@npm:7.20.5" @@ -1816,14 +3025,14 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" +"@babel/types@npm:^7.25.7, @babel/types@npm:^7.25.8": + version: 7.25.8 + resolution: "@babel/types@npm:7.25.8" dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/helper-string-parser": "npm:^7.25.7" + "@babel/helper-validator-identifier": "npm:^7.25.7" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + checksum: 10c0/55ca2d6df6426c98db2769ce884ce5e9de83a512ea2dd7bcf56c811984dc14351cacf42932a723630c5afcff2455809323decd645820762182f10b7b5252b59f languageName: node linkType: hard @@ -1838,6 +3047,13 @@ __metadata: languageName: node linkType: hard +"@base2/pretty-print-object@npm:1.0.1": + version: 1.0.1 + resolution: "@base2/pretty-print-object@npm:1.0.1" + checksum: 10c0/98f77ea185a30c854897feb2a68fe51be8451a1a0b531bac61a5dd67033926a0ba0c9be6e0f819b8cb72ca349b3e7648bf81c12fd21df0b45219c75a3a75784b + languageName: node + linkType: hard + "@bitget-wallet/web3-sdk@npm:^0.0.8": version: 0.0.8 resolution: "@bitget-wallet/web3-sdk@npm:0.0.8" @@ -1878,6 +3094,19 @@ __metadata: languageName: node linkType: hard +"@chromatic-com/storybook@npm:^2.0.2": + version: 2.0.2 + resolution: "@chromatic-com/storybook@npm:2.0.2" + dependencies: + chromatic: "npm:^11.4.0" + filesize: "npm:^10.0.12" + jsonfile: "npm:^6.1.0" + react-confetti: "npm:^6.1.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/a997e8247168d9c30030966877836839951b6acd65899a4bb683d78d37e549a3285ca14a721893d75bef5b89e075d7090d084023c142680efaef60c9db64e7fa + languageName: node + linkType: hard + "@coinbase/wallet-sdk@npm:4.0.3": version: 4.0.3 resolution: "@coinbase/wallet-sdk@npm:4.0.3" @@ -2178,7 +3407,55 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:^1.1.0": +"@emnapi/runtime@npm:^1.2.0": + version: 1.3.1 + resolution: "@emnapi/runtime@npm:1.3.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/060ffede50f1b619c15083312b80a9e62a5b0c87aa8c1b54854c49766c9d69f8d1d3d87bd963a647071263a320db41b25eaa50b74d6a80dcc763c23dbeaafd6c + languageName: node + linkType: hard + +"@emotion/babel-plugin@npm:^11.12.0": + version: 11.12.0 + resolution: "@emotion/babel-plugin@npm:11.12.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.16.7" + "@babel/runtime": "npm:^7.18.3" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/serialize": "npm:^1.2.0" + babel-plugin-macros: "npm:^3.1.0" + convert-source-map: "npm:^1.5.0" + escape-string-regexp: "npm:^4.0.0" + find-root: "npm:^1.1.0" + source-map: "npm:^0.5.7" + stylis: "npm:4.2.0" + checksum: 10c0/930ff6f8768b0c24d05896ad696be20e1c65f32ed61fb5c1488f571120a947ef0a2cf69187b17114cc76e7886f771fac150876ed7b5341324fec2377185d6573 + languageName: node + linkType: hard + +"@emotion/cache@npm:^11.13.0, @emotion/cache@npm:^11.13.1": + version: 11.13.1 + resolution: "@emotion/cache@npm:11.13.1" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.0" + "@emotion/weak-memoize": "npm:^0.4.0" + stylis: "npm:4.2.0" + checksum: 10c0/321e97d8980885737de13b47e41fd4febfbd83086f10c620f865fcbddb29b8fe198adec7e1c69cc7b137638ea9242d7c475c57f954f7ca229157fa92e368f473 + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:^1.1.0, @emotion/is-prop-valid@npm:^1.3.0": version: 1.3.0 resolution: "@emotion/is-prop-valid@npm:1.3.0" dependencies: @@ -2194,6 +3471,80 @@ __metadata: languageName: node linkType: hard +"@emotion/react@npm:^11.13.3": + version: 11.13.3 + resolution: "@emotion/react@npm:11.13.3" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.12.0" + "@emotion/cache": "npm:^11.13.0" + "@emotion/serialize": "npm:^1.3.1" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/utils": "npm:^1.4.0" + "@emotion/weak-memoize": "npm:^0.4.0" + hoist-non-react-statics: "npm:^3.3.1" + peerDependencies: + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/a55e770b9ea35de5d35db05a7ad40a4a3f442809fa8e4fabaf56da63ac9444f09aaf691c4e75a1455dc388991ab0c0ab4e253ce67c5836f27513e45ebd01b673 + languageName: node + linkType: hard + +"@emotion/serialize@npm:^1.2.0, @emotion/serialize@npm:^1.3.0, @emotion/serialize@npm:^1.3.1": + version: 1.3.1 + resolution: "@emotion/serialize@npm:1.3.1" + dependencies: + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.0" + csstype: "npm:^3.0.2" + checksum: 10c0/ac7158e2881b5f3f9ca1e4d865186d38623f997de888675297e0928b202d16273e43b0a19aa021c0b706edefae31118bc97c5fab095820109d09d502dbcf2092 + languageName: node + linkType: hard + +"@emotion/serialize@npm:^1.3.2": + version: 1.3.2 + resolution: "@emotion/serialize@npm:1.3.2" + dependencies: + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.1" + csstype: "npm:^3.0.2" + checksum: 10c0/b4873b643721d28b4450f9d77b71e6c8d0109e6825c54fc79e649d2fa438fe4080d2fa696ec8fda421b8e713fcd42306d6197b6121ddd2486ffab8e4b6311ce0 + languageName: node + linkType: hard + +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: 10c0/3ca72d1650a07d2fbb7e382761b130b4a887dcd04e6574b2d51ce578791240150d7072a9bcb4161933abbcd1e38b243a6fb4464a7fe991d700c17aa66bb5acc7 + languageName: node + linkType: hard + +"@emotion/styled@npm:^11.13.0": + version: 11.13.0 + resolution: "@emotion/styled@npm:11.13.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.12.0" + "@emotion/is-prop-valid": "npm:^1.3.0" + "@emotion/serialize": "npm:^1.3.0" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.1.0" + "@emotion/utils": "npm:^1.4.0" + peerDependencies: + "@emotion/react": ^11.0.0-rc.0 + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/5e2cc85c8a2f6e7bd012731cf0b6da3aef5906225e87e8d4a5c19da50572e24d9aaf92615aa36aa863f0fe6b62a121033356e1cad62617c48bfdaa2c3cf0d8a4 + languageName: node + linkType: hard + "@emotion/stylis@npm:^0.8.4": version: 0.8.5 resolution: "@emotion/stylis@npm:0.8.5" @@ -2201,6 +3552,13 @@ __metadata: languageName: node linkType: hard +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: 10c0/150943192727b7650eb9a6851a98034ddb58a8b6958b37546080f794696141c3760966ac695ab9af97efe10178690987aee4791f9f0ad1ff76783cdca83c1d49 + languageName: node + linkType: hard + "@emotion/unitless@npm:^0.7.4": version: 0.7.5 resolution: "@emotion/unitless@npm:0.7.5" @@ -2208,6 +3566,43 @@ __metadata: languageName: node linkType: hard +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.1.0": + version: 1.1.0 + resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.1.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/a883480f3a7139fb4a43e71d3114ca57e2b7ae5ff204e05cd9e59251a113773b8f64eb75d3997726250aca85eb73447638c8f51930734bdd16b96762b65e58c3 + languageName: node + linkType: hard + +"@emotion/utils@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/utils@npm:1.4.0" + checksum: 10c0/b2ae698d6e935f4961a8349286b5b0a6117a16e179459cbf9c8d97d5daa7d96c99876b950f09b1a793d6b295713b2c8f89544bd8c3f26b8e4db60a218a0d4c42 + languageName: node + linkType: hard + +"@emotion/utils@npm:^1.4.1": + version: 1.4.1 + resolution: "@emotion/utils@npm:1.4.1" + checksum: 10c0/f4704e0bdf48062fd6eb9c64771c88f521aab1e108a48cb23d65b6438597c63a6945301cef4c43611e79e0e76a304ec5481c31025ea8f573d7ad5423d747602c + languageName: node + linkType: hard + +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: 10c0/64376af11f1266042d03b3305c30b7502e6084868e33327e944b539091a472f089db307af69240f7188f8bc6b319276fd7b141a36613f1160d73d12a60f6ca1a + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/aix-ppc64@npm:0.23.1" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-arm64@npm:0.17.19" @@ -2215,6 +3610,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-arm64@npm:0.23.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-arm@npm:0.17.19" @@ -2222,9 +3624,23 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-x64@npm:0.17.19" +"@esbuild/android-arm@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-arm@npm:0.23.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-x64@npm:0.17.19" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-x64@npm:0.23.1" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -2236,6 +3652,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/darwin-arm64@npm:0.23.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/darwin-x64@npm:0.17.19" @@ -2243,6 +3666,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/darwin-x64@npm:0.23.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/freebsd-arm64@npm:0.17.19" @@ -2250,6 +3680,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/freebsd-arm64@npm:0.23.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/freebsd-x64@npm:0.17.19" @@ -2257,6 +3694,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/freebsd-x64@npm:0.23.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-arm64@npm:0.17.19" @@ -2264,6 +3708,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-arm64@npm:0.23.1" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-arm@npm:0.17.19" @@ -2271,6 +3722,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-arm@npm:0.23.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-ia32@npm:0.17.19" @@ -2278,6 +3736,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-ia32@npm:0.23.1" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-loong64@npm:0.17.19" @@ -2285,6 +3750,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-loong64@npm:0.23.1" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-mips64el@npm:0.17.19" @@ -2292,6 +3764,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-mips64el@npm:0.23.1" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-ppc64@npm:0.17.19" @@ -2299,6 +3778,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-ppc64@npm:0.23.1" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-riscv64@npm:0.17.19" @@ -2306,6 +3792,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-riscv64@npm:0.23.1" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-s390x@npm:0.17.19" @@ -2313,6 +3806,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-s390x@npm:0.23.1" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-x64@npm:0.17.19" @@ -2320,6 +3820,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-x64@npm:0.23.1" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/netbsd-x64@npm:0.17.19" @@ -2327,6 +3834,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/netbsd-x64@npm:0.23.1" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/openbsd-arm64@npm:0.23.1" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/openbsd-x64@npm:0.17.19" @@ -2334,6 +3855,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/openbsd-x64@npm:0.23.1" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/sunos-x64@npm:0.17.19" @@ -2341,6 +3869,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/sunos-x64@npm:0.23.1" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-arm64@npm:0.17.19" @@ -2348,6 +3883,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-arm64@npm:0.23.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-ia32@npm:0.17.19" @@ -2355,6 +3897,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-ia32@npm:0.23.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-x64@npm:0.17.19" @@ -2362,6 +3911,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-x64@npm:0.23.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3886,6 +5442,181 @@ __metadata: languageName: node linkType: hard +"@img/sharp-darwin-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-darwin-arm64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-darwin-x64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.0.5": + version: 1.0.5 + resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4": + version: 1.0.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-arm64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-arm@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.0.5" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-s390x@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linux-x64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-wasm32@npm:0.33.5" + dependencies: + "@emnapi/runtime": "npm:^1.2.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-win32-ia32@npm:0.33.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.33.5": + version: 0.33.5 + resolution: "@img/sharp-win32-x64@npm:0.33.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@internationalized/date@npm:^3.0.2": version: 3.0.2 resolution: "@internationalized/date@npm:3.0.2" @@ -4027,6 +5758,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" @@ -4034,7 +5775,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 @@ -4058,7 +5799,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -4249,6 +5990,18 @@ __metadata: languageName: node linkType: hard +"@mdx-js/react@npm:^3.0.0": + version: 3.0.1 + resolution: "@mdx-js/react@npm:3.0.1" + dependencies: + "@types/mdx": "npm:^2.0.0" + peerDependencies: + "@types/react": ">=16" + react: ">=16" + checksum: 10c0/d210d926ef488d39ad65f04d821936b668eadcdde3b6421e94ec4200ca7ad17f17d24c5cbc543882586af9f08b10e2eea715c728ce6277487945e05c5199f532 + languageName: node + linkType: hard + "@messageformat/parser@npm:^5.0.0": version: 5.0.0 resolution: "@messageformat/parser@npm:5.0.0" @@ -4574,13 +6327,156 @@ __metadata: languageName: node linkType: hard -"@motionone/vue@npm:^10.16.2": - version: 10.16.2 - resolution: "@motionone/vue@npm:10.16.2" +"@motionone/vue@npm:^10.16.2": + version: 10.16.2 + resolution: "@motionone/vue@npm:10.16.2" + dependencies: + "@motionone/dom": "npm:^10.16.2" + tslib: "npm:^2.3.1" + checksum: 10c0/f0fd7c46852d9df6f74074bb9d7e65af6947cb1616455c61ffa807d68b003445d168789fa7a8f9d5b74e015b73762f9286cd9f17590f9bdbe41c2cc604f16757 + languageName: node + linkType: hard + +"@mui/core-downloads-tracker@npm:^6.1.4": + version: 6.1.4 + resolution: "@mui/core-downloads-tracker@npm:6.1.4" + checksum: 10c0/bfd84a726c883dd681b2cda13b977eb6646c1da66ea59905dbe7b857ec4ac86576a318eb116d54633e7c479aecb52fe0c75fb957f1b6081a6c8857dd5ce4c5b9 + languageName: node + linkType: hard + +"@mui/material@npm:^6.1.4": + version: 6.1.4 + resolution: "@mui/material@npm:6.1.4" + dependencies: + "@babel/runtime": "npm:^7.25.7" + "@mui/core-downloads-tracker": "npm:^6.1.4" + "@mui/system": "npm:^6.1.4" + "@mui/types": "npm:^7.2.18" + "@mui/utils": "npm:^6.1.4" + "@popperjs/core": "npm:^2.11.8" + "@types/react-transition-group": "npm:^4.4.11" + clsx: "npm:^2.1.1" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + react-is: "npm:^18.3.1" + react-transition-group: "npm:^4.4.5" + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@mui/material-pigment-css": ^6.1.4 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@mui/material-pigment-css": + optional: true + "@types/react": + optional: true + checksum: 10c0/3729e56129b27706ebfab67428035dc7f0136dfd745281b467c7da07e78248cc8e2f36939cd6c33967fd565c5b5eff336629e3f7a2d877e9b176d24df67c9c81 + languageName: node + linkType: hard + +"@mui/private-theming@npm:^6.1.4": + version: 6.1.4 + resolution: "@mui/private-theming@npm:6.1.4" + dependencies: + "@babel/runtime": "npm:^7.25.7" + "@mui/utils": "npm:^6.1.4" + prop-types: "npm:^15.8.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/37c81ca4529afbec2a4710d4dfa1597a5f9a33ff3ae775fa68474f86b223ed4ab953526e49883d77638ad62f0c944716c2b0dc58a105624ca91fe60a633e3b4a + languageName: node + linkType: hard + +"@mui/styled-engine@npm:^6.1.4": + version: 6.1.4 + resolution: "@mui/styled-engine@npm:6.1.4" + dependencies: + "@babel/runtime": "npm:^7.25.7" + "@emotion/cache": "npm:^11.13.1" + "@emotion/serialize": "npm:^1.3.2" + "@emotion/sheet": "npm:^1.4.0" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + peerDependencies: + "@emotion/react": ^11.4.1 + "@emotion/styled": ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + checksum: 10c0/ce8f53a704aa607152ef5ef25d95bdd5c4399f7dbf240acd6e4057c24d84536bb3c884fcb13c5e88d87dbfff42935c82af2e63800ba033ad481847b1967ccf52 + languageName: node + linkType: hard + +"@mui/system@npm:^6.1.4": + version: 6.1.4 + resolution: "@mui/system@npm:6.1.4" + dependencies: + "@babel/runtime": "npm:^7.25.7" + "@mui/private-theming": "npm:^6.1.4" + "@mui/styled-engine": "npm:^6.1.4" + "@mui/types": "npm:^7.2.18" + "@mui/utils": "npm:^6.1.4" + clsx: "npm:^2.1.1" + csstype: "npm:^3.1.3" + prop-types: "npm:^15.8.1" + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@types/react": + optional: true + checksum: 10c0/766f1c695254df54b06de1af231cdf30752f71a79181edd4c24044405144b7a72c4c23248155f4041999993aa4f568878eccd130c100b4b332e7dd6b322dfd75 + languageName: node + linkType: hard + +"@mui/types@npm:^7.2.18": + version: 7.2.18 + resolution: "@mui/types@npm:7.2.18" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/338404bdef7c7f9ebcd389ebbf429c44d2cc9c25c65d8669dc900a24b2c8718240482273bf6cd953578965e3838ad40a8e7376c71d3d9146be3afb88bff1b67a + languageName: node + linkType: hard + +"@mui/utils@npm:^6.1.4": + version: 6.1.4 + resolution: "@mui/utils@npm:6.1.4" dependencies: - "@motionone/dom": "npm:^10.16.2" - tslib: "npm:^2.3.1" - checksum: 10c0/f0fd7c46852d9df6f74074bb9d7e65af6947cb1616455c61ffa807d68b003445d168789fa7a8f9d5b74e015b73762f9286cd9f17590f9bdbe41c2cc604f16757 + "@babel/runtime": "npm:^7.25.7" + "@mui/types": "npm:^7.2.18" + "@types/prop-types": "npm:^15.7.13" + clsx: "npm:^2.1.1" + prop-types: "npm:^15.8.1" + react-is: "npm:^18.3.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/cac4f05904897c28444e7ef2a6891678d36c0a8fae921ccacebcd7b53da99e4c6cab05669328fdabff624313de68f1b5bcd427cba36024b6c3505b5ee945eb05 languageName: node linkType: hard @@ -5190,6 +7086,43 @@ __metadata: languageName: node linkType: hard +"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.11": + version: 0.5.15 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.15" + dependencies: + ansi-html: "npm:^0.0.9" + core-js-pure: "npm:^3.23.3" + error-stack-parser: "npm:^2.0.6" + html-entities: "npm:^2.1.0" + loader-utils: "npm:^2.0.4" + schema-utils: "npm:^4.2.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@types/webpack": 4.x || 5.x + react-refresh: ">=0.10.0 <1.0.0" + sockjs-client: ^1.4.0 + type-fest: ">=0.17.0 <5.0.0" + webpack: ">=4.43.0 <6.0.0" + webpack-dev-server: 3.x || 4.x || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + "@types/webpack": + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + checksum: 10c0/ba310aa4d53070f59c8a374d1d256c5965c044c0c3fb1ff6b55353fb5e86de08a490a7bd59a31f0d4951f8f29f81864c7df224fe1342543a95d048b7413ff171 + languageName: node + linkType: hard + "@polka/url@npm:^1.0.0-next.20": version: 1.0.0-next.21 resolution: "@polka/url@npm:1.0.0-next.21" @@ -5197,6 +7130,13 @@ __metadata: languageName: node linkType: hard +"@popperjs/core@npm:^2.11.8": + version: 2.11.8 + resolution: "@popperjs/core@npm:2.11.8" + checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 + languageName: node + linkType: hard + "@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": version: 1.1.2 resolution: "@protobufjs/aspromise@npm:1.1.2" @@ -7006,126 +8946,670 @@ __metadata: languageName: node linkType: hard -"@stablelib/constant-time@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/constant-time@npm:1.0.1" - checksum: 10c0/694a282441215735a1fdfa3d06db5a28ba92423890967a154514ef28e0d0298ce7b6a2bc65ebc4273573d6669a6b601d330614747aa2e69078c1d523d7069e12 +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: 10c0/694a282441215735a1fdfa3d06db5a28ba92423890967a154514ef28e0d0298ce7b6a2bc65ebc4273573d6669a6b601d330614747aa2e69078c1d523d7069e12 + languageName: node + linkType: hard + +"@stablelib/ed25519@npm:^1.0.2": + version: 1.0.3 + resolution: "@stablelib/ed25519@npm:1.0.3" + dependencies: + "@stablelib/random": "npm:^1.0.2" + "@stablelib/sha512": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/b4a05e3c24dabd8a9e0b5bd72dea761bfb4b5c66404308e9f0529ef898e75d6f588234920762d5372cb920d9d47811250160109f02d04b6eed53835fb6916eb9 + languageName: node + linkType: hard + +"@stablelib/hash@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hash@npm:1.0.1" + checksum: 10c0/58b5572a4067820b77a1606ed2d4a6dc4068c5475f68ba0918860a5f45adf60b33024a0cea9532dcd8b7345c53b3c9636a23723f5f8ae83e0c3648f91fb5b5cc + languageName: node + linkType: hard + +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/hmac": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/722d30e36afa8029fda2a9e8c65ad753deff92a234e708820f9fd39309d2494e1c035a4185f29ae8d7fbf8a74862b27128c66a1fb4bd7a792bd300190080dbe9 + languageName: node + linkType: hard + +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" + dependencies: + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/a111d5e687966b62c81f7dbd390f13582b027edee9bd39df6474a6472e5ad89d705e735af32bae2c9280a205806649f54b5ff8c4e8c8a7b484083a35b257e9e6 + languageName: node + linkType: hard + +"@stablelib/int@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/int@npm:1.0.1" + checksum: 10c0/e1a6a7792fc2146d65de56e4ef42e8bc385dd5157eff27019b84476f564a1a6c43413235ed0e9f7c9bb8907dbdab24679467aeb10f44c92e6b944bcd864a7ee0 + languageName: node + linkType: hard + +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": "npm:^1.0.1" + checksum: 10c0/18c9e09772a058edee265c65992ec37abe4ab5118171958972e28f3bbac7f2a0afa6aaf152ec1d785452477bdab5366b3f5b750e8982ae9ad090f5fa2e5269ba + languageName: node + linkType: hard + +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" + dependencies: + "@stablelib/constant-time": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/080185ffa92f5111e6ecfeab7919368b9984c26d048b9c09a111fbc657ea62bb5dfe6b56245e1804ce692a445cc93ab6625936515fa0e7518b8f2d86feda9630 + languageName: node + linkType: hard + +"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/ebb217cfb76db97d98ec07bd7ce03a650fa194b91f0cb12382738161adff1830f405de0e9bad22bbc352422339ff85f531873b6a874c26ea9b59cfcc7ea787e0 + languageName: node + linkType: hard + +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/e29ee9bc76eece4345e9155ce4bdeeb1df8652296be72bd2760523ad565e3b99dca85b81db3b75ee20b34837077eb8542ca88f153f162154c62ba1f75aecc24a + languageName: node + linkType: hard + +"@stablelib/sha512@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha512@npm:1.0.1" + dependencies: + "@stablelib/binary": "npm:^1.0.1" + "@stablelib/hash": "npm:^1.0.1" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/84549070a383f4daf23d9065230eb81bc8f590c68bf5f7968f1b78901236b3bb387c14f63773dc6c3dc78e823b1c15470d2a04d398a2506391f466c16ba29b58 + languageName: node + linkType: hard + +"@stablelib/wipe@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/wipe@npm:1.0.1" + checksum: 10c0/c5a54f769c286a5b3ecff979471dfccd4311f2e84a959908e8c0e3aa4eed1364bd9707f7b69d1384b757e62cc295c221fa27286c7f782410eb8a690f30cfd796 + languageName: node + linkType: hard + +"@stablelib/x25519@npm:1.0.3, @stablelib/x25519@npm:^1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": "npm:^1.0.1" + "@stablelib/random": "npm:^1.0.2" + "@stablelib/wipe": "npm:^1.0.1" + checksum: 10c0/d8afe8a120923a434359d7d1c6759780426fed117a84a6c0f84d1a4878834cb4c2d7da78a1fa7cf227ce3924fdc300cd6ed6e46cf2508bf17b1545c319ab8418 + languageName: node + linkType: hard + +"@storybook/addon-a11y@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-a11y@npm:8.3.5" + dependencies: + "@storybook/addon-highlight": "npm:8.3.5" + axe-core: "npm:^4.2.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/ecc99c83b69e72ea38db5ce844c77d8ef01b06c52770429ba933490f5625291d373a269fc8e2371430e73f06afdbd083ca6a110ac2177f5df2cd2cf311c96d87 + languageName: node + linkType: hard + +"@storybook/addon-actions@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-actions@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + "@types/uuid": "npm:^9.0.1" + dequal: "npm:^2.0.2" + polished: "npm:^4.2.2" + uuid: "npm:^9.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/c9872d9d41b33ae26be36dfb25ccb10e7c832d4677cffe4f3e8a42f2748d8c54e681810662b88e10d1e72223096ad1861e389ee7134974e9f3e2869958300e08 + languageName: node + linkType: hard + +"@storybook/addon-backgrounds@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-backgrounds@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + memoizerific: "npm:^1.11.3" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/6a2ce804bd96827a0601b53ea1f15bec382e1099cf957a0ac3c9452da1a58702fb5cea4b76c564a78a3a4f66431eaf3d826ad400d3bd579fec94ec266f06e211 + languageName: node + linkType: hard + +"@storybook/addon-controls@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-controls@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + dequal: "npm:^2.0.2" + lodash: "npm:^4.17.21" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/f0bf85a8f401649734ae63ece9b64fe77b10a290cd1e83f54d83da4ae58f5a3a9e3876497f8cb3e9ac12dd1814fe7d16cee88bd6985877422823965b20607385 + languageName: node + linkType: hard + +"@storybook/addon-docs@npm:8.3.5, @storybook/addon-docs@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-docs@npm:8.3.5" + dependencies: + "@mdx-js/react": "npm:^3.0.0" + "@storybook/blocks": "npm:8.3.5" + "@storybook/csf-plugin": "npm:8.3.5" + "@storybook/global": "npm:^5.0.0" + "@storybook/react-dom-shim": "npm:8.3.5" + "@types/react": "npm:^16.8.0 || ^17.0.0 || ^18.0.0" + fs-extra: "npm:^11.1.0" + react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0" + react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0" + rehype-external-links: "npm:^3.0.0" + rehype-slug: "npm:^6.0.0" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/51f277079397ecc0e5fef721307a618e3aa4727069dba2b331cb4de2e6e318f4de338132e1ea886c0e9ee0824a10cbc9a0887e0f09f341221a31a09111ce4836 + languageName: node + linkType: hard + +"@storybook/addon-essentials@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-essentials@npm:8.3.5" + dependencies: + "@storybook/addon-actions": "npm:8.3.5" + "@storybook/addon-backgrounds": "npm:8.3.5" + "@storybook/addon-controls": "npm:8.3.5" + "@storybook/addon-docs": "npm:8.3.5" + "@storybook/addon-highlight": "npm:8.3.5" + "@storybook/addon-measure": "npm:8.3.5" + "@storybook/addon-outline": "npm:8.3.5" + "@storybook/addon-toolbars": "npm:8.3.5" + "@storybook/addon-viewport": "npm:8.3.5" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/dad5ec31342abafe93eefa10178278f2f3cb8f849824050cf9248ff976188fda9bdc167750a57c57f0f821a56dd46daef92e70816a62b3cba435484f263fb703 + languageName: node + linkType: hard + +"@storybook/addon-highlight@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-highlight@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/9bd4d29d10d612aa6baf2a3c470fd571f32edd4d456e3c4eb0dfe416be7891b075f06a7f46da35274c58261db8be5e97d974edec3c11b477f1cc397b357a42ca + languageName: node + linkType: hard + +"@storybook/addon-interactions@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-interactions@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + "@storybook/instrumenter": "npm:8.3.5" + "@storybook/test": "npm:8.3.5" + polished: "npm:^4.2.2" + ts-dedent: "npm:^2.2.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/66aef03bdaee184911db0ddd212ef5c87f30d985d363b65085a88d19aa0304feb2753f342338f7b675463405ddfd0f6c7938ec62acdad5bbcd43af3173738932 + languageName: node + linkType: hard + +"@storybook/addon-measure@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-measure@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + tiny-invariant: "npm:^1.3.1" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/49a8f2fac76a65fc2b4fdf6c90a4996e58cccf4a3db56a7f32a17eff2a34ebeccf7ad8042a3bd3b1e8deba1d9ba95ce95f8ee57f11a98de51ce6fc29b2a127b4 + languageName: node + linkType: hard + +"@storybook/addon-outline@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-outline@npm:8.3.5" + dependencies: + "@storybook/global": "npm:^5.0.0" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/d1d4d734e1770aa4af8fba2d789ad5c570ae0eb66301d8c5444a92a07428f66cde4a32e48fc1ea8627801c7d5c99ae40563554eef7f1a5ad14e4144ee74f9726 + languageName: node + linkType: hard + +"@storybook/addon-themes@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-themes@npm:8.3.5" + dependencies: + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/f64ebbe0d6bbb2b60826a9f24aca223aef8a9c61f3b65b8ade10af6a32145838ee47987f8e467a75f31fe3690d217e83782fe2da1e1586d6e6c8436c66465038 + languageName: node + linkType: hard + +"@storybook/addon-toolbars@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-toolbars@npm:8.3.5" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/1e198ab1c87204f3ed69493484e94e6ad6bd4ed3c5a164ceeb0719cf2ddf96159d0fc481584c413d0bf3ff3943196ca123888ac67b0dbf967195d024387de84e + languageName: node + linkType: hard + +"@storybook/addon-viewport@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/addon-viewport@npm:8.3.5" + dependencies: + memoizerific: "npm:^1.11.3" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/26e02754694d3422c19383ca330eb541394e54151e6c3d86865cbedcf49a323820b649e837e47ef94ea310c80ca47b9baa56fadee3a02db31bce5eaae6f43674 + languageName: node + linkType: hard + +"@storybook/blocks@npm:8.3.5, @storybook/blocks@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/blocks@npm:8.3.5" + dependencies: + "@storybook/csf": "npm:^0.1.11" + "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.10" + "@types/lodash": "npm:^4.14.167" + color-convert: "npm:^2.0.1" + dequal: "npm:^2.0.2" + lodash: "npm:^4.17.21" + markdown-to-jsx: "npm:^7.4.5" + memoizerific: "npm:^1.11.3" + polished: "npm:^4.2.2" + react-colorful: "npm:^5.1.2" + telejson: "npm:^7.2.0" + ts-dedent: "npm:^2.0.0" + util-deprecate: "npm:^1.0.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10c0/8b4d4b7761ff32de02c231231ef49457f96438916c9f5e2af6eebd90842a7de1f26781a768f5f2b080abd26c8da66c1fca60d304a87f530216eb01d6434e7ff9 + languageName: node + linkType: hard + +"@storybook/builder-webpack5@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/builder-webpack5@npm:8.3.5" + dependencies: + "@storybook/core-webpack": "npm:8.3.5" + "@types/node": "npm:^22.0.0" + "@types/semver": "npm:^7.3.4" + browser-assert: "npm:^1.2.1" + case-sensitive-paths-webpack-plugin: "npm:^2.4.0" + cjs-module-lexer: "npm:^1.2.3" + constants-browserify: "npm:^1.0.0" + css-loader: "npm:^6.7.1" + es-module-lexer: "npm:^1.5.0" + express: "npm:^4.19.2" + fork-ts-checker-webpack-plugin: "npm:^8.0.0" + fs-extra: "npm:^11.1.0" + html-webpack-plugin: "npm:^5.5.0" + magic-string: "npm:^0.30.5" + path-browserify: "npm:^1.0.1" + process: "npm:^0.11.10" + semver: "npm:^7.3.7" + style-loader: "npm:^3.3.1" + terser-webpack-plugin: "npm:^5.3.1" + ts-dedent: "npm:^2.0.0" + url: "npm:^0.11.0" + util: "npm:^0.12.4" + util-deprecate: "npm:^1.0.2" + webpack: "npm:5" + webpack-dev-middleware: "npm:^6.1.2" + webpack-hot-middleware: "npm:^2.25.1" + webpack-virtual-modules: "npm:^0.6.0" + peerDependencies: + storybook: ^8.3.5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/03c2e8ff9e8a85ed1064ec0514a48bd3ede92872f9bc867d961049638ec8884a0fd341993214136ccfeddbb280ca397bba42379c2fddaac7eb3d8a007d25c6bf + languageName: node + linkType: hard + +"@storybook/components@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/components@npm:8.3.5" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/20b3217f1a0a48ab5a40c08960d966be1fc6842dd40fc9951328d9bdc76411e3d3820865fd93895eeccec718ef8c8512f19d1fcad9bdd2cb6a792f92ca4d73ce + languageName: node + linkType: hard + +"@storybook/core-webpack@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/core-webpack@npm:8.3.5" + dependencies: + "@types/node": "npm:^22.0.0" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/d9311fc697485b70e7e4b473a9fa496f4bde7fe5242a889c080167d19ea53b07beab1e6458b6133f360f2c5e68b7e1dee9fcdd41dff5364ebf97b5c567f0c40b + languageName: node + linkType: hard + +"@storybook/core@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/core@npm:8.3.5" + dependencies: + "@storybook/csf": "npm:^0.1.11" + "@types/express": "npm:^4.17.21" + better-opn: "npm:^3.0.2" + browser-assert: "npm:^1.2.1" + esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0" + esbuild-register: "npm:^3.5.0" + express: "npm:^4.19.2" + jsdoc-type-pratt-parser: "npm:^4.0.0" + process: "npm:^0.11.10" + recast: "npm:^0.23.5" + semver: "npm:^7.6.2" + util: "npm:^0.12.5" + ws: "npm:^8.2.3" + checksum: 10c0/f01d13c2309af518f1d029d27a3dd1ce80ea7423c9d4927d1096634a84887051c3581404971499ab81e5b28acca517bf1b31a3281fe7fdb0b418f0c45767f16f + languageName: node + linkType: hard + +"@storybook/csf-plugin@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/csf-plugin@npm:8.3.5" + dependencies: + unplugin: "npm:^1.3.1" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/528af7509500afe1baf446fb8d52978c71d18df0abafd27a81ab821977cfb211bb02190f5a7d09005c4c10dac5e91ef978e35c74ee477ed7d6e45583ebc8412d + languageName: node + linkType: hard + +"@storybook/csf@npm:^0.1.11": + version: 0.1.11 + resolution: "@storybook/csf@npm:0.1.11" + dependencies: + type-fest: "npm:^2.19.0" + checksum: 10c0/c5329fc13e7d762049b5c91df1bc1c0e510a1a898c401b72b68f1ff64139a85ab64a92f8e681d2fcb226c0a4a55d0f23b569b2bdb517e0f067bd05ea46228356 languageName: node linkType: hard -"@stablelib/ed25519@npm:^1.0.2": - version: 1.0.3 - resolution: "@stablelib/ed25519@npm:1.0.3" - dependencies: - "@stablelib/random": "npm:^1.0.2" - "@stablelib/sha512": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/b4a05e3c24dabd8a9e0b5bd72dea761bfb4b5c66404308e9f0529ef898e75d6f588234920762d5372cb920d9d47811250160109f02d04b6eed53835fb6916eb9 +"@storybook/global@npm:^5.0.0": + version: 5.0.0 + resolution: "@storybook/global@npm:5.0.0" + checksum: 10c0/8f1b61dcdd3a89584540896e659af2ecc700bc740c16909a7be24ac19127ea213324de144a141f7caf8affaed017d064fea0618d453afbe027cf60f54b4a6d0b languageName: node linkType: hard -"@stablelib/hash@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/hash@npm:1.0.1" - checksum: 10c0/58b5572a4067820b77a1606ed2d4a6dc4068c5475f68ba0918860a5f45adf60b33024a0cea9532dcd8b7345c53b3c9636a23723f5f8ae83e0c3648f91fb5b5cc +"@storybook/icons@npm:^1.2.10": + version: 1.2.12 + resolution: "@storybook/icons@npm:1.2.12" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/97f6a7b7841fb5a0d1c8a30c36173469e7b0814a674c8103c7c0fd8803f0f7c2a778545af864012d40883195a533534dbc98541deac2bafe31e6a3fe37fdfc66 languageName: node linkType: hard -"@stablelib/hkdf@npm:1.0.1": - version: 1.0.1 - resolution: "@stablelib/hkdf@npm:1.0.1" +"@storybook/instrumenter@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/instrumenter@npm:8.3.5" dependencies: - "@stablelib/hash": "npm:^1.0.1" - "@stablelib/hmac": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/722d30e36afa8029fda2a9e8c65ad753deff92a234e708820f9fd39309d2494e1c035a4185f29ae8d7fbf8a74862b27128c66a1fb4bd7a792bd300190080dbe9 + "@storybook/global": "npm:^5.0.0" + "@vitest/utils": "npm:^2.0.5" + util: "npm:^0.12.4" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/9dd4e9080591200aa410ae9f7c132b466173a4fc882ad78e06fdbe8d795b04cee3afc5b1385ecb3ff5b9fb314abc3da2ac1494a8bf815e1113c3e8a241c5b7b7 languageName: node linkType: hard -"@stablelib/hmac@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/hmac@npm:1.0.1" - dependencies: - "@stablelib/constant-time": "npm:^1.0.1" - "@stablelib/hash": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/a111d5e687966b62c81f7dbd390f13582b027edee9bd39df6474a6472e5ad89d705e735af32bae2c9280a205806649f54b5ff8c4e8c8a7b484083a35b257e9e6 +"@storybook/manager-api@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/manager-api@npm:8.3.5" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/4983af0e3a05abec0114acfa8bfe9d5df816b91f76614eb3c37dd654a0d4fdf5379d4d0cffc1676c6681d6142acd44e81abcb7c4f6de6108c8d26158cca9820d languageName: node linkType: hard -"@stablelib/int@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/int@npm:1.0.1" - checksum: 10c0/e1a6a7792fc2146d65de56e4ef42e8bc385dd5157eff27019b84476f564a1a6c43413235ed0e9f7c9bb8907dbdab24679467aeb10f44c92e6b944bcd864a7ee0 +"@storybook/nextjs@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/nextjs@npm:8.3.5" + dependencies: + "@babel/core": "npm:^7.24.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-import-assertions": "npm:^7.24.1" + "@babel/plugin-transform-class-properties": "npm:^7.24.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1" + "@babel/plugin-transform-runtime": "npm:^7.24.3" + "@babel/preset-env": "npm:^7.24.4" + "@babel/preset-react": "npm:^7.24.1" + "@babel/preset-typescript": "npm:^7.24.1" + "@babel/runtime": "npm:^7.24.4" + "@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.11" + "@storybook/builder-webpack5": "npm:8.3.5" + "@storybook/preset-react-webpack": "npm:8.3.5" + "@storybook/react": "npm:8.3.5" + "@storybook/test": "npm:8.3.5" + "@types/node": "npm:^22.0.0" + "@types/semver": "npm:^7.3.4" + babel-loader: "npm:^9.1.3" + css-loader: "npm:^6.7.3" + find-up: "npm:^5.0.0" + fs-extra: "npm:^11.1.0" + image-size: "npm:^1.0.0" + loader-utils: "npm:^3.2.1" + node-polyfill-webpack-plugin: "npm:^2.0.1" + pnp-webpack-plugin: "npm:^1.7.0" + postcss: "npm:^8.4.38" + postcss-loader: "npm:^8.1.1" + react-refresh: "npm:^0.14.0" + resolve-url-loader: "npm:^5.0.0" + sass-loader: "npm:^13.2.0" + semver: "npm:^7.3.5" + sharp: "npm:^0.33.3" + style-loader: "npm:^3.3.1" + styled-jsx: "npm:^5.1.6" + ts-dedent: "npm:^2.0.0" + tsconfig-paths: "npm:^4.0.0" + tsconfig-paths-webpack-plugin: "npm:^4.0.1" + peerDependencies: + next: ^13.5.0 || ^14.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + webpack: ^5.0.0 + dependenciesMeta: + sharp: + optional: true + peerDependenciesMeta: + typescript: + optional: true + webpack: + optional: true + checksum: 10c0/7b8d53380476f292dcc7c88b305f947eb0108aac70e24f66d06d060078444264d3e6e9ca362afb344081e196cd3baa24d184286b9e82db3144b79e326495ae7f languageName: node linkType: hard -"@stablelib/keyagreement@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/keyagreement@npm:1.0.1" +"@storybook/preset-react-webpack@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/preset-react-webpack@npm:8.3.5" dependencies: - "@stablelib/bytes": "npm:^1.0.1" - checksum: 10c0/18c9e09772a058edee265c65992ec37abe4ab5118171958972e28f3bbac7f2a0afa6aaf152ec1d785452477bdab5366b3f5b750e8982ae9ad090f5fa2e5269ba + "@storybook/core-webpack": "npm:8.3.5" + "@storybook/react": "npm:8.3.5" + "@storybook/react-docgen-typescript-plugin": "npm:1.0.6--canary.9.0c3f3b7.0" + "@types/node": "npm:^22.0.0" + "@types/semver": "npm:^7.3.4" + find-up: "npm:^5.0.0" + fs-extra: "npm:^11.1.0" + magic-string: "npm:^0.30.5" + react-docgen: "npm:^7.0.0" + resolve: "npm:^1.22.8" + semver: "npm:^7.3.7" + tsconfig-paths: "npm:^4.2.0" + webpack: "npm:5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9f7b1748e00e7ebd6e20618a4e44b524977e8b6f36aa16ed9e937b3941930ef24e90f5f50cea339018276312d053549bef92845bc03f27a11de6eced55e52b1f languageName: node linkType: hard -"@stablelib/poly1305@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/poly1305@npm:1.0.1" - dependencies: - "@stablelib/constant-time": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/080185ffa92f5111e6ecfeab7919368b9984c26d048b9c09a111fbc657ea62bb5dfe6b56245e1804ce692a445cc93ab6625936515fa0e7518b8f2d86feda9630 +"@storybook/preview-api@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/preview-api@npm:8.3.5" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/12d81d57c0931983428b8621311de79a3846ec0f1c51ab94c5a9e7795a1e4bade74aa62de3693c488001630403c98a5372caca4be613f6f806e7265afb22e3d7 languageName: node linkType: hard -"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": - version: 1.0.2 - resolution: "@stablelib/random@npm:1.0.2" +"@storybook/react-docgen-typescript-plugin@npm:1.0.6--canary.9.0c3f3b7.0": + version: 1.0.6--canary.9.0c3f3b7.0 + resolution: "@storybook/react-docgen-typescript-plugin@npm:1.0.6--canary.9.0c3f3b7.0" dependencies: - "@stablelib/binary": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/ebb217cfb76db97d98ec07bd7ce03a650fa194b91f0cb12382738161adff1830f405de0e9bad22bbc352422339ff85f531873b6a874c26ea9b59cfcc7ea787e0 + debug: "npm:^4.1.1" + endent: "npm:^2.0.1" + find-cache-dir: "npm:^3.3.1" + flat-cache: "npm:^3.0.4" + micromatch: "npm:^4.0.2" + react-docgen-typescript: "npm:^2.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + typescript: ">= 4.x" + webpack: ">= 4" + checksum: 10c0/505a728f36df3f519f4985bdf18f2078ea18a1a8f7f837fc831f971363fb7643a182f01a6857a9729ac5a1246d370526fca5a19017f82e7493af4ca945cb7235 languageName: node linkType: hard -"@stablelib/sha256@npm:1.0.1": - version: 1.0.1 - resolution: "@stablelib/sha256@npm:1.0.1" - dependencies: - "@stablelib/binary": "npm:^1.0.1" - "@stablelib/hash": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/e29ee9bc76eece4345e9155ce4bdeeb1df8652296be72bd2760523ad565e3b99dca85b81db3b75ee20b34837077eb8542ca88f153f162154c62ba1f75aecc24a +"@storybook/react-dom-shim@npm:8.3.5": + version: 8.3.5 + resolution: "@storybook/react-dom-shim@npm:8.3.5" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + checksum: 10c0/a765dc358ae2b1775197aa540024ff8f999c4d1673e76f632b74edd62bb609c8405f4ddfd392923ee6190bf0a1506a473cf41202323d8bda77b20681dc5a1594 languageName: node linkType: hard -"@stablelib/sha512@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/sha512@npm:1.0.1" +"@storybook/react@npm:8.3.5, @storybook/react@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/react@npm:8.3.5" dependencies: - "@stablelib/binary": "npm:^1.0.1" - "@stablelib/hash": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/84549070a383f4daf23d9065230eb81bc8f590c68bf5f7968f1b78901236b3bb387c14f63773dc6c3dc78e823b1c15470d2a04d398a2506391f466c16ba29b58 + "@storybook/components": "npm:^8.3.5" + "@storybook/global": "npm:^5.0.0" + "@storybook/manager-api": "npm:^8.3.5" + "@storybook/preview-api": "npm:^8.3.5" + "@storybook/react-dom-shim": "npm:8.3.5" + "@storybook/theming": "npm:^8.3.5" + "@types/escodegen": "npm:^0.0.6" + "@types/estree": "npm:^0.0.51" + "@types/node": "npm:^22.0.0" + acorn: "npm:^7.4.1" + acorn-jsx: "npm:^5.3.1" + acorn-walk: "npm:^7.2.0" + escodegen: "npm:^2.1.0" + html-tags: "npm:^3.1.0" + prop-types: "npm:^15.7.2" + react-element-to-jsx-string: "npm:^15.0.0" + semver: "npm:^7.3.7" + ts-dedent: "npm:^2.0.0" + type-fest: "npm:~2.19" + util-deprecate: "npm:^1.0.2" + peerDependencies: + "@storybook/test": 8.3.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.3.5 + typescript: ">= 4.2.x" + peerDependenciesMeta: + "@storybook/test": + optional: true + typescript: + optional: true + checksum: 10c0/2db9aa673be975018c9a44cc4c0c662439a85298a4d931afe63bf4e1ca6f7ab6889eddf6d64a555483af84ccc65b3d81b712c2231096124063cf5afa77fcbb6d languageName: node linkType: hard -"@stablelib/wipe@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/wipe@npm:1.0.1" - checksum: 10c0/c5a54f769c286a5b3ecff979471dfccd4311f2e84a959908e8c0e3aa4eed1364bd9707f7b69d1384b757e62cc295c221fa27286c7f782410eb8a690f30cfd796 +"@storybook/test@npm:8.3.5, @storybook/test@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/test@npm:8.3.5" + dependencies: + "@storybook/csf": "npm:^0.1.11" + "@storybook/global": "npm:^5.0.0" + "@storybook/instrumenter": "npm:8.3.5" + "@testing-library/dom": "npm:10.4.0" + "@testing-library/jest-dom": "npm:6.5.0" + "@testing-library/user-event": "npm:14.5.2" + "@vitest/expect": "npm:2.0.5" + "@vitest/spy": "npm:2.0.5" + util: "npm:^0.12.4" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/1890aeab0b10d08f6b6bbaf68defaa2a0794e17e8f43ac3d92c3873d34771e198d088a2f4c0b135a299fe586407c4315cd443e270afa65d84914fcc5d63ea099 languageName: node linkType: hard -"@stablelib/x25519@npm:1.0.3, @stablelib/x25519@npm:^1.0.3": - version: 1.0.3 - resolution: "@stablelib/x25519@npm:1.0.3" - dependencies: - "@stablelib/keyagreement": "npm:^1.0.1" - "@stablelib/random": "npm:^1.0.2" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10c0/d8afe8a120923a434359d7d1c6759780426fed117a84a6c0f84d1a4878834cb4c2d7da78a1fa7cf227ce3924fdc300cd6ed6e46cf2508bf17b1545c319ab8418 +"@storybook/theming@npm:^8.3.5": + version: 8.3.5 + resolution: "@storybook/theming@npm:8.3.5" + peerDependencies: + storybook: ^8.3.5 + checksum: 10c0/25455033b2b3bdb86083f759df77df42bfff71405c6abd301963dd7596003b462a0960a86c5cec3503dc9e1eba565eeb82a897002c6823f9ee361155b9ddfd23 languageName: node linkType: hard @@ -7389,6 +9873,46 @@ __metadata: languageName: node linkType: hard +"@testing-library/dom@npm:10.4.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f + languageName: node + linkType: hard + +"@testing-library/jest-dom@npm:6.5.0": + version: 6.5.0 + resolution: "@testing-library/jest-dom@npm:6.5.0" + dependencies: + "@adobe/css-tools": "npm:^4.4.0" + aria-query: "npm:^5.0.0" + chalk: "npm:^3.0.0" + css.escape: "npm:^1.5.1" + dom-accessibility-api: "npm:^0.6.3" + lodash: "npm:^4.17.21" + redent: "npm:^3.0.0" + checksum: 10c0/fd5936a547f04608d8de15a7de3ae26516f21023f8f45169b10c8c8847015fd20ec259b7309f08aa1031bcbc37c6e5e6f532d1bb85ef8f91bad654193ec66a4c + languageName: node + linkType: hard + +"@testing-library/user-event@npm:14.5.2": + version: 14.5.2 + resolution: "@testing-library/user-event@npm:14.5.2" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10c0/68a0c2aa28a3c8e6eb05cafee29705438d7d8a9427423ce5064d44f19c29e89b5636de46dd2f28620fb10abba75c67130185bbc3aa23ac1163a227a5f36641e1 + languageName: node + linkType: hard + "@toruslabs/http-helpers@npm:^4.0.0": version: 4.0.0 resolution: "@toruslabs/http-helpers@npm:4.0.0" @@ -7649,6 +10173,54 @@ __metadata: languageName: node linkType: hard +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: 10c0/dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.18.0": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.18.0": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 + languageName: node + linkType: hard + "@types/bn.js@npm:5.1.0, @types/bn.js@npm:^5.1.0": version: 5.1.0 resolution: "@types/bn.js@npm:5.1.0" @@ -7667,6 +10239,16 @@ __metadata: languageName: node linkType: hard +"@types/body-parser@npm:*": + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df + languageName: node + linkType: hard + "@types/carbon__icons-react@npm:11.16.0": version: 11.16.0 resolution: "@types/carbon__icons-react@npm:11.16.0" @@ -7674,6 +10256,15 @@ __metadata: languageName: node linkType: hard +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + languageName: node + linkType: hard + "@types/connect@npm:^3.4.33": version: 3.4.35 resolution: "@types/connect@npm:3.4.35" @@ -7779,6 +10370,13 @@ __metadata: languageName: node linkType: hard +"@types/doctrine@npm:^0.0.9": + version: 0.0.9 + resolution: "@types/doctrine@npm:0.0.9" + checksum: 10c0/cdaca493f13c321cf0cacd1973efc0ae74569633145d9e6fc1128f32217a6968c33bea1f858275239fe90c98f3be57ec8f452b416a9ff48b8e8c1098b20fa51c + languageName: node + linkType: hard + "@types/dom-screen-wake-lock@npm:^1.0.0": version: 1.0.3 resolution: "@types/dom-screen-wake-lock@npm:1.0.3" @@ -7786,6 +10384,13 @@ __metadata: languageName: node linkType: hard +"@types/escodegen@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/escodegen@npm:0.0.6" + checksum: 10c0/bbef189319c7b0386486bc7224369f118c7aedf35cc13e40ae5879b9ab4f848936f31e8eea50e71d4de72d4b7a77d9e6e9e5ceec4406c648fbc0077ede634ed5 + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.3": version: 3.7.4 resolution: "@types/eslint-scope@npm:3.7.4" @@ -7813,6 +10418,53 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^0.0.51": + version: 0.0.51 + resolution: "@types/estree@npm:0.0.51" + checksum: 10c0/a70c60d5e634e752fcd45b58c9c046ef22ad59ede4bc93ad5193c7e3b736ebd6bcd788ade59d9c3b7da6eeb0939235f011d4c59bb4fc04d8c346b76035099dd1 + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.5": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.5 + resolution: "@types/express-serve-static-core@npm:4.19.5" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/ba8d8d976ab797b2602c60e728802ff0c98a00f13d420d82770f3661b67fa36ea9d3be0b94f2ddd632afe1fbc6e41620008b01db7e4fabdd71a2beb5539b0725 + languageName: node + linkType: hard + +"@types/express@npm:^4.17.21": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf + languageName: node + linkType: hard + +"@types/hast@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 + languageName: node + linkType: hard + "@types/hoist-non-react-statics@npm:*": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" @@ -7823,6 +10475,20 @@ __metadata: languageName: node linkType: hard +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: 10c0/a62fb8588e2f3818d82a2d7b953ad60a4a52fd767ae04671de1c16f5788bd72f1ed3a6109ed63fd190c06a37d919e3c39d8adbc1793a005def76c15a3f5f5dab + languageName: node + linkType: hard + +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": version: 2.0.3 resolution: "@types/istanbul-lib-coverage@npm:2.0.3" @@ -7855,6 +10521,13 @@ __metadata: languageName: node linkType: hard +"@types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -7869,6 +10542,13 @@ __metadata: languageName: node linkType: hard +"@types/lodash@npm:^4.14.167": + version: 4.17.7 + resolution: "@types/lodash@npm:4.17.7" + checksum: 10c0/40c965b5ffdcf7ff5c9105307ee08b782da228c01b5c0529122c554c64f6b7168fc8f11dc79aa7bae4e67e17efafaba685dc3a47e294dbf52a65ed2b67100561 + languageName: node + linkType: hard + "@types/lru-cache@npm:^5.1.0": version: 5.1.1 resolution: "@types/lru-cache@npm:5.1.1" @@ -7876,6 +10556,20 @@ __metadata: languageName: node linkType: hard +"@types/mdx@npm:^2.0.0": + version: 2.0.13 + resolution: "@types/mdx@npm:2.0.13" + checksum: 10c0/5edf1099505ac568da55f9ae8a93e7e314e8cbc13d3445d0be61b75941226b005e1390d9b95caecf5dcb00c9d1bab2f1f60f6ff9876dc091a48b547495007720 + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc + languageName: node + linkType: hard + "@types/ms@npm:*": version: 0.7.31 resolution: "@types/ms@npm:0.7.31" @@ -7918,6 +10612,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.0.0": + version: 22.5.5 + resolution: "@types/node@npm:22.5.5" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10c0/ead9495cfc6b1da5e7025856dcce2591e9bae635357410c0d2dd619fce797d2a1d402887580ca4b336cb78168b195224869967de370a23f61663cf1e4836121c + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.0 resolution: "@types/parse-json@npm:4.0.0" @@ -7941,6 +10644,27 @@ __metadata: languageName: node linkType: hard +"@types/prop-types@npm:^15.7.13": + version: 15.7.13 + resolution: "@types/prop-types@npm:15.7.13" + checksum: 10c0/1b20fc67281902c6743379960247bc161f3f0406ffc0df8e7058745a85ea1538612109db0406290512947f9632fe9e10e7337bf0ce6338a91d6c948df16a7c61 + languageName: node + linkType: hard + +"@types/qs@npm:*": + version: 6.9.16 + resolution: "@types/qs@npm:6.9.16" + checksum: 10c0/a4e871b80fff623755e356fd1f225aea45ff7a29da30f99fddee1a05f4f5f33485b314ab5758145144ed45708f97e44595aa9a8368e9bbc083932f931b12dbb6 + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c + languageName: node + linkType: hard + "@types/react-dom@npm:^18.3.1": version: 18.3.1 resolution: "@types/react-dom@npm:18.3.1" @@ -7950,6 +10674,15 @@ __metadata: languageName: node linkType: hard +"@types/react-transition-group@npm:^4.4.11": + version: 4.4.11 + resolution: "@types/react-transition-group@npm:4.4.11" + dependencies: + "@types/react": "npm:*" + checksum: 10c0/8fbf0dcc1b81985cdcebe3c59d769fe2ea3f4525f12c3a10a7429a59f93e303c82b2abb744d21cb762879f4514969d70a7ab11b9bf486f92213e8fe70e04098d + languageName: node + linkType: hard + "@types/react@npm:^18.3.1": version: 18.3.11 resolution: "@types/react@npm:18.3.11" @@ -7960,6 +10693,13 @@ __metadata: languageName: node linkType: hard +"@types/resolve@npm:^1.20.2": + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: 10c0/a9b0549d816ff2c353077365d865a33655a141d066d0f5a3ba6fd4b28bc2f4188a510079f7c1f715b3e7af505a27374adce2a5140a3ece2a059aab3d6e1a4244 + languageName: node + linkType: hard + "@types/secp256k1@npm:^4.0.1": version: 4.0.3 resolution: "@types/secp256k1@npm:4.0.3" @@ -7978,6 +10718,34 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.3.4": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa + languageName: node + linkType: hard + +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.7 + resolution: "@types/serve-static@npm:1.15.7" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae + languageName: node + linkType: hard + "@types/sinonjs__fake-timers@npm:8.1.1": version: 8.1.1 resolution: "@types/sinonjs__fake-timers@npm:8.1.1" @@ -8010,6 +10778,20 @@ __metadata: languageName: node linkType: hard +"@types/unist@npm:*, @types/unist@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 + languageName: node + linkType: hard + +"@types/uuid@npm:^9.0.1": + version: 9.0.8 + resolution: "@types/uuid@npm:9.0.8" + checksum: 10c0/b411b93054cb1d4361919579ef3508a1f12bf15b5fdd97337d3d351bece6c921b52b6daeef89b62340fd73fd60da407878432a1af777f40648cbe53a01723489 + languageName: node + linkType: hard + "@types/validator@npm:^13.12.1": version: 13.12.1 resolution: "@types/validator@npm:13.12.1" @@ -8254,13 +11036,75 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d languageName: node linkType: hard +"@vitest/expect@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/expect@npm:2.0.5" + dependencies: + "@vitest/spy": "npm:2.0.5" + "@vitest/utils": "npm:2.0.5" + chai: "npm:^5.1.1" + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/08cb1b0f106d16a5b60db733e3d436fa5eefc68571488eb570dfe4f599f214ab52e4342273b03dbe12331cc6c0cdc325ac6c94f651ad254cd62f3aa0e3d185aa + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/pretty-format@npm:2.0.5" + dependencies: + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/236c0798c5170a0b5ad5d4bd06118533738e820b4dd30079d8fbcb15baee949d41c60f42a9f769906c4a5ce366d7ef11279546070646c0efc03128c220c31f37 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/pretty-format@npm:2.1.1" + dependencies: + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/21057465a794a037a7af2c48397531eadf9b2d8a7b4d1ee5af9081cf64216cd0039b9e06317319df79aa2240fed1dbb6767b530deae2bd4b42d6fb974297e97d + languageName: node + linkType: hard + +"@vitest/spy@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/spy@npm:2.0.5" + dependencies: + tinyspy: "npm:^3.0.0" + checksum: 10c0/70634c21921eb271b54d2986c21d7ab6896a31c0f4f1d266940c9bafb8ac36237846d6736638cbf18b958bd98e5261b158a6944352742accfde50b7818ff655e + languageName: node + linkType: hard + +"@vitest/utils@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/utils@npm:2.0.5" + dependencies: + "@vitest/pretty-format": "npm:2.0.5" + estree-walker: "npm:^3.0.3" + loupe: "npm:^3.1.1" + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/0d1de748298f07a50281e1ba058b05dcd58da3280c14e6f016265e950bd79adab6b97822de8f0ea82d3070f585654801a9b1bcf26db4372e51cf7746bf86d73b + languageName: node + linkType: hard + +"@vitest/utils@npm:^2.0.5": + version: 2.1.1 + resolution: "@vitest/utils@npm:2.1.1" + dependencies: + "@vitest/pretty-format": "npm:2.1.1" + loupe: "npm:^3.1.1" + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/b724c7f23591860bd24cd8e6d0cd803405f4fbff746db160a948290742144463287566a05ca400deb56817603b5185c4429707947869c3d453805860b5e3a3e5 + languageName: node + linkType: hard + "@walletconnect/browser-utils@npm:^1.8.0": version: 1.8.0 resolution: "@walletconnect/browser-utils@npm:1.8.0" @@ -9151,6 +11995,16 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + languageName: node + linkType: hard + "@webassemblyjs/floating-point-hex-parser@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" @@ -9172,6 +12026,13 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a + languageName: node + linkType: hard + "@webassemblyjs/helper-numbers@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" @@ -9202,6 +12063,18 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + languageName: node + linkType: hard + "@webassemblyjs/ieee754@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/ieee754@npm:1.11.6" @@ -9243,6 +12116,22 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + languageName: node + linkType: hard + "@webassemblyjs/wasm-gen@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" @@ -9256,6 +12145,19 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + languageName: node + linkType: hard + "@webassemblyjs/wasm-opt@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" @@ -9268,6 +12170,18 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + languageName: node + linkType: hard + "@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" @@ -9282,6 +12196,20 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + languageName: node + linkType: hard + "@webassemblyjs/wast-printer@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wast-printer@npm:1.11.6" @@ -9292,6 +12220,16 @@ __metadata: languageName: node linkType: hard +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + languageName: node + linkType: hard + "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -9384,6 +12322,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + languageName: node + linkType: hard + "acorn-import-assertions@npm:^1.7.6": version: 1.9.0 resolution: "acorn-import-assertions@npm:1.9.0" @@ -9393,7 +12341,16 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.2": +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" + peerDependencies: + acorn: ^8 + checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -9402,6 +12359,13 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^7.2.0": + version: 7.2.0 + resolution: "acorn-walk@npm:7.2.0" + checksum: 10c0/ff99f3406ed8826f7d6ef6ac76b7608f099d45a1ff53229fa267125da1924188dbacf02e7903dfcfd2ae4af46f7be8847dc7d564c73c4e230dfb69c8ea8e6b4c + languageName: node + linkType: hard + "acorn-walk@npm:^8.0.0": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" @@ -9418,6 +12382,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^7.4.1": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 10c0/bd0b2c2b0f334bbee48828ff897c12bd2eb5898d03bf556dcc8942022cec795ac5bb5b6b585e2de687db6231faf07e096b59a361231dd8c9344d5df5f7f0e526 + languageName: node + linkType: hard + "acorn@npm:^8.0.4, acorn@npm:^8.5.0, acorn@npm:^8.7.1": version: 8.8.2 resolution: "acorn@npm:8.8.2" @@ -9436,6 +12409,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.12.1, acorn@npm:^8.8.2": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" + bin: + acorn: bin/acorn + checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 + languageName: node + linkType: hard + "acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" @@ -9445,6 +12427,16 @@ __metadata: languageName: node linkType: hard +"adjust-sourcemap-loader@npm:^4.0.0": + version: 4.0.0 + resolution: "adjust-sourcemap-loader@npm:4.0.0" + dependencies: + loader-utils: "npm:^2.0.0" + regex-parser: "npm:^2.2.11" + checksum: 10c0/6a6e5bb8b670e4e1238c708f6163e92aa2ad0308fe5913de73c89e4cbf41738ee0bcc5552b94d0b7bf8be435ee49b78c6de8a6db7badd80762051e843c8aa14f + languageName: node + linkType: hard + "adm-zip@npm:^0.4.16": version: 0.4.16 resolution: "adm-zip@npm:0.4.16" @@ -9510,6 +12502,20 @@ __metadata: languageName: node linkType: hard +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + "ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -9519,6 +12525,17 @@ __metadata: languageName: node linkType: hard +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 + languageName: node + linkType: hard + "ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -9531,6 +12548,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.0.0, ajv@npm:^8.17.1, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + "ajv@npm:^8.11.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" @@ -9584,6 +12613,24 @@ __metadata: languageName: node linkType: hard +"ansi-html-community@npm:0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 + languageName: node + linkType: hard + +"ansi-html@npm:^0.0.9": + version: 0.0.9 + resolution: "ansi-html@npm:0.0.9" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/4a5de9802fb50193e32b51a9ea48dc0d7e4436b860cb819d7110c62f2bfb1410288e1a2f9a848269f5eab8f903797a7f0309fe4c552f92a92b61a5b759ed52bd + languageName: node + linkType: hard + "ansi-regex@npm:^2.0.0": version: 2.1.1 resolution: "ansi-regex@npm:2.1.1" @@ -9685,7 +12732,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.0": +"aria-query@npm:5.3.0, aria-query@npm:^5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -9694,6 +12741,13 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:^5.0.0": + version: 5.3.1 + resolution: "aria-query@npm:5.3.1" + checksum: 10c0/2e9aca7d92d20b8539ee58fa1d29ba07e2269a68da8d27e9830d3cb816d49bb01648610ac3f2e365a8dedbf00168ac18c017ea49c512fbe2537a0b17184a458b + languageName: node + linkType: hard + "array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" @@ -9704,6 +12758,13 @@ __metadata: languageName: node linkType: hard +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 + languageName: node + linkType: hard + "array-ify@npm:^1.0.0": version: 1.0.0 resolution: "array-ify@npm:1.0.0" @@ -9851,6 +12912,17 @@ __metadata: languageName: node linkType: hard +"asn1.js@npm:^4.10.1": + version: 4.10.1 + resolution: "asn1.js@npm:4.10.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/afa7f3ab9e31566c80175a75b182e5dba50589dcc738aa485be42bdd787e2a07246a4b034d481861123cbe646a7656f318f4f1cad2e9e5e808a210d5d6feaa88 + languageName: node + linkType: hard + "asn1@npm:~0.2.3": version: 0.2.6 resolution: "asn1@npm:0.2.6" @@ -9879,6 +12951,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -9886,6 +12965,15 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.16.1": + version: 0.16.1 + resolution: "ast-types@npm:0.16.1" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf + languageName: node + linkType: hard + "astral-regex@npm:^2.0.0": version: 2.0.0 resolution: "astral-regex@npm:2.0.0" @@ -9958,6 +13046,13 @@ __metadata: languageName: node linkType: hard +"axe-core@npm:^4.2.0": + version: 4.10.0 + resolution: "axe-core@npm:4.10.0" + checksum: 10c0/732c171d48caaace5e784895c4dacb8ca6155e9d98045138ebe3952f78457dd05b92c57d05b41ce2a570aff87dbd0471e8398d2c0f6ebe79617b746c8f658998 + languageName: node + linkType: hard + "axios@npm:^0.21.1": version: 0.21.4 resolution: "axios@npm:0.21.4" @@ -9994,7 +13089,20 @@ __metadata: languageName: node linkType: hard -"babel-plugin-macros@npm:^3.0.1": +"babel-loader@npm:^9.1.3": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" + dependencies: + find-cache-dir: "npm:^4.0.0" + schema-utils: "npm:^4.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: 10c0/efb82faff4c7c27e9c15bb28bf11c73200e61cf365118a9514e8d74dd489d0afc2a0d5aaa62cb4254eefc2ab631579224d95a03fd245410f28ea75e24de54ba4 + languageName: node + linkType: hard + +"babel-plugin-macros@npm:^3.0.1, babel-plugin-macros@npm:^3.1.0": version: 3.1.0 resolution: "babel-plugin-macros@npm:3.1.0" dependencies: @@ -10005,6 +13113,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/b2217bc8d5976cf8142453ed44daabf0b2e0e75518f24eac83b54a8892e87a88f1bd9089daa92fd25df979ecd0acfd29b6bc28c4182c1c46344cee15ef9bce84 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.6": version: 0.4.6 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" @@ -10018,6 +13139,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.10.6": + version: 0.10.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + core-js-compat: "npm:^3.38.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/3a69220471b07722c2ae6537310bf26b772514e12b601398082965459c838be70a0ca70b0662f0737070654ff6207673391221d48599abb4a2b27765206d9f79 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs3@npm:^0.8.5": version: 0.8.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.8.6" @@ -10041,6 +13174,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/bc541037cf7620bc84ddb75a1c0ce3288f90e7d2799c070a53f8a495c8c8ae0316447becb06f958dd25dcce2a2fce855d318ecfa48036a1ddb218d55aa38a744 + languageName: node + linkType: hard + "babel-plugin-styled-components@npm:>= 1.12.0": version: 2.1.4 resolution: "babel-plugin-styled-components@npm:2.1.4" @@ -10128,6 +13272,15 @@ __metadata: languageName: node linkType: hard +"better-opn@npm:^3.0.2": + version: 3.0.2 + resolution: "better-opn@npm:3.0.2" + dependencies: + open: "npm:^8.0.4" + checksum: 10c0/911ef25d44da75aabfd2444ce7a4294a8000ebcac73068c04a60298b0f7c7506b60421aa4cd02ac82502fb42baaff7e4892234b51e6923eded44c5a11185f2f5 + languageName: node + linkType: hard + "big-integer@npm:1.6.36": version: 1.6.36 resolution: "big-integer@npm:1.6.36" @@ -10256,7 +13409,7 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" checksum: 10c0/9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 @@ -10282,6 +13435,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -10360,13 +13533,20 @@ __metadata: languageName: node linkType: hard -"brorand@npm:^1.0.5, brorand@npm:^1.1.0": +"brorand@npm:^1.0.1, brorand@npm:^1.0.5, brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 languageName: node linkType: hard +"browser-assert@npm:^1.2.1": + version: 1.2.1 + resolution: "browser-assert@npm:1.2.1" + checksum: 10c0/902abf999f92c9c951fdb6d7352c09eea9a84706258699655f7e7906e42daa06a1ae286398a755872740e05a6a71c43c5d1a0c0431d67a8cdb66e5d859a3fc0c + languageName: node + linkType: hard + "browser-stdout@npm:1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" @@ -10374,7 +13554,7 @@ __metadata: languageName: node linkType: hard -"browserify-aes@npm:^1.0.6, browserify-aes@npm:^1.2.0": +"browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.0.6, browserify-aes@npm:^1.2.0": version: 1.2.0 resolution: "browserify-aes@npm:1.2.0" dependencies: @@ -10388,6 +13568,67 @@ __metadata: languageName: node linkType: hard +"browserify-cipher@npm:^1.0.0": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: "npm:^1.0.4" + browserify-des: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + checksum: 10c0/aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: "npm:^1.0.1" + des.js: "npm:^1.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": + version: 4.1.1 + resolution: "browserify-rsa@npm:4.1.1" + dependencies: + bn.js: "npm:^5.2.1" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0 + languageName: node + linkType: hard + +"browserify-sign@npm:^4.0.0": + version: 4.2.3 + resolution: "browserify-sign@npm:4.2.3" + dependencies: + bn.js: "npm:^5.2.1" + browserify-rsa: "npm:^4.1.0" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.5.5" + hash-base: "npm:~3.0" + inherits: "npm:^2.0.4" + parse-asn1: "npm:^5.1.7" + readable-stream: "npm:^2.3.8" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/30c0eba3f5970a20866a4d3fbba2c5bd1928cd24f47faf995f913f1499214c6f3be14bb4d6ec1ab5c6cafb1eca9cb76ba1c2e1c04ed018370634d4e659c77216 + languageName: node + linkType: hard + +"browserify-zlib@npm:^0.2.0": + version: 0.2.0 + resolution: "browserify-zlib@npm:0.2.0" + dependencies: + pako: "npm:~1.0.5" + checksum: 10c0/9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 + languageName: node + linkType: hard + "browserslist@npm:^4.14.5": version: 4.21.5 resolution: "browserslist@npm:4.21.5" @@ -10402,6 +13643,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.21.10, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": + version: 4.24.0 + resolution: "browserslist@npm:4.24.0" + dependencies: + caniuse-lite: "npm:^1.0.30001663" + electron-to-chromium: "npm:^1.5.28" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.0" + bin: + browserslist: cli.js + checksum: 10c0/95e76ad522753c4c470427f6e3c8a4bb5478ff448841e22b3d3e53f89ecaf17b6984666d6c7e715c370f1e7fa0cf684f42e34e554236a8b2fab38ea76b9e4c52 + languageName: node + linkType: hard + "browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": version: 4.22.1 resolution: "browserslist@npm:4.22.1" @@ -10540,6 +13795,13 @@ __metadata: languageName: node linkType: hard +"builtin-status-codes@npm:^3.0.0": + version: 3.0.0 + resolution: "builtin-status-codes@npm:3.0.0" + checksum: 10c0/c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c + languageName: node + linkType: hard + "busboy@npm:1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -10622,6 +13884,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a + languageName: node + linkType: hard + "camelcase@npm:^5.0.0": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -10664,6 +13936,20 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001663": + version: 1.0.30001668 + resolution: "caniuse-lite@npm:1.0.30001668" + checksum: 10c0/247b3200aeec55038f3a11f3e6ab66f656c54d30df7b01d8d447efaba9af96ad3e17128da2ddd42ddc9cb6c286bac65b634a20955b3cc6619be7ca4601fddc8e + languageName: node + linkType: hard + +"case-sensitive-paths-webpack-plugin@npm:^2.4.0": + version: 2.4.0 + resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" + checksum: 10c0/310dab619b661a7fa44ed773870be6d6d7373faff6953ad92720f9553e2579e46dda5b9a79eae6d25ff3733cc15aa466b96e5811af16213f23c115aa220b4ab4 + languageName: node + linkType: hard + "caseless@npm:~0.12.0": version: 0.12.0 resolution: "caseless@npm:0.12.0" @@ -10689,7 +13975,20 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0": +"chai@npm:^5.1.1": + version: 5.1.1 + resolution: "chai@npm:5.1.1" + dependencies: + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10c0/e7f00e5881e3d5224f08fe63966ed6566bd9fdde175863c7c16dd5240416de9b34c4a0dd925f4fd64ad56256ca6507d32cf6131c49e1db65c62578eb31d4566c + languageName: node + linkType: hard + +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -10723,6 +14022,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 + languageName: node + linkType: hard + "chalk@npm:^5.3.0, chalk@npm:~5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -10737,6 +14046,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e + languageName: node + linkType: hard + "check-more-types@npm:^2.24.0": version: 2.24.0 resolution: "check-more-types@npm:2.24.0" @@ -10805,6 +14121,25 @@ __metadata: languageName: node linkType: hard +"chromatic@npm:^11.4.0": + version: 11.10.2 + resolution: "chromatic@npm:11.10.2" + peerDependencies: + "@chromatic-com/cypress": ^0.*.* || ^1.0.0 + "@chromatic-com/playwright": ^0.*.* || ^1.0.0 + peerDependenciesMeta: + "@chromatic-com/cypress": + optional: true + "@chromatic-com/playwright": + optional: true + bin: + chroma: dist/bin.js + chromatic: dist/bin.js + chromatic-cli: dist/bin.js + checksum: 10c0/167633dc1d3d0309af4524e7603a887d3481bc6005a2c0cb955d9ca0e17223bd0335a01844835fe34f1823df308032d6b238bced644a755a3f7c265728ac5e41 + languageName: node + linkType: hard + "chrome-trace-event@npm:^1.0.2": version: 1.0.3 resolution: "chrome-trace-event@npm:1.0.3" @@ -10845,6 +14180,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.3": + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc + languageName: node + linkType: hard + "classnames@npm:^2.2.5": version: 2.3.2 resolution: "classnames@npm:2.3.2" @@ -10852,6 +14194,15 @@ __metadata: languageName: node linkType: hard +"clean-css@npm:^5.2.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10c0/381de7523e23f3762eb180e327dcc0cedafaf8cb1cd8c26b7cc1fc56e0829a92e734729c4f955394d65ed72fb62f82d8baf78af34b33b8a7d41ebad2accdd6fb + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -11012,6 +14363,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 + languageName: node + linkType: hard + "cluster-key-slot@npm:^1.1.0": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" @@ -11071,6 +14429,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.10, colorette@npm:^2.0.20": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + "colorette@npm:^2.0.16": version: 2.0.16 resolution: "colorette@npm:2.0.16" @@ -11078,13 +14443,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.20": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 - languageName: node - linkType: hard - "colors@npm:1.0.3": version: 1.0.3 resolution: "colors@npm:1.0.3" @@ -11136,7 +14494,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^8.1.0": +"commander@npm:^8.1.0, commander@npm:^8.3.0": version: 8.3.0 resolution: "commander@npm:8.3.0" checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 @@ -11150,6 +14508,13 @@ __metadata: languageName: node linkType: hard +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + "common-tags@npm:^1.4.0, common-tags@npm:^1.8.0": version: 1.8.2 resolution: "common-tags@npm:1.8.2" @@ -11157,6 +14522,13 @@ __metadata: languageName: node linkType: hard +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + "compare-func@npm:^2.0.0": version: 2.0.0 resolution: "compare-func@npm:2.0.0" @@ -11181,6 +14553,36 @@ __metadata: languageName: node linkType: hard +"console-browserify@npm:^1.2.0": + version: 1.2.0 + resolution: "console-browserify@npm:1.2.0" + checksum: 10c0/89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 + languageName: node + linkType: hard + +"constants-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "constants-browserify@npm:1.0.0" + checksum: 10c0/ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb + languageName: node + linkType: hard + +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + "context@npm:^3.0.31": version: 3.0.31 resolution: "context@npm:3.0.31" @@ -11222,6 +14624,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.7.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -11236,6 +14645,20 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 + languageName: node + linkType: hard + +"cookie@npm:0.6.0": + version: 0.6.0 + resolution: "cookie@npm:0.6.0" + checksum: 10c0/f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 + languageName: node + linkType: hard + "cookie@npm:^0.4.1": version: 0.4.2 resolution: "cookie@npm:0.4.2" @@ -11252,6 +14675,22 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": + version: 3.38.1 + resolution: "core-js-compat@npm:3.38.1" + dependencies: + browserslist: "npm:^4.23.3" + checksum: 10c0/d8bc8a35591fc5fbf3e376d793f298ec41eb452619c7ef9de4ea59b74be06e9fda799e0dcbf9ba59880dae87e3b41fb191d744ffc988315642a1272bb9442b31 + languageName: node + linkType: hard + +"core-js-pure@npm:^3.23.3": + version: 3.38.1 + resolution: "core-js-pure@npm:3.38.1" + checksum: 10c0/466adbc0468b8c2a95b9bc49829492dece2cc6584d757c5b38555a26ed3d71f8364ac1ea3128a0a949e004e0e60206cc535ed84320982c3efb9a40c1785ddcc6 + languageName: node + linkType: hard + "core-util-is@npm:1.0.2": version: 1.0.2 resolution: "core-util-is@npm:1.0.2" @@ -11292,6 +14731,19 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^7.0.1": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + languageName: node + linkType: hard + "cosmiconfig@npm:^8.0.0": version: 8.1.3 resolution: "cosmiconfig@npm:8.1.3" @@ -11350,6 +14802,16 @@ __metadata: languageName: node linkType: hard +"create-ecdh@npm:^4.0.0": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: "npm:^4.1.0" + elliptic: "npm:^6.5.3" + checksum: 10c0/77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f + languageName: node + linkType: hard + "create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": version: 1.2.0 resolution: "create-hash@npm:1.2.0" @@ -11363,7 +14825,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -11418,6 +14880,25 @@ __metadata: languageName: node linkType: hard +"crypto-browserify@npm:^3.12.0": + version: 3.12.0 + resolution: "crypto-browserify@npm:3.12.0" + dependencies: + browserify-cipher: "npm:^1.0.0" + browserify-sign: "npm:^4.0.0" + create-ecdh: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + create-hmac: "npm:^1.1.0" + diffie-hellman: "npm:^5.0.0" + inherits: "npm:^2.0.1" + pbkdf2: "npm:^3.0.3" + public-encrypt: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + randomfill: "npm:^1.0.3" + checksum: 10c0/0c20198886576050a6aa5ba6ae42f2b82778bfba1753d80c5e7a090836890dc372bdc780986b2568b4fb8ed2a91c958e61db1f0b6b1cc96af4bd03ffc298ba92 + languageName: node + linkType: hard + "crypto-es@npm:^1.2.2": version: 1.2.7 resolution: "crypto-es@npm:1.2.7" @@ -11432,6 +14913,43 @@ __metadata: languageName: node linkType: hard +"css-loader@npm:^6.7.1, css-loader@npm:^6.7.3": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/bb52434138085fed06a33e2ffbdae9ee9014ad23bf60f59d6b7ee67f28f26c6b1764024d3030bd19fd884d6ee6ee2224eaed64ad19eb18fbbb23d148d353a965 + languageName: node + linkType: hard + +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.0.1" + domhandler: "npm:^4.3.1" + domutils: "npm:^2.8.0" + nth-check: "npm:^2.0.1" + checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 + languageName: node + linkType: hard + "css-select@npm:^5.1.0": version: 5.1.0 resolution: "css-select@npm:5.1.0" @@ -11483,13 +15001,29 @@ __metadata: languageName: node linkType: hard -"css-what@npm:^6.1.0": +"css-what@npm:^6.0.1, css-what@npm:^6.1.0": version: 6.1.0 resolution: "css-what@npm:6.1.0" checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 languageName: node linkType: hard +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: 10c0/5e09035e5bf6c2c422b40c6df2eb1529657a17df37fda5d0433d722609527ab98090baf25b13970ca754079a0f3161dd3dfc0e743563ded8cfa0749d861c1525 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + "csso@npm:5.0.5": version: 5.0.5 resolution: "csso@npm:5.0.5" @@ -11506,6 +15040,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^3.1.3": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + "curve-frontend@workspace:.": version: 0.0.0-use.local resolution: "curve-frontend@workspace:." @@ -11549,6 +15090,38 @@ __metadata: languageName: unknown linkType: soft +"curve-ui-kit@workspace:packages/curve-ui-kit": + version: 0.0.0-use.local + resolution: "curve-ui-kit@workspace:packages/curve-ui-kit" + dependencies: + "@chromatic-com/storybook": "npm:^2.0.2" + "@emotion/react": "npm:^11.13.3" + "@emotion/styled": "npm:^11.13.0" + "@mui/material": "npm:^6.1.4" + "@mui/utils": "npm:^6.1.4" + "@storybook/addon-a11y": "npm:^8.3.5" + "@storybook/addon-docs": "npm:^8.3.5" + "@storybook/addon-essentials": "npm:^8.3.5" + "@storybook/addon-interactions": "npm:^8.3.5" + "@storybook/addon-themes": "npm:^8.3.5" + "@storybook/blocks": "npm:^8.3.5" + "@storybook/nextjs": "npm:^8.3.5" + "@storybook/react": "npm:^8.3.5" + "@storybook/test": "npm:^8.3.5" + "@types/react": "npm:*" + "@types/react-dom": "npm:*" + ajv: "npm:^8.17.1" + prop-types: "npm:^15.8.1" + react-docgen-typescript: "npm:^2.2.2" + storybook: "npm:^8.3.5" + tsconfig: "npm:*" + type-fest: "npm:^4.26.1" + peerDependencies: + react: "*" + react-dom: "*" + languageName: unknown + linkType: soft + "cypress@npm:*, cypress@npm:^13.9.0": version: 13.10.0 resolution: "cypress@npm:13.10.0" @@ -11783,6 +15356,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -11872,6 +15454,20 @@ __metadata: languageName: node linkType: hard +"dedent@npm:^0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 10c0/7c3aa00ddfe3e5fcd477958e156156a5137e3bb6ff1493ca05edff4decf29a90a057974cc77e75951f8eb801c1816cb45aea1f52d628cdd000b82b36ab839d1b + languageName: node + linkType: hard + +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10c0/7102cf3b7bb719c6b9c0db2e19bf0aa9318d141581befe8c7ce8ccd39af9eaa4346e5e05adef7f9bd7015da0f13a3a25dcfe306ef79dc8668aedbecb658dd247 + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -11983,13 +15579,23 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.3": +"dequal@npm:^2.0.2, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 languageName: node linkType: hard +"des.js@npm:^1.0.0": + version: 1.1.0 + resolution: "des.js@npm:1.1.0" + dependencies: + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/671354943ad67493e49eb4c555480ab153edd7cee3a51c658082fcde539d2690ed2a4a0b5d1f401f9cde822edf3939a6afb2585f32c091f2d3a1b1665cd45236 + languageName: node + linkType: hard + "destr@npm:^2.0.1, destr@npm:^2.0.2": version: 2.0.2 resolution: "destr@npm:2.0.2" @@ -11997,6 +15603,13 @@ __metadata: languageName: node linkType: hard +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 + languageName: node + linkType: hard + "detect-browser@npm:5.2.0": version: 5.2.0 resolution: "detect-browser@npm:5.2.0" @@ -12027,6 +15640,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + "diff@npm:5.0.0": version: 5.0.0 resolution: "diff@npm:5.0.0" @@ -12034,6 +15654,17 @@ __metadata: languageName: node linkType: hard +"diffie-hellman@npm:^5.0.0": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: "npm:^4.1.0" + miller-rabin: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + checksum: 10c0/ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf + languageName: node + linkType: hard + "dijkstrajs@npm:^1.0.1": version: 1.0.2 resolution: "dijkstrajs@npm:1.0.2" @@ -12075,6 +15706,29 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 10c0/b2c2eda4fae568977cdac27a9f0c001edf4f95a6a6191dfa611e3721db2478d1badc01db5bb4fa8a848aeee13e442a6c2a4386d65ec65a1436f24715a2f8d053 + languageName: node + linkType: hard + +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: 10c0/10bee5aa514b2a9a37c87cd81268db607a2e933a050074abc2f6fa3da9080ebed206a320cbc123567f2c3087d22292853bdfdceaffdd4334ffe2af9510b29360 + languageName: node + linkType: hard + +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: "npm:~0.4" + checksum: 10c0/e96aa63bd8c6ee3cd9ce19c3aecfc2c42e50a460e8087114794d4f5ecf3a4f052b34ea3bf2d73b5d80b4da619073b49905e6d7d788ceb7814ca4c29be5354a11 + languageName: node + linkType: hard + "dom-helpers@npm:^3.4.0": version: 3.4.0 resolution: "dom-helpers@npm:3.4.0" @@ -12084,6 +15738,27 @@ __metadata: languageName: node linkType: hard +"dom-helpers@npm:^5.0.1": + version: 5.2.1 + resolution: "dom-helpers@npm:5.2.1" + dependencies: + "@babel/runtime": "npm:^7.8.7" + csstype: "npm:^3.0.2" + checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 + languageName: node + linkType: hard + "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -12095,13 +15770,29 @@ __metadata: languageName: node linkType: hard -"domelementtype@npm:^2.3.0": +"domain-browser@npm:^4.22.0": + version: 4.23.0 + resolution: "domain-browser@npm:4.23.0" + checksum: 10c0/dfcc6ba070a2c968a4d922e7d99ef440d1076812af0d983404aadf64729f746bb4a0ad2c5e73ccd5d9cf41bc79037f2a1e4a915bdf33d07e0d77f487b635b5b2 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 languageName: node linkType: hard +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b + languageName: node + linkType: hard + "domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": version: 5.0.3 resolution: "domhandler@npm:5.0.3" @@ -12111,6 +15802,17 @@ __metadata: languageName: node linkType: hard +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db + languageName: node + linkType: hard + "domutils@npm:^3.0.1": version: 3.1.0 resolution: "domutils@npm:3.1.0" @@ -12239,6 +15941,13 @@ __metadata: languageName: node linkType: hard +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.284": version: 1.4.404 resolution: "electron-to-chromium@npm:1.4.404" @@ -12253,6 +15962,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.28": + version: 1.5.37 + resolution: "electron-to-chromium@npm:1.5.37" + checksum: 10c0/c71746968afd150aaf073478975f40712b18d4d6f6717d520bf1839b1f28464397d9a50ff81a1bb5109d6be75b4506c6a425baa9225a3475afe1d02f4ba1ffe1 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.4": version: 1.5.19 resolution: "electron-to-chromium@npm:1.5.19" @@ -12275,6 +15991,21 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:^6.5.3, elliptic@npm:^6.5.5": + version: 6.5.7 + resolution: "elliptic@npm:6.5.7" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10c0/799959b6c54ea3564e8961f35abdf8c77e37617f3051614b05ab1fb6a04ddb65bd1caa75ed1bae375b15dda312a0f79fed26ebe76ecf05c5a7af244152a601b8 + languageName: node + linkType: hard + "emoji-regex@npm:^10.3.0": version: 10.3.0 resolution: "emoji-regex@npm:10.3.0" @@ -12310,6 +16041,20 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -12328,6 +16073,17 @@ __metadata: languageName: node linkType: hard +"endent@npm:^2.0.1": + version: 2.1.0 + resolution: "endent@npm:2.1.0" + dependencies: + dedent: "npm:^0.7.0" + fast-json-parse: "npm:^1.0.3" + objectorarray: "npm:^1.0.5" + checksum: 10c0/8cd6dae45e693ae2b2cbff2384348d3a5e2a06cc0396dddca8165e46bd2fd8d5394d44d338ba653bbfce4aead90eca1ec1abe7203843c84155c645d283b6b884 + languageName: node + linkType: hard + "engine.io-client@npm:~6.5.2": version: 6.5.4 resolution: "engine.io-client@npm:6.5.4" @@ -12368,7 +16124,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.15.0": +"enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.7.0": version: 5.17.1 resolution: "enhanced-resolve@npm:5.17.1" dependencies: @@ -12397,6 +16153,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 + languageName: node + linkType: hard + "entities@npm:^4.2.0, entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -12434,6 +16197,15 @@ __metadata: languageName: node linkType: hard +"error-stack-parser@npm:^2.0.6": + version: 2.1.4 + resolution: "error-stack-parser@npm:2.1.4" + dependencies: + stackframe: "npm:^1.3.4" + checksum: 10c0/7679b780043c98b01fc546725484e0cfd3071bf5c906bbe358722972f04abf4fc3f0a77988017665bab367f6ef3fc2d0185f7528f45966b83e7c99c02d5509b9 + languageName: node + linkType: hard + "es-abstract@npm:^1.17.5, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": version: 1.23.3 resolution: "es-abstract@npm:1.23.3" @@ -12565,6 +16337,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.5.0": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: 10c0/300a469488c2f22081df1e4c8398c78db92358496e639b0df7f89ac6455462aaf5d8893939087c1a1cbcbf20eed4610c70e0bcb8f3e4b0d80a5d2611c539408c + languageName: node + linkType: hard + "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -12681,6 +16460,17 @@ __metadata: languageName: node linkType: hard +"esbuild-register@npm:^3.5.0": + version: 3.6.0 + resolution: "esbuild-register@npm:3.6.0" + dependencies: + debug: "npm:^4.3.4" + peerDependencies: + esbuild: ">=0.12 <1" + checksum: 10c0/77193b7ca32ba9f81b35ddf3d3d0138efb0b1429d71b39480cfee932e1189dd2e492bd32bf04a4d0bc3adfbc7ec7381ceb5ffd06efe35f3e70904f1f686566d5 + languageName: node + linkType: hard + "esbuild@npm:^0.17.10": version: 0.17.19 resolution: "esbuild@npm:0.17.19" @@ -12758,6 +16548,89 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0": + version: 0.23.1 + resolution: "esbuild@npm:0.23.1" + dependencies: + "@esbuild/aix-ppc64": "npm:0.23.1" + "@esbuild/android-arm": "npm:0.23.1" + "@esbuild/android-arm64": "npm:0.23.1" + "@esbuild/android-x64": "npm:0.23.1" + "@esbuild/darwin-arm64": "npm:0.23.1" + "@esbuild/darwin-x64": "npm:0.23.1" + "@esbuild/freebsd-arm64": "npm:0.23.1" + "@esbuild/freebsd-x64": "npm:0.23.1" + "@esbuild/linux-arm": "npm:0.23.1" + "@esbuild/linux-arm64": "npm:0.23.1" + "@esbuild/linux-ia32": "npm:0.23.1" + "@esbuild/linux-loong64": "npm:0.23.1" + "@esbuild/linux-mips64el": "npm:0.23.1" + "@esbuild/linux-ppc64": "npm:0.23.1" + "@esbuild/linux-riscv64": "npm:0.23.1" + "@esbuild/linux-s390x": "npm:0.23.1" + "@esbuild/linux-x64": "npm:0.23.1" + "@esbuild/netbsd-x64": "npm:0.23.1" + "@esbuild/openbsd-arm64": "npm:0.23.1" + "@esbuild/openbsd-x64": "npm:0.23.1" + "@esbuild/sunos-x64": "npm:0.23.1" + "@esbuild/win32-arm64": "npm:0.23.1" + "@esbuild/win32-ia32": "npm:0.23.1" + "@esbuild/win32-x64": "npm:0.23.1" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/08c2ed1105cc3c5e3a24a771e35532fe6089dd24a39c10097899072cef4a99f20860e41e9294e000d86380f353b04d8c50af482483d7f69f5208481cce61eec7 + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -12772,6 +16645,13 @@ __metadata: languageName: node linkType: hard +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + "escape-string-regexp@npm:2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -12793,6 +16673,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 + languageName: node + linkType: hard + "eslint-config-custom@npm:*, eslint-config-custom@workspace:packages/eslint-config-custom": version: 0.0.0-use.local resolution: "eslint-config-custom@workspace:packages/eslint-config-custom" @@ -13275,6 +17173,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:^4.0.1, esprima@npm:~4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + "esquery@npm:^1.4.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" @@ -13323,6 +17231,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -13330,6 +17247,13 @@ __metadata: languageName: node linkType: hard +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + "eth-crypto@npm:^2.1.0": version: 2.3.0 resolution: "eth-crypto@npm:2.3.0" @@ -13701,7 +17625,7 @@ __metadata: languageName: node linkType: hard -"evp_bytestokey@npm:^1.0.3": +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": version: 1.0.3 resolution: "evp_bytestokey@npm:1.0.3" dependencies: @@ -13793,6 +17717,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.19.2": + version: 4.21.0 + resolution: "express@npm:4.21.0" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.3" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.6.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.3.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.10" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.13.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/4cf7ca328f3fdeb720f30ccb2ea7708bfa7d345f9cc460b64a82bf1b2c91e5b5852ba15a9a11b2a165d6089acf83457fc477dc904d59cd71ed34c7a91762c6cc + languageName: node + linkType: hard + "ext@npm:^1.1.2": version: 1.5.0 resolution: "ext@npm:1.5.0" @@ -13932,6 +17895,13 @@ __metadata: languageName: node linkType: hard +"fast-json-parse@npm:^1.0.3": + version: 1.0.3 + resolution: "fast-json-parse@npm:1.0.3" + checksum: 10c0/2c58c7a0f7f1725c9da1272839f9bee3ccc13b77672b18ab4ac470c707999bca39828cd7e79b87c73017f21c3ddff37992d03fa2fd2da124d9bd06c1d02c9b7e + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -13967,6 +17937,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.0.2 + resolution: "fast-uri@npm:3.0.2" + checksum: 10c0/8cdd3da7b4022a037d348d587d55caff74b7e4f862bbdd2cc35c1e6e3f97d0aedb567894d44c57ee8798d3192cceb97dcf41dbdabfa07dd2842a0474a6c6eeef + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -14022,6 +17999,13 @@ __metadata: languageName: node linkType: hard +"filesize@npm:^10.0.12": + version: 10.1.6 + resolution: "filesize@npm:10.1.6" + checksum: 10c0/9a196d64da4e947b8c0d294be09a3dfa7a634434a1fc5fb3465f1c9acc1237ea0363f245ba6e24477ea612754d942bc964d86e0e500905a72e9e0e17ae1bbdbc + languageName: node + linkType: hard + "fill-range@npm:^7.0.1": version: 7.0.1 resolution: "fill-range@npm:7.0.1" @@ -14047,6 +18031,56 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^2.0.2": + version: 2.0.2 + resolution: "filter-obj@npm:2.0.2" + checksum: 10c0/65899fb1151e16d3289c23e7d6c2a9276592de1e16ab8e14c29d225768273ac48a92d3be4182496a16d89a046cf24ebcbecef7fdac8c27c3c29feafc4fb9fdb3 + languageName: node + linkType: hard + +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f + languageName: node + linkType: hard + +"find-cache-dir@npm:^3.3.1": + version: 3.3.2 + resolution: "find-cache-dir@npm:3.3.2" + dependencies: + commondir: "npm:^1.0.1" + make-dir: "npm:^3.0.2" + pkg-dir: "npm:^4.1.0" + checksum: 10c0/92747cda42bff47a0266b06014610981cfbb71f55d60f2c8216bc3108c83d9745507fb0b14ecf6ab71112bed29cd6fb1a137ee7436179ea36e11287e3159e587 + languageName: node + linkType: hard + +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: "npm:^3.0.0" + pkg-dir: "npm:^7.0.0" + checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff + languageName: node + linkType: hard + +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: 10c0/1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa + languageName: node + linkType: hard + "find-up@npm:5.0.0, find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -14075,7 +18109,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.1.0": +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: @@ -14085,6 +18119,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + "find-up@npm:^7.0.0": version: 7.0.0 resolution: "find-up@npm:7.0.0" @@ -14175,6 +18219,29 @@ __metadata: languageName: node linkType: hard +"fork-ts-checker-webpack-plugin@npm:^8.0.0": + version: 8.0.0 + resolution: "fork-ts-checker-webpack-plugin@npm:8.0.0" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + chalk: "npm:^4.1.2" + chokidar: "npm:^3.5.3" + cosmiconfig: "npm:^7.0.1" + deepmerge: "npm:^4.2.2" + fs-extra: "npm:^10.0.0" + memfs: "npm:^3.4.1" + minimatch: "npm:^3.0.4" + node-abort-controller: "npm:^3.0.1" + schema-utils: "npm:^3.1.1" + semver: "npm:^7.3.5" + tapable: "npm:^2.2.1" + peerDependencies: + typescript: ">3.6.0" + webpack: ^5.11.0 + checksum: 10c0/1a2bb9bbd3e943e3b3a45d7fa9e8383698f5fea1ba28f7d18c8372c804460c2f13af53f791360b973fddafd3e88de7af59082c3cb3375f4e7c3365cd85accedc + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -14204,6 +18271,13 @@ __metadata: languageName: node linkType: hard +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + "fp-ts@npm:1.19.3": version: 1.19.3 resolution: "fp-ts@npm:1.19.3" @@ -14218,6 +18292,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + "fromentries@npm:^1.3.2": version: 1.3.2 resolution: "fromentries@npm:1.3.2" @@ -14232,6 +18313,28 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e + languageName: node + linkType: hard + +"fs-extra@npm:^11.1.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 + languageName: node + linkType: hard + "fs-extra@npm:^7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" @@ -14273,6 +18376,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.4": + version: 1.0.6 + resolution: "fs-monkey@npm:1.0.6" + checksum: 10c0/6f2508e792a47e37b7eabd5afc79459c1ea72bce2a46007d2b7ed0bfc3a4d64af38975c6eb7e93edb69ac98bbb907c13ff1b1579b2cf52d3d02dbc0303fca79f + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -14398,6 +18508,13 @@ __metadata: languageName: node linkType: hard +"get-func-name@npm:^2.0.1": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df + languageName: node + linkType: hard + "get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": version: 1.1.3 resolution: "get-intrinsic@npm:1.1.3" @@ -14529,6 +18646,13 @@ __metadata: languageName: node linkType: hard +"github-slugger@npm:^2.0.0": + version: 2.0.0 + resolution: "github-slugger@npm:2.0.0" + checksum: 10c0/21b912b6b1e48f1e5a50b2292b48df0ff6abeeb0691b161b3d93d84f4ae6b1acd6ae23702e914af7ea5d441c096453cf0f621b72d57893946618d21dd1a1c486 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -14707,7 +18831,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -14908,6 +19032,16 @@ __metadata: languageName: node linkType: hard +"hash-base@npm:~3.0": + version: 3.0.4 + resolution: "hash-base@npm:3.0.4" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/a13357dccb3827f0bb0b56bf928da85c428dc8670f6e4a1c7265e4f1653ce02d69030b40fd01b0f1d218a995a066eea279cded9cec72d207b593bcdfe309c2f0 + languageName: node + linkType: hard + "hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": version: 1.1.7 resolution: "hash.js@npm:1.1.7" @@ -14927,6 +19061,33 @@ __metadata: languageName: node linkType: hard +"hast-util-heading-rank@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-heading-rank@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/1879c84f629e73f1f13247ab349324355cd801363b44e3d46f763aa5c0ea3b42dcd47b46e5643a0502cf01a6b1fdb9208fd12852e44ca6c671b3e4bccf9369a1 + languageName: node + linkType: hard + +"hast-util-is-element@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-is-element@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b + languageName: node + linkType: hard + +"hast-util-to-string@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-to-string@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + checksum: 10c0/649edd993cf244563ad86d861aa0863759a4fbec49c43b3d92240e42aa4b69f0c3332ddff9e80954bbd8756c86b0fddc20e97d281c6da59d00427f45da8dab68 + languageName: node + linkType: hard + "hdkey@npm:^2.0.1": version: 2.0.1 resolution: "hdkey@npm:2.0.1" @@ -14938,7 +19099,7 @@ __metadata: languageName: node linkType: hard -"he@npm:1.2.0": +"he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -14965,12 +19126,76 @@ __metadata: languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0": +"hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: - react-is: "npm:^16.7.0" - checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 + react-is: "npm:^16.7.0" + checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 + languageName: node + linkType: hard + +"html-entities@npm:^2.1.0": + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: 10c0/f20ffb4326606245c439c231de40a7c560607f639bf40ffbfb36b4c70729fd95d7964209045f1a4e62fe17f2364cef3d6e49b02ea09016f207fde51c2211e481 + languageName: node + linkType: hard + +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:^5.2.2" + commander: "npm:^8.3.0" + he: "npm:^1.2.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.10.0" + bin: + html-minifier-terser: cli.js + checksum: 10c0/1aa4e4f01cf7149e3ac5ea84fb7a1adab86da40d38d77a6fff42852b5ee3daccb78b615df97264e3a6a5c33e57f0c77f471d607ca1e1debd1dab9b58286f4b5a + languageName: node + linkType: hard + +"html-tags@npm:^3.1.0": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: 10c0/680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 + languageName: node + linkType: hard + +"html-webpack-plugin@npm:^5.5.0": + version: 5.6.0 + resolution: "html-webpack-plugin@npm:5.6.0" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/50d1a0f90d512463ea8d798985d91a7ccc9d5e461713dedb240125b2ff0671f58135dd9355f7969af341ff4725e73b2defbc0984cfdce930887a48506d970002 + languageName: node + linkType: hard + +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.0.0" + domutils: "npm:^2.5.2" + entities: "npm:^2.0.0" + checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 languageName: node linkType: hard @@ -15022,6 +19247,13 @@ __metadata: languageName: node linkType: hard +"https-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "https-browserify@npm:1.0.0" + checksum: 10c0/e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -15117,6 +19349,15 @@ __metadata: languageName: node linkType: hard +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + "idb-keyval@npm:^6.2.1": version: 6.2.1 resolution: "idb-keyval@npm:6.2.1" @@ -15145,6 +19386,17 @@ __metadata: languageName: node linkType: hard +"image-size@npm:^1.0.0": + version: 1.1.1 + resolution: "image-size@npm:1.1.1" + dependencies: + queue: "npm:6.0.2" + bin: + image-size: bin/image-size.js + checksum: 10c0/2660470096d12be82195f7e80fe03274689fbd14184afb78eaf66ade7cd06352518325814f88af4bde4b26647889fe49e573129f6e7ba8f5ff5b85cc7f559000 + languageName: node + linkType: hard + "immer@npm:^9.0.12": version: 9.0.12 resolution: "immer@npm:9.0.12" @@ -15368,6 +19620,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + "iron-webcrypto@npm:^1.0.0": version: 1.0.0 resolution: "iron-webcrypto@npm:1.0.0" @@ -15375,6 +19634,13 @@ __metadata: languageName: node linkType: hard +"is-absolute-url@npm:^4.0.0": + version: 4.0.1 + resolution: "is-absolute-url@npm:4.0.1" + checksum: 10c0/6f8f603945bd9f2c6031758bbc12352fc647bd5d807cad10d96cc6300fd0e15240cc091521a61db767e4ec0bacff257b4f1015fd5249c147bbb4a4497356c72e + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -15683,6 +19949,13 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + "is-promise@npm:^2.2.2": version: 2.2.2 resolution: "is-promise@npm:2.2.2" @@ -16074,6 +20347,13 @@ __metadata: languageName: node linkType: hard +"jsdoc-type-pratt-parser@npm:^4.0.0": + version: 4.1.0 + resolution: "jsdoc-type-pratt-parser@npm:4.1.0" + checksum: 10c0/7700372d2e733a32f7ea0a1df9cec6752321a5345c11a91b2ab478a031a426e934f16d5c1f15c8566c7b2c10af9f27892a29c2c789039f595470e929a4aa60ea + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -16083,6 +20363,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -16170,7 +20459,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.2.3": +"json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -16198,7 +20487,7 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^6.0.1": +"jsonfile@npm:^6.0.1, jsonfile@npm:^6.1.0": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" dependencies: @@ -16568,6 +20857,24 @@ __metadata: languageName: node linkType: hard +"loader-utils@npm:^2.0.4": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^2.1.2" + checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 + languageName: node + linkType: hard + +"loader-utils@npm:^3.2.1": + version: 3.3.1 + resolution: "loader-utils@npm:3.3.1" + checksum: 10c0/f2af4eb185ac5bf7e56e1337b666f90744e9f443861ac521b48f093fb9e8347f191c8960b4388a3365147d218913bc23421234e7788db69f385bacfefa0b4758 + languageName: node + linkType: hard + "loan@workspace:apps/loan": version: 0.0.0-use.local resolution: "loan@workspace:apps/loan" @@ -16661,7 +20968,7 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^7.2.0": +"locate-path@npm:^7.1.0, locate-path@npm:^7.2.0": version: 7.2.0 resolution: "locate-path@npm:7.2.0" dependencies: @@ -16894,6 +21201,15 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.1": + version: 3.1.1 + resolution: "loupe@npm:3.1.1" + dependencies: + get-func-name: "npm:^2.0.1" + checksum: 10c0/99f88badc47e894016df0c403de846fedfea61154aadabbf776c8428dd59e8d8378007135d385d737de32ae47980af07d22ba7bec5ef7beebd721de9baa0a0af + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -16958,6 +21274,15 @@ __metadata: languageName: node linkType: hard +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 10c0/36128e4de34791838abe979b19927c26e67201ca5acf00880377af7d765b38d1c60847e01c5ec61b1a260c48029084ab3893a3925fd6e48a04011364b089991b + languageName: node + linkType: hard + "magic-string@npm:^0.30.3": version: 0.30.10 resolution: "magic-string@npm:0.30.10" @@ -16967,6 +21292,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.5": + version: 0.30.12 + resolution: "magic-string@npm:0.30.12" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/469f457d18af37dfcca8617086ea8a65bcd8b60ba8a1182cb024ce43e470ace3c9d1cb6bee58d3b311768fb16bc27bd50bdeebcaa63dadd0fd46cac4d2e11d5f + languageName: node + linkType: hard + "main@workspace:apps/main": version: 0.0.0-use.local resolution: "main@workspace:apps/main" @@ -17028,6 +21362,15 @@ __metadata: languageName: unknown linkType: soft +"make-dir@npm:^3.0.2": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.1 resolution: "make-fetch-happen@npm:13.0.1" @@ -17055,6 +21398,22 @@ __metadata: languageName: node linkType: hard +"map-or-similar@npm:^1.5.0": + version: 1.5.0 + resolution: "map-or-similar@npm:1.5.0" + checksum: 10c0/33c6ccfdc272992e33e4e99a69541a3e7faed9de3ac5bc732feb2500a9ee71d3f9d098980a70b7746e7eeb7f859ff7dfb8aa9b5ecc4e34170a32ab78cfb18def + languageName: node + linkType: hard + +"markdown-to-jsx@npm:^7.4.5": + version: 7.5.0 + resolution: "markdown-to-jsx@npm:7.5.0" + peerDependencies: + react: ">= 0.14.0" + checksum: 10c0/88213e64afd41d6934fbb70bcea0e2ef1f9553db1ba4c6f423b17d6e9c2b99c82b0fcbed29036dd5b91704b170803d1fae730ab40ae27af5c7994e2717686ebc + languageName: node + linkType: hard + "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -17080,6 +21439,22 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"memfs@npm:^3.4.1, memfs@npm:^3.4.12": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" + dependencies: + fs-monkey: "npm:^1.0.4" + checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 + languageName: node + linkType: hard + "memoizee@npm:^0.4.15": version: 0.4.15 resolution: "memoizee@npm:0.4.15" @@ -17096,6 +21471,15 @@ __metadata: languageName: node linkType: hard +"memoizerific@npm:^1.11.3": + version: 1.11.3 + resolution: "memoizerific@npm:1.11.3" + dependencies: + map-or-similar: "npm:^1.5.0" + checksum: 10c0/661bf69b7afbfad57f0208f0c63324f4c96087b480708115b78ee3f0237d86c7f91347f6db31528740b2776c2e34c709bcb034e1e910edee2270c9603a0a469e + languageName: node + linkType: hard + "memorystream@npm:^0.3.1": version: 0.3.1 resolution: "memorystream@npm:0.3.1" @@ -17110,6 +21494,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -17124,6 +21515,13 @@ __metadata: languageName: node linkType: hard +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + "micro-ftch@npm:^0.3.1": version: 0.3.1 resolution: "micro-ftch@npm:0.3.1" @@ -17151,6 +21549,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.2, micromatch@npm:~4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + "micromatch@npm:^4.0.4": version: 4.0.4 resolution: "micromatch@npm:4.0.4" @@ -17171,13 +21579,15 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:~4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + bn.js: "npm:^4.0.0" + brorand: "npm:^1.0.1" + bin: + miller-rabin: bin/miller-rabin + checksum: 10c0/26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 languageName: node linkType: hard @@ -17188,7 +21598,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -17197,6 +21607,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + "mime@npm:^3.0.0": version: 3.0.0 resolution: "mime@npm:3.0.0" @@ -17234,6 +21653,13 @@ __metadata: languageName: node linkType: hard +"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c + languageName: node + linkType: hard + "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -17503,6 +21929,13 @@ __metadata: languageName: node linkType: hard +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -17568,7 +22001,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6": +"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -17607,7 +22040,7 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 @@ -17721,6 +22154,13 @@ __metadata: languageName: node linkType: hard +"node-abort-controller@npm:^3.0.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 10c0/f7ad0e7a8e33809d4f3a0d1d65036a711c39e9d23e0319d80ebe076b9a3b4432b4d6b86a7fab65521de3f6872ffed36fc35d1327487c48eb88c517803403eda3 + languageName: node + linkType: hard + "node-addon-api@npm:^2.0.0": version: 2.0.2 resolution: "node-addon-api@npm:2.0.2" @@ -17825,6 +22265,41 @@ __metadata: languageName: node linkType: hard +"node-polyfill-webpack-plugin@npm:^2.0.1": + version: 2.0.1 + resolution: "node-polyfill-webpack-plugin@npm:2.0.1" + dependencies: + assert: "npm:^2.0.0" + browserify-zlib: "npm:^0.2.0" + buffer: "npm:^6.0.3" + console-browserify: "npm:^1.2.0" + constants-browserify: "npm:^1.0.0" + crypto-browserify: "npm:^3.12.0" + domain-browser: "npm:^4.22.0" + events: "npm:^3.3.0" + filter-obj: "npm:^2.0.2" + https-browserify: "npm:^1.0.0" + os-browserify: "npm:^0.3.0" + path-browserify: "npm:^1.0.1" + process: "npm:^0.11.10" + punycode: "npm:^2.1.1" + querystring-es3: "npm:^0.2.1" + readable-stream: "npm:^4.0.0" + stream-browserify: "npm:^3.0.0" + stream-http: "npm:^3.2.0" + string_decoder: "npm:^1.3.0" + timers-browserify: "npm:^2.0.12" + tty-browserify: "npm:^0.0.1" + type-fest: "npm:^2.14.0" + url: "npm:^0.11.0" + util: "npm:^0.12.4" + vm-browserify: "npm:^1.1.2" + peerDependencies: + webpack: ">=5" + checksum: 10c0/fc3dcef5888c10d0ff9924a389e5bd9d9c95109e31cb7c8a27775b17ef14a63b587365b43bfedd81eb5f93cb16a04c0e8234a2c623bfaa2f2a528a9e45811f91 + languageName: node + linkType: hard + "node-releases@npm:^2.0.13": version: 2.0.13 resolution: "node-releases@npm:2.0.13" @@ -18040,6 +22515,13 @@ __metadata: languageName: node linkType: hard +"objectorarray@npm:^1.0.5": + version: 1.0.5 + resolution: "objectorarray@npm:1.0.5" + checksum: 10c0/3d3db66e2052df85617ac31b98f8e51a7a883ebce24123018dacf286712aa513a0a84e82b4a6bef68889d5fc39cf08e630ee78df013023fc5161e1fdf3eaaa5a + languageName: node + linkType: hard + "obliterator@npm:^2.0.0": version: 2.0.4 resolution: "obliterator@npm:2.0.4" @@ -18065,6 +22547,15 @@ __metadata: languageName: node linkType: hard +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + "onboard-helpers@npm:*, onboard-helpers@workspace:packages/onboard-helpers": version: 0.0.0-use.local resolution: "onboard-helpers@workspace:packages/onboard-helpers" @@ -18132,7 +22623,7 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.4.0": +"open@npm:^8.0.4, open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" dependencies: @@ -18183,6 +22674,13 @@ __metadata: languageName: node linkType: hard +"os-browserify@npm:^0.3.0": + version: 0.3.0 + resolution: "os-browserify@npm:0.3.0" + checksum: 10c0/6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 + languageName: node + linkType: hard + "os-tmpdir@npm:~1.0.2": version: 1.0.2 resolution: "os-tmpdir@npm:1.0.2" @@ -18308,6 +22806,23 @@ __metadata: languageName: node linkType: hard +"pako@npm:~1.0.5": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe + languageName: node + linkType: hard + +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -18317,6 +22832,20 @@ __metadata: languageName: node linkType: hard +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.7": + version: 5.1.7 + resolution: "parse-asn1@npm:5.1.7" + dependencies: + asn1.js: "npm:^4.10.1" + browserify-aes: "npm:^1.2.0" + evp_bytestokey: "npm:^1.0.3" + hash-base: "npm:~3.0" + pbkdf2: "npm:^3.1.2" + safe-buffer: "npm:^5.2.1" + checksum: 10c0/05eb5937405c904eb5a7f3633bab1acc11f4ae3478a07ef5c6d81ce88c3c0e505ff51f9c7b935ebc1265c868343793698fc91025755a895d0276f620f95e8a82 + languageName: node + linkType: hard + "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -18329,6 +22858,30 @@ __metadata: languageName: node linkType: hard +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 + languageName: node + linkType: hard + +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 10c0/8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -18388,6 +22941,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -18402,7 +22962,14 @@ __metadata: languageName: node linkType: hard -"pbkdf2@npm:^3.0.17": +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.0.3, pbkdf2@npm:^3.1.2": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" dependencies: @@ -18436,7 +23003,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.1": +"picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": version: 1.1.0 resolution: "picocolors@npm:1.1.0" checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 @@ -18515,6 +23082,24 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^4.1.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: "npm:^6.3.0" + checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 + languageName: node + linkType: hard + "pkg-types@npm:^1.0.3": version: 1.0.3 resolution: "pkg-types@npm:1.0.3" @@ -18542,6 +23127,15 @@ __metadata: languageName: node linkType: hard +"pnp-webpack-plugin@npm:^1.7.0": + version: 1.7.0 + resolution: "pnp-webpack-plugin@npm:1.7.0" + dependencies: + ts-pnp: "npm:^1.1.6" + checksum: 10c0/79d1973ec0b04be6d44f15d5625991701a010dae28f2798d974d3aa164e8c60dc7fa22fd01a47fb6af369c4ba6585c3030d4deb775ccfecd7156594bc223d086 + languageName: node + linkType: hard + "pofile@npm:^1.1.4": version: 1.1.4 resolution: "pofile@npm:1.1.4" @@ -18549,6 +23143,15 @@ __metadata: languageName: node linkType: hard +"polished@npm:^4.2.2": + version: 4.3.1 + resolution: "polished@npm:4.3.1" + dependencies: + "@babel/runtime": "npm:^7.17.8" + checksum: 10c0/45480d4c7281a134281cef092f6ecc202a868475ff66a390fee6e9261386e16f3047b4de46a2f2e1cf7fb7aa8f52d30b4ed631a1e3bcd6f303ca31161d4f07fe + languageName: node + linkType: hard + "pony-cause@npm:^2.1.10": version: 2.1.11 resolution: "pony-cause@npm:2.1.11" @@ -18563,6 +23166,80 @@ __metadata: languageName: node linkType: hard +"postcss-loader@npm:^8.1.1": + version: 8.1.1 + resolution: "postcss-loader@npm:8.1.1" + dependencies: + cosmiconfig: "npm:^9.0.0" + jiti: "npm:^1.20.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/86cde94cd4c7c39892ef9bd4bf09342f422a21789654038694cf2b23c37c0ed9550c73608f656426a6631f0ade1eca82022781831e93d5362afe2f191388b85e + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.0.5 + resolution: "postcss-modules-local-by-default@npm:4.0.5" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^6.0.2" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/f4ad35abeb685ecb25f80c93d9fe23c8b89ee45ac4185f3560e701b4d7372f9b798577e79c5ed03b6d9c80bc923b001210c127c04ced781f43cda9e32b202a5b + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.0 + resolution: "postcss-modules-scope@npm:3.2.0" + dependencies: + postcss-selector-parser: "npm:^6.0.4" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/a2f5ffe372169b3feb8628cd785eb748bf12e344cfa57bce9e5cdc4fa5adcdb40d36daa86bb35dad53427703b185772aad08825b5783f745fcb1b6039454a84b + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: "npm:^5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + languageName: node + linkType: hard + "postcss-value-parser@npm:^3.3.0": version: 3.3.1 resolution: "postcss-value-parser@npm:3.3.1" @@ -18577,6 +23254,13 @@ __metadata: languageName: node linkType: hard +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 + languageName: node + linkType: hard + "postcss@npm:8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" @@ -18588,6 +23272,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.38": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 + languageName: node + linkType: hard + "preact@npm:^10.16.0": version: 10.22.0 resolution: "preact@npm:10.22.0" @@ -18677,6 +23372,27 @@ __metadata: languageName: node linkType: hard +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: "npm:^4.17.20" + renderkid: "npm:^3.0.0" + checksum: 10c0/dc292c087e2857b2e7592784ab31e37a40f3fa918caa11eba51f9fb2853e1d4d6e820b219917e35f5721d833cfd20fdf4f26ae931a90fd1ad0cae2125c345138 + languageName: node + linkType: hard + +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: "npm:^5.0.1" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^17.0.1" + checksum: 10c0/0cbda1031aa30c659e10921fa94e0dd3f903ecbbbe7184a729ad66f2b6e7f17891e8c7d7654c458fa4ccb1a411ffb695b4f17bbcd3fe075fabe181027c4040ed + languageName: node + linkType: hard + "pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -18766,6 +23482,16 @@ __metadata: languageName: node linkType: hard +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + "proxy-compare@npm:2.5.1": version: 2.5.1 resolution: "proxy-compare@npm:2.5.1" @@ -18805,6 +23531,20 @@ __metadata: languageName: node linkType: hard +"public-encrypt@npm:^4.0.0": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: "npm:^4.1.0" + browserify-rsa: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + parse-asn1: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 10c0/6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -18815,6 +23555,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^1.4.1": + version: 1.4.1 + resolution: "punycode@npm:1.4.1" + checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 + languageName: node + linkType: hard + "punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -18879,6 +23626,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.13.0, qs@npm:^6.12.3": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + "query-string@npm:6.13.5": version: 6.13.5 resolution: "query-string@npm:6.13.5" @@ -18902,6 +23658,13 @@ __metadata: languageName: node linkType: hard +"querystring-es3@npm:^0.2.1": + version: 0.2.1 + resolution: "querystring-es3@npm:0.2.1" + checksum: 10c0/476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 + languageName: node + linkType: hard + "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -18923,6 +23686,15 @@ __metadata: languageName: node linkType: hard +"queue@npm:6.0.2": + version: 6.0.2 + resolution: "queue@npm:6.0.2" + dependencies: + inherits: "npm:~2.0.3" + checksum: 10c0/cf987476cc72e7d3aaabe23ccefaab1cd757a2b5e0c8d80b67c9575a6b5e1198807ffd4f0948a3f118b149d1111d810ee773473530b77a5c606673cac2c9c996 + languageName: node + linkType: hard + "quick-format-unescaped@npm:^4.0.3": version: 4.0.4 resolution: "quick-format-unescaped@npm:4.0.4" @@ -18944,7 +23716,7 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:2.1.0, randombytes@npm:^2.1.0": +"randombytes@npm:2.1.0, randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: @@ -18953,7 +23725,24 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.4.1": +"randomfill@npm:^1.0.3": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: "npm:^2.0.5" + safe-buffer: "npm:^5.1.0" + checksum: 10c0/11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2, raw-body@npm:^2.4.1": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -19024,6 +23813,54 @@ __metadata: languageName: node linkType: hard +"react-colorful@npm:^5.1.2": + version: 5.6.1 + resolution: "react-colorful@npm:5.6.1" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/48eb73cf71e10841c2a61b6b06ab81da9fffa9876134c239bfdebcf348ce2a47e56b146338e35dfb03512c85966bfc9a53844fc56bc50154e71f8daee59ff6f0 + languageName: node + linkType: hard + +"react-confetti@npm:^6.1.0": + version: 6.1.0 + resolution: "react-confetti@npm:6.1.0" + dependencies: + tween-functions: "npm:^1.2.0" + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 + checksum: 10c0/5b4eb23eef564695f6db1d25b294ed31d5fa21ff4092c6a38e641f85cd10e3e0b50014366e3ac0f7cf772e73faaecd14614e5b11a5531336fa769dda8068ab59 + languageName: node + linkType: hard + +"react-docgen-typescript@npm:^2.2.2": + version: 2.2.2 + resolution: "react-docgen-typescript@npm:2.2.2" + peerDependencies: + typescript: ">= 4.3.x" + checksum: 10c0/d31a061a21b5d4b67d4af7bc742541fd9e16254bd32861cd29c52565bc2175f40421a3550d52b6a6b0d0478e7cc408558eb0060a0bdd2957b02cfceeb0ee1e88 + languageName: node + linkType: hard + +"react-docgen@npm:^7.0.0": + version: 7.0.3 + resolution: "react-docgen@npm:7.0.3" + dependencies: + "@babel/core": "npm:^7.18.9" + "@babel/traverse": "npm:^7.18.9" + "@babel/types": "npm:^7.18.9" + "@types/babel__core": "npm:^7.18.0" + "@types/babel__traverse": "npm:^7.18.0" + "@types/doctrine": "npm:^0.0.9" + "@types/resolve": "npm:^1.20.2" + doctrine: "npm:^3.0.0" + resolve: "npm:^1.22.1" + strip-indent: "npm:^4.0.0" + checksum: 10c0/74622750e60b287d2897a6887a2bd88303fadd84540247e162e9e970430864ae7b49152de043233d873a0aa7cffa406e5cd8fc1e8e2c277b8da73198b570f16b + languageName: node + linkType: hard + "react-dom@npm:^18.3.1": version: 18.3.1 resolution: "react-dom@npm:18.3.1" @@ -19036,6 +23873,20 @@ __metadata: languageName: node linkType: hard +"react-element-to-jsx-string@npm:^15.0.0": + version: 15.0.0 + resolution: "react-element-to-jsx-string@npm:15.0.0" + dependencies: + "@base2/pretty-print-object": "npm:1.0.1" + is-plain-object: "npm:5.0.0" + react-is: "npm:18.1.0" + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + checksum: 10c0/0d60a0ea758529c32a706d0c69d70b69fb94de3c46442fffdee34f08f51ffceddbb5395b41dfd1565895653e9f60f98ca525835be9d5db1f16d6b22be12f4cd4 + languageName: node + linkType: hard + "react-hook-form@npm:^7.53.0": version: 7.53.0 resolution: "react-hook-form@npm:7.53.0" @@ -19052,6 +23903,20 @@ __metadata: languageName: node linkType: hard +"react-is@npm:18.1.0": + version: 18.1.0 + resolution: "react-is@npm:18.1.0" + checksum: 10c0/558874e4c3bd9805a9294426e090919ee6901be3ab07f80b997c36b5a01a8d691112802e7438d146f6c82fd6495d8c030f276ef05ec3410057f8740a8d723f8c + languageName: node + linkType: hard + +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 10c0/2bdb6b93fbb1820b024b496042cce405c57e2f85e777c9aabd55f9b26d145408f9f74f5934676ffdc46f3dcff656d78413a6e43968e7b3f92eea35b3052e9053 + languageName: node + linkType: hard + "react-is@npm:^18.0.0": version: 18.2.0 resolution: "react-is@npm:18.2.0" @@ -19059,6 +23924,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^18.3.1": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 + languageName: node + linkType: hard + "react-lifecycles-compat@npm:^3.0.4": version: 3.0.4 resolution: "react-lifecycles-compat@npm:3.0.4" @@ -19079,6 +23951,13 @@ __metadata: languageName: node linkType: hard +"react-refresh@npm:^0.14.0": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: 10c0/875b72ef56b147a131e33f2abd6ec059d1989854b3ff438898e4f9310bfcc73acff709445b7ba843318a953cb9424bcc2c05af2b3d80011cee28f25aef3e2ebb + languageName: node + linkType: hard + "react-resize-detector@npm:^7.1.2": version: 7.1.2 resolution: "react-resize-detector@npm:7.1.2" @@ -19175,6 +24054,21 @@ __metadata: languageName: node linkType: hard +"react-transition-group@npm:^4.4.5": + version: 4.4.5 + resolution: "react-transition-group@npm:4.4.5" + dependencies: + "@babel/runtime": "npm:^7.5.5" + dom-helpers: "npm:^5.0.1" + loose-envify: "npm:^1.4.0" + prop-types: "npm:^15.6.2" + peerDependencies: + react: ">=16.6.0" + react-dom: ">=16.6.0" + checksum: 10c0/2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 + languageName: node + linkType: hard + "react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" @@ -19184,7 +24078,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.3.3": +"readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.8": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -19210,7 +24104,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.6.2 || ^4.4.2": +"readable-stream@npm:^3.6.2 || ^4.4.2, readable-stream@npm:^4.0.0": version: 4.5.2 resolution: "readable-stream@npm:4.5.2" dependencies: @@ -19268,6 +24162,19 @@ __metadata: languageName: node linkType: hard +"recast@npm:^0.23.5": + version: 0.23.9 + resolution: "recast@npm:0.23.9" + dependencies: + ast-types: "npm:^0.16.1" + esprima: "npm:~4.0.0" + source-map: "npm:~0.6.1" + tiny-invariant: "npm:^1.3.3" + tslib: "npm:^2.0.1" + checksum: 10c0/65d6e780351f0180ea4fe5c9593ac18805bf2b79977f5bedbbbf26f6d9b619ed0f6992c1bf9e06dd40fca1aea727ad6d62463cfb5d3a33342ee5a6e486305fe5 + languageName: node + linkType: hard + "recharts-scale@npm:^0.4.4": version: 0.4.5 resolution: "recharts-scale@npm:0.4.5" @@ -19298,6 +24205,16 @@ __metadata: languageName: node linkType: hard +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: 10c0/d64a6b5c0b50eb3ddce3ab770f866658a2b9998c678f797919ceb1b586bab9259b311407280bd80b804e2a7c7539b19238ae6a2a20c843f1a7fcff21d48c2eae + languageName: node + linkType: hard + "redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": version: 1.2.0 resolution: "redis-errors@npm:1.2.0" @@ -19348,6 +24265,15 @@ __metadata: languageName: node linkType: hard +"regenerate-unicode-properties@npm:^10.2.0": + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" + dependencies: + regenerate: "npm:^1.4.2" + checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 + languageName: node + linkType: hard + "regenerate@npm:^1.4.2": version: 1.4.2 resolution: "regenerate@npm:1.4.2" @@ -19378,6 +24304,13 @@ __metadata: languageName: node linkType: hard +"regex-parser@npm:^2.2.11": + version: 2.3.0 + resolution: "regex-parser@npm:2.3.0" + checksum: 10c0/de31c40e9d982735fdf5934c822cc5cafbe6a0f0909d9fef52e2bd4cc2198933c89fd5e7a17697f25591fdb5df386a088296612b45f0f8e194222070fc5b5cc7 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.4.3": version: 1.4.3 resolution: "regexp.prototype.flags@npm:1.4.3" @@ -19415,6 +24348,38 @@ __metadata: languageName: node linkType: hard +"regexpu-core@npm:^6.1.1": + version: 6.1.1 + resolution: "regexpu-core@npm:6.1.1" + dependencies: + regenerate: "npm:^1.4.2" + regenerate-unicode-properties: "npm:^10.2.0" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.11.0" + unicode-match-property-ecmascript: "npm:^2.0.0" + unicode-match-property-value-ecmascript: "npm:^2.1.0" + checksum: 10c0/07d49697e20f9b65977535abba4858b7f5171c13f7c366be53ec1886d3d5f69f1b98cc6a6e63cf271adda077c3366a4c851c7473c28bbd69cf5a6b6b008efc3e + languageName: node + linkType: hard + +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd + languageName: node + linkType: hard + +"regjsparser@npm:^0.11.0": + version: 0.11.1 + resolution: "regjsparser@npm:0.11.1" + dependencies: + jsesc: "npm:~3.0.2" + bin: + regjsparser: bin/parser + checksum: 10c0/be4b40981a596b31eacd84ee12cfa474f1d33a6c05f7e995e8ec9d5ad8f1c3fbf7a5b690a05c443e1f312a1c0b16d4ea0b3384596a61d4fda97aa322879bb3cd + languageName: node + linkType: hard + "regjsparser@npm:^0.9.1": version: 0.9.1 resolution: "regjsparser@npm:0.9.1" @@ -19426,6 +24391,53 @@ __metadata: languageName: node linkType: hard +"rehype-external-links@npm:^3.0.0": + version: 3.0.0 + resolution: "rehype-external-links@npm:3.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + "@ungap/structured-clone": "npm:^1.0.0" + hast-util-is-element: "npm:^3.0.0" + is-absolute-url: "npm:^4.0.0" + space-separated-tokens: "npm:^2.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/486b5db73d8fe72611d62b4eb0b56ec71025ea32bba764ad54473f714ca627be75e057ac29243763f85a77c3810f31727ce3e03c975b3803c1c98643d038e9ae + languageName: node + linkType: hard + +"rehype-slug@npm:^6.0.0": + version: 6.0.0 + resolution: "rehype-slug@npm:6.0.0" + dependencies: + "@types/hast": "npm:^3.0.0" + github-slugger: "npm:^2.0.0" + hast-util-heading-rank: "npm:^3.0.0" + hast-util-to-string: "npm:^3.0.0" + unist-util-visit: "npm:^5.0.0" + checksum: 10c0/51303c33d039c271cabe62161b49fa737be488f70ced62f00c165e47a089a99de2060050385e5c00d0df83ed30c7fa1c79a51b78508702836aefa51f7e7a6760 + languageName: node + linkType: hard + +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: "npm:^4.1.3" + dom-converter: "npm:^0.2.0" + htmlparser2: "npm:^6.1.0" + lodash: "npm:^4.17.21" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/24a9fae4cc50e731d059742d1b3eec163dc9e3872b12010d120c3fcbd622765d9cda41f79a1bbb4bf63c1d3442f18a08f6e1642cb5d7ebf092a0ce3f7a3bd143 + languageName: node + linkType: hard + "request-progress@npm:^3.0.0": version: 3.0.0 resolution: "request-progress@npm:3.0.0" @@ -19491,6 +24503,19 @@ __metadata: languageName: node linkType: hard +"resolve-url-loader@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-url-loader@npm:5.0.0" + dependencies: + adjust-sourcemap-loader: "npm:^4.0.0" + convert-source-map: "npm:^1.7.0" + loader-utils: "npm:^2.0.0" + postcss: "npm:^8.2.14" + source-map: "npm:0.6.1" + checksum: 10c0/53eef3620332f2fc35a4deffaa4395064b2ffd1bc28be380faa3f1e99c2fb7bbf0f705700b4539387d5b6c39586df54a92cd5d031606f19de4bf9e0ff1b6a522 + languageName: node + linkType: hard + "resolve@npm:1.17.0": version: 1.17.0 resolution: "resolve@npm:1.17.0" @@ -19513,7 +24538,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.22.4": +"resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -19561,7 +24586,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -19838,7 +24863,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -19888,6 +24913,30 @@ __metadata: languageName: node linkType: hard +"sass-loader@npm:^13.2.0": + version: 13.3.3 + resolution: "sass-loader@npm:13.3.3" + dependencies: + neo-async: "npm:^2.6.2" + peerDependencies: + fibers: ">= 3.1.0" + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: "*" + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + checksum: 10c0/5e955a4ffce35ee0a46fce677ce51eaa69587fb5371978588c83af00f49e7edc36dcf3bb559cbae27681c5e24a71284463ebe03a1fb65e6ecafa1db0620e3fc8 + languageName: node + linkType: hard + "scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" @@ -19908,6 +24957,29 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 + languageName: node + linkType: hard + "scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0": version: 3.0.1 resolution: "scrypt-js@npm:3.0.1" @@ -19965,6 +25037,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^6.0.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + "semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" @@ -19974,15 +25055,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - "semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -20003,7 +25075,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.3": +"semver@npm:^7.3.7, semver@npm:^7.6.2, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -20012,6 +25084,27 @@ __metadata: languageName: node linkType: hard +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + "serialize-javascript@npm:6.0.0": version: 6.0.0 resolution: "serialize-javascript@npm:6.0.0" @@ -20030,6 +25123,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -20063,7 +25168,7 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.5": +"setimmediate@npm:^1.0.4, setimmediate@npm:^1.0.5": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 @@ -20113,6 +25218,75 @@ __metadata: languageName: node linkType: hard +"sharp@npm:^0.33.3": + version: 0.33.5 + resolution: "sharp@npm:0.33.5" + dependencies: + "@img/sharp-darwin-arm64": "npm:0.33.5" + "@img/sharp-darwin-x64": "npm:0.33.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" + "@img/sharp-libvips-darwin-x64": "npm:1.0.4" + "@img/sharp-libvips-linux-arm": "npm:1.0.5" + "@img/sharp-libvips-linux-arm64": "npm:1.0.4" + "@img/sharp-libvips-linux-s390x": "npm:1.0.4" + "@img/sharp-libvips-linux-x64": "npm:1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" + "@img/sharp-linux-arm": "npm:0.33.5" + "@img/sharp-linux-arm64": "npm:0.33.5" + "@img/sharp-linux-s390x": "npm:0.33.5" + "@img/sharp-linux-x64": "npm:0.33.5" + "@img/sharp-linuxmusl-arm64": "npm:0.33.5" + "@img/sharp-linuxmusl-x64": "npm:0.33.5" + "@img/sharp-wasm32": "npm:0.33.5" + "@img/sharp-win32-ia32": "npm:0.33.5" + "@img/sharp-win32-x64": "npm:0.33.5" + color: "npm:^4.2.3" + detect-libc: "npm:^2.0.3" + semver: "npm:^7.6.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10c0/6b81421ddfe6ee524d8d77e325c5e147fef22884e1c7b1656dfd89a88d7025894115da02d5f984261bf2e6daa16f98cadd1721c4ba408b4212b1d2a60f233484 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -20367,6 +25541,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + "source-map-support@npm:^0.5.13, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -20377,14 +25558,21 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0": +"source-map@npm:0.6.1, source-map@npm:^0.6.0, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard -"source-map@npm:^0.7.4": +"source-map@npm:^0.5.7": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"source-map@npm:^0.7.3, source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc @@ -20400,6 +25588,13 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 + languageName: node + linkType: hard + "split-on-first@npm:^1.0.0": version: 1.1.0 resolution: "split-on-first@npm:1.1.0" @@ -20451,6 +25646,13 @@ __metadata: languageName: node linkType: hard +"stackframe@npm:^1.3.4": + version: 1.3.4 + resolution: "stackframe@npm:1.3.4" + checksum: 10c0/18410f7a1e0c5d211a4effa83bdbf24adbe8faa8c34db52e1cd3e89837518c592be60b60d8b7270ac53eeeb8b807cd11b399a41667f6c9abb41059c3ccc8a989 + languageName: node + linkType: hard + "stacktrace-parser@npm:^0.1.10": version: 0.1.10 resolution: "stacktrace-parser@npm:0.1.10" @@ -20481,6 +25683,19 @@ __metadata: languageName: node linkType: hard +"storybook@npm:^8.3.5": + version: 8.3.5 + resolution: "storybook@npm:8.3.5" + dependencies: + "@storybook/core": "npm:8.3.5" + bin: + getstorybook: ./bin/index.cjs + sb: ./bin/index.cjs + storybook: ./bin/index.cjs + checksum: 10c0/8f8ffe54c5dad8bad9d8701f63f4670cf3f388acd0e21e5bedeb86ebd2af5adf905024b6b9a2c46cf1199a0c1c86a97fddfa1fc70546149e18263b3b47c80585 + languageName: node + linkType: hard + "stream-browserify@npm:^3.0.0": version: 3.0.0 resolution: "stream-browserify@npm:3.0.0" @@ -20491,6 +25706,18 @@ __metadata: languageName: node linkType: hard +"stream-http@npm:^3.2.0": + version: 3.2.0 + resolution: "stream-http@npm:3.2.0" + dependencies: + builtin-status-codes: "npm:^3.0.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + xtend: "npm:^4.0.2" + checksum: 10c0/f128fb8076d60cd548f229554b6a1a70c08a04b7b2afd4dbe7811d20f27f7d4112562eb8bce86d72a8691df3b50573228afcf1271e55e81f981536c67498bc41 + languageName: node + linkType: hard + "stream-shift@npm:^1.0.0": version: 1.0.1 resolution: "stream-shift@npm:1.0.1" @@ -20732,6 +25959,24 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: 10c0/ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 + languageName: node + linkType: hard + +"strip-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-indent@npm:4.0.0" + dependencies: + min-indent: "npm:^1.0.1" + checksum: 10c0/6b1fb4e22056867f5c9e7a6f3f45922d9a2436cac758607d58aeaac0d3b16ec40b1c43317de7900f1b8dd7a4107352fa47fb960f2c23566538c51e8585c8870e + languageName: node + linkType: hard + "strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -20755,6 +26000,15 @@ __metadata: languageName: node linkType: hard +"style-loader@npm:^3.3.1": + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/8f8027fc5c6e91400cbb60066e7db3315810f8eaa0d19b2a254936eb0bec399ba8a7043b1789da9d05ab7c3ba50faf9267765ae0bf3571e48aa34ecdc774be37 + languageName: node + linkType: hard + "styled-components@npm:5.3.11": version: 5.3.11 resolution: "styled-components@npm:5.3.11" @@ -20793,6 +26047,29 @@ __metadata: languageName: node linkType: hard +"styled-jsx@npm:^5.1.6": + version: 5.1.6 + resolution: "styled-jsx@npm:5.1.6" + dependencies: + client-only: "npm:0.0.1" + peerDependencies: + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + peerDependenciesMeta: + "@babel/core": + optional: true + babel-plugin-macros: + optional: true + checksum: 10c0/ace50e7ea5ae5ae6a3b65a50994c51fca6ae7df9c7ecfd0104c36be0b4b3a9c5c1a2374d16e2a11e256d0b20be6d47256d768ecb4f91ab390f60752a075780f5 + languageName: node + linkType: hard + +"stylis@npm:4.2.0": + version: 4.2.0 + resolution: "stylis@npm:4.2.0" + checksum: 10c0/a7128ad5a8ed72652c6eba46bed4f416521bc9745a460ef5741edc725252cebf36ee45e33a8615a7057403c93df0866ab9ee955960792db210bb80abd5ac6543 + languageName: node + linkType: hard + "superstruct@npm:^0.14.2": version: 0.14.2 resolution: "superstruct@npm:0.14.2" @@ -20917,7 +26194,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 @@ -20985,6 +26262,37 @@ __metadata: languageName: node linkType: hard +"telejson@npm:^7.2.0": + version: 7.2.0 + resolution: "telejson@npm:7.2.0" + dependencies: + memoizerific: "npm:^1.11.3" + checksum: 10c0/d26e6cc93e54bfdcdb207b49905508c5db45862e811a2e2193a735409e47b14530e1c19351618a3e03ad2fd4ffc3759364fcd72851aba2df0300fab574b6151c + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.1, terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + languageName: node + linkType: hard + "terser-webpack-plugin@npm:^5.3.7": version: 5.3.9 resolution: "terser-webpack-plugin@npm:5.3.9" @@ -21007,6 +26315,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.10.0, terser@npm:^5.26.0": + version: 5.34.1 + resolution: "terser@npm:5.34.1" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/51c7d704c5c4ae88bf937124112c9972aed4e1fd29d805cc2d86e0f54cd631ecd4e69db5bb3c1e3b450c741c86e2313328bea0fde925329e8a31a07a7941723c + languageName: node + linkType: hard + "terser@npm:^5.16.8": version: 5.17.6 resolution: "terser@npm:5.17.6" @@ -21081,6 +26403,15 @@ __metadata: languageName: node linkType: hard +"timers-browserify@npm:^2.0.12": + version: 2.0.12 + resolution: "timers-browserify@npm:2.0.12" + dependencies: + setimmediate: "npm:^1.0.4" + checksum: 10c0/98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 + languageName: node + linkType: hard + "timers-ext@npm:^0.1.7": version: 0.1.7 resolution: "timers-ext@npm:0.1.7" @@ -21101,6 +26432,13 @@ __metadata: languageName: node linkType: hard +"tiny-invariant@npm:^1.3.1, tiny-invariant@npm:^1.3.3": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 10c0/65af4a07324b591a059b35269cd696aba21bef2107f29b9f5894d83cc143159a204b299553435b03874ebb5b94d019afa8b8eff241c8a4cfee95872c2e1c1c4a + languageName: node + linkType: hard + "tiny-secp256k1@npm:^1.1.6": version: 1.1.6 resolution: "tiny-secp256k1@npm:1.1.6" @@ -21122,6 +26460,20 @@ __metadata: languageName: node linkType: hard +"tinyrainbow@npm:^1.2.0": + version: 1.2.0 + resolution: "tinyrainbow@npm:1.2.0" + checksum: 10c0/7f78a4b997e5ba0f5ecb75e7ed786f30bab9063716e7dff24dd84013fb338802e43d176cb21ed12480561f5649a82184cf31efb296601a29d38145b1cdb4c192 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.0": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10c0/55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 + languageName: node + linkType: hard + "tmp@npm:0.0.33, tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -21207,6 +26559,34 @@ __metadata: languageName: node linkType: hard +"ts-dedent@npm:^2.0.0, ts-dedent@npm:^2.2.0": + version: 2.2.0 + resolution: "ts-dedent@npm:2.2.0" + checksum: 10c0/175adea838468cc2ff7d5e97f970dcb798bbcb623f29c6088cb21aa2880d207c5784be81ab1741f56b9ac37840cbaba0c0d79f7f8b67ffe61c02634cafa5c303 + languageName: node + linkType: hard + +"ts-pnp@npm:^1.1.6": + version: 1.2.0 + resolution: "ts-pnp@npm:1.2.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/ff32b4f810f9d99f676d70fe2c0e327cb6c812214bd4fc7135870b039f9e85a85b2c20f8fe030d9bd36e9598a12faa391f10aecb95df624b92f1af6bd47dc397 + languageName: node + linkType: hard + +"tsconfig-paths-webpack-plugin@npm:^4.0.1": + version: 4.1.0 + resolution: "tsconfig-paths-webpack-plugin@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + enhanced-resolve: "npm:^5.7.0" + tsconfig-paths: "npm:^4.1.2" + checksum: 10c0/c030e867e70a3f6d1799fdffa209c3a35e1435ad99aac01946b9ebb0fa8208b7b508c1dfe8c8e13d6a2ef70c75b4db062fbfd3c1f3362c69b6c65ffd4a50e226 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -21219,6 +26599,17 @@ __metadata: languageName: node linkType: hard +"tsconfig-paths@npm:^4.0.0, tsconfig-paths@npm:^4.1.2, tsconfig-paths@npm:^4.2.0": + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" + dependencies: + json5: "npm:^2.2.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea + languageName: node + linkType: hard + "tsconfig@npm:*, tsconfig@workspace:packages/tsconfig": version: 0.0.0-use.local resolution: "tsconfig@workspace:packages/tsconfig" @@ -21239,6 +26630,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.0.0, tslib@npm:^2.0.1": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 + languageName: node + linkType: hard + "tslib@npm:^2.0.3": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -21260,6 +26658,13 @@ __metadata: languageName: node linkType: hard +"tty-browserify@npm:^0.0.1": + version: 0.0.1 + resolution: "tty-browserify@npm:0.0.1" + checksum: 10c0/5e34883388eb5f556234dae75b08e069b9e62de12bd6d87687f7817f5569430a6dfef550b51dbc961715ae0cd0eb5a059e6e3fc34dc127ea164aa0f9b5bb033d + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -21340,6 +26745,13 @@ __metadata: languageName: node linkType: hard +"tween-functions@npm:^1.2.0": + version: 1.2.0 + resolution: "tween-functions@npm:1.2.0" + checksum: 10c0/7e59295b8b0ee4132ed2fe335f56a9db5c87056dad6b6fd3011be72239fd20398003ddb4403bc98ad9f5c94468890830f64016edbbde35581faf95b32cda8305 + languageName: node + linkType: hard + "tweetnacl-util@npm:^0.15.1": version: 0.15.1 resolution: "tweetnacl-util@npm:0.15.1" @@ -21391,6 +26803,30 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^2.14.0, type-fest@npm:^2.19.0, type-fest@npm:~2.19": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb + languageName: node + linkType: hard + +"type-fest@npm:^4.26.1": + version: 4.26.1 + resolution: "type-fest@npm:4.26.1" + checksum: 10c0/d2719ff8d380befe8a3c61068f37f28d6fa2849fd140c5d2f0f143099e371da6856aad7c97e56b83329d45bfe504afe9fd936a7cff600cc0d46aa9ffb008d6c6 + languageName: node + linkType: hard + +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + languageName: node + linkType: hard + "type@npm:^1.0.1": version: 1.2.0 resolution: "type@npm:1.2.0" @@ -21591,6 +27027,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + "undici@npm:^5.14.0": version: 5.28.4 resolution: "undici@npm:5.28.4" @@ -21676,6 +27119,36 @@ __metadata: languageName: node linkType: hard +"unist-util-is@npm:^6.0.0": + version: 6.0.0 + resolution: "unist-util-is@npm:6.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + checksum: 10c0/9419352181eaa1da35eca9490634a6df70d2217815bb5938a04af3a662c12c5607a2f1014197ec9c426fbef18834f6371bfdb6f033040fa8aa3e965300d70e7e + languageName: node + linkType: hard + +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-visit-parents@npm:6.0.1" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + checksum: 10c0/51b1a5b0aa23c97d3e03e7288f0cdf136974df2217d0999d3de573c05001ef04cccd246f51d2ebdfb9e8b0ed2704451ad90ba85ae3f3177cf9772cef67f56206 + languageName: node + linkType: hard + +"unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" + dependencies: + "@types/unist": "npm:^3.0.0" + unist-util-is: "npm:^6.0.0" + unist-util-visit-parents: "npm:^6.0.0" + checksum: 10c0/51434a1d80252c1540cce6271a90fd1a106dbe624997c09ed8879279667fb0b2d3a685e02e92bf66598dcbe6cdffa7a5f5fb363af8fdf90dda6c855449ae39a5 + languageName: node + linkType: hard + "universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" @@ -21697,13 +27170,28 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:1.0.0": +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c languageName: node linkType: hard +"unplugin@npm:^1.3.1": + version: 1.14.1 + resolution: "unplugin@npm:1.14.1" + dependencies: + acorn: "npm:^8.12.1" + webpack-virtual-modules: "npm:^0.6.2" + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true + checksum: 10c0/a74342b8f0cbbdc7b1da1f78f1898c0c915e3f67b22281fcd61a5495a585f4a1fd0fc270a7e59643a41c138c94c852cb69ea17af72965fb15f86f18ee76c2ed1 + languageName: node + linkType: hard + "unraw@npm:^3.0.0": version: 3.0.0 resolution: "unraw@npm:3.0.0" @@ -21873,6 +27361,16 @@ __metadata: languageName: node linkType: hard +"url@npm:^0.11.0": + version: 0.11.4 + resolution: "url@npm:0.11.4" + dependencies: + punycode: "npm:^1.4.1" + qs: "npm:^6.12.3" + checksum: 10c0/cc93405ae4a9b97a2aa60ca67f1cb1481c0221cb4725a7341d149be5e2f9cfda26fd432d64dbbec693d16593b68b8a46aad8e5eab21f814932134c9d8620c662 + languageName: node + linkType: hard + "usb@npm:^2.9.0": version: 2.10.0 resolution: "usb@npm:2.10.0" @@ -21922,14 +27420,14 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 languageName: node linkType: hard -"util@npm:^0.12.0, util@npm:^0.12.4": +"util@npm:^0.12.0, util@npm:^0.12.4, util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -21942,7 +27440,21 @@ __metadata: languageName: node linkType: hard -"uuid@npm:9.0.1, uuid@npm:^9.0.1": +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 10c0/2791604e09ca4f77ae314df83e80d1805f867eb5c7e13e7413caee01273c278cf2c9a3670d8d25c889a877f7b149d892fe61b0181a81654b425e9622ab23d42e + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 + languageName: node + linkType: hard + +"uuid@npm:9.0.1, uuid@npm:^9.0.0, uuid@npm:^9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" bin: @@ -22009,6 +27521,13 @@ __metadata: languageName: node linkType: hard +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + "vast@npm:^1.0.40": version: 1.0.40 resolution: "vast@npm:1.0.40" @@ -22145,6 +27664,13 @@ __metadata: languageName: node linkType: hard +"vm-browserify@npm:^1.1.2": + version: 1.1.2 + resolution: "vm-browserify@npm:1.1.2" + checksum: 10c0/0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b + languageName: node + linkType: hard + "vue-eslint-parser@npm:^9.1.0": version: 9.4.3 resolution: "vue-eslint-parser@npm:9.4.3" @@ -22187,6 +27713,16 @@ __metadata: languageName: node linkType: hard +"watchpack@npm:^2.4.1": + version: 2.4.2 + resolution: "watchpack@npm:2.4.2" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -22253,6 +27789,35 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^6.1.2": + version: 6.1.3 + resolution: "webpack-dev-middleware@npm:6.1.3" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^3.4.12" + mime-types: "npm:^2.1.31" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10c0/0f31670835f3c0f588392235a6183facf314c0dca312467254a56458142be6fee746f7f6b304f281c740364fd36f256c597ab37d87e5971633cee2f70a8cd5e7 + languageName: node + linkType: hard + +"webpack-hot-middleware@npm:^2.25.1": + version: 2.26.1 + resolution: "webpack-hot-middleware@npm:2.26.1" + dependencies: + ansi-html-community: "npm:0.0.8" + html-entities: "npm:^2.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/13a3e78009e373b4ee990ffe1d4d49046e9893148a7106f063e11f962d02b744ea58b1dec25f5e76723c9dce678b9e68c883e7f2af2940aaf4de7aab31264c83 + languageName: node + linkType: hard + "webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" @@ -22260,6 +27825,49 @@ __metadata: languageName: node linkType: hard +"webpack-virtual-modules@npm:^0.6.0, webpack-virtual-modules@npm:^0.6.2": + version: 0.6.2 + resolution: "webpack-virtual-modules@npm:0.6.2" + checksum: 10c0/5ffbddf0e84bf1562ff86cf6fcf039c74edf09d78358a6904a09bbd4484e8bb6812dc385fe14330b715031892dcd8423f7a88278b57c9f5002c84c2860179add + languageName: node + linkType: hard + +"webpack@npm:5": + version: 5.95.0 + resolution: "webpack@npm:5.95.0" + dependencies: + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.7.1" + acorn-import-attributes: "npm:^1.9.5" + browserslist: "npm:^4.21.10" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.17.1" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/b9e6d0f8ebcbf0632494ac0b90fe4acb8f4a9b83f7ace4a67a15545a36fe58599c912ab58e625e1bf58ab3b0916c75fe99da6196d412ee0cab0b5065edd84238 + languageName: node + linkType: hard + "webpack@npm:^5.83.1": version: 5.83.1 resolution: "webpack@npm:5.83.1" @@ -22592,6 +28200,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.2.3": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + languageName: node + linkType: hard + "xmlhttprequest-ssl@npm:~2.0.0": version: 2.0.0 resolution: "xmlhttprequest-ssl@npm:2.0.0" @@ -22599,6 +28222,13 @@ __metadata: languageName: node linkType: hard +"xtend@npm:^4.0.2": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" From b39ead11469e84008e5a47964eb09a055faeeb20 Mon Sep 17 00:00:00 2001 From: Ignat Date: Fri, 20 Sep 2024 15:55:30 +0500 Subject: [PATCH 004/137] chore: implement `storybook` main preferences --- packages/curve-ui-kit/.storybook/main.ts | 77 +++++ .../curve-ui-kit/.storybook/preview-head.html | 17 ++ packages/curve-ui-kit/.storybook/preview.tsx | 55 ++++ .../curve-ui-kit/public/assets/sample.png | Bin 0 -> 31814 bytes .../public/fonts/Hubot-Sans.woff2 | Bin 0 -> 170164 bytes .../curve-ui-kit/public/fonts/Mona-Sans.woff2 | Bin 0 -> 137140 bytes .../src/pages/Introduction/Introduction.mdx | 275 ++++++++++++++++++ 7 files changed, 424 insertions(+) create mode 100644 packages/curve-ui-kit/.storybook/main.ts create mode 100644 packages/curve-ui-kit/.storybook/preview-head.html create mode 100644 packages/curve-ui-kit/.storybook/preview.tsx create mode 100644 packages/curve-ui-kit/public/assets/sample.png create mode 100644 packages/curve-ui-kit/public/fonts/Hubot-Sans.woff2 create mode 100644 packages/curve-ui-kit/public/fonts/Mona-Sans.woff2 create mode 100644 packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx diff --git a/packages/curve-ui-kit/.storybook/main.ts b/packages/curve-ui-kit/.storybook/main.ts new file mode 100644 index 000000000..bff88fe59 --- /dev/null +++ b/packages/curve-ui-kit/.storybook/main.ts @@ -0,0 +1,77 @@ +import { join, dirname } from 'path' +import type { StorybookConfig } from '@storybook/nextjs' +import path from 'path' + +/** + * This function is used to resolve the absolute path of a package. + * It is needed in projects that use Yarn PnP or are set up within a monorepo. + */ +function getAbsolutePath(value) { + return dirname(require.resolve(join(value, 'package.json'))) +} + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|mts|ts|tsx)'], + staticDirs: ['../public'], + addons: [ + getAbsolutePath('@storybook/addon-essentials'), + getAbsolutePath('@chromatic-com/storybook'), + getAbsolutePath('@storybook/addon-interactions'), + getAbsolutePath('@storybook/addon-themes'), + getAbsolutePath('@storybook/addon-a11y'), + ], + + framework: { + name: getAbsolutePath('@storybook/nextjs'), + options: {}, + }, + + core: { + disableTelemetry: true, + }, + + docs: {}, + typescript: {}, + + // TODO: wait for fix https://github.com/storybookjs/storybook/issues/12129 + // typescript: { + // reactDocgen: react-docgen-typescript, + // reactDocgenTypescriptOptions: { + // include: ['**/**.tsx', 'src/entities/theme/types/button.d.ts', '../src/**/*.ts', '../src/**/*.d.ts'], + // tsconfigPath: '../tsconfig.json', + // // Speeds up Storybook build time + // compilerOptions: { + // allowSyntheticDefaultImports: false, + // esModuleInterop: false, + // // include: ['../src/**/*.tsx', '../src/**/*.ts', '../src/**/*.d.ts'], + // }, + // // Makes union prop types like variant and size appear as select controls + // shouldExtractLiteralValuesFromEnum: true, + // // Makes string and boolean types that can be undefined appear as inputs and switches + // shouldRemoveUndefinedFromOptional: true, + // // Filter out third-party props from node_modules except @mui packages + // propFilter: (prop) => + // prop.parent ? /@mui/.test(prop.parent.fileName) || !/node_modules/.test(prop.parent.fileName) : true, + // }, + // }, + + webpackFinal: async (config) => { + if (config.resolve) { + config.resolve.alias = { + ...config.resolve.alias, + '@': path.resolve(__dirname, '../src'), + } + } + return config + }, + + previewHead: (head) => ` + ${head} + + `, +} +export default config diff --git a/packages/curve-ui-kit/.storybook/preview-head.html b/packages/curve-ui-kit/.storybook/preview-head.html new file mode 100644 index 000000000..8361eea70 --- /dev/null +++ b/packages/curve-ui-kit/.storybook/preview-head.html @@ -0,0 +1,17 @@ + + + + diff --git a/packages/curve-ui-kit/.storybook/preview.tsx b/packages/curve-ui-kit/.storybook/preview.tsx new file mode 100644 index 000000000..996d83e91 --- /dev/null +++ b/packages/curve-ui-kit/.storybook/preview.tsx @@ -0,0 +1,55 @@ +import { CssBaseline, ThemeProvider } from '@mui/material' +import { withThemeFromJSXProvider } from '@storybook/addon-themes' +import type { Decorator, Preview, ReactRenderer } from '@storybook/react' + +import { chadTheme, darkTheme, lightTheme } from '../src/entities/themes' + +console.log('lightTheme', lightTheme) +export const decorators: Decorator[] = [ + withThemeFromJSXProvider({ + themes: { + light: lightTheme, + dark: darkTheme, + chad: chadTheme, + }, + defaultTheme: 'light', + Provider: ThemeProvider, + GlobalStyles: CssBaseline, + }), +] + +const preview: Preview = { + decorators: decorators, + parameters: { + themes: { + light: lightTheme, + dark: darkTheme, + chad: chadTheme, + }, + controls: { + expanded: true, // Adds the description and default columns + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + docs: { + // TODO: fix docs container theme + // container: ({ children, context }) => { + // const theme = context.store.userGlobals.globals.theme + // return ( + // + // + // + // {children} + // + // + // ) + // }, + }, + layout: 'centered', + }, + tags: ['autodocs'], +} + +export default preview diff --git a/packages/curve-ui-kit/public/assets/sample.png b/packages/curve-ui-kit/public/assets/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..57b2347b42740d79e8396bc18bd14a259c893c77 GIT binary patch literal 31814 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 z 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 Sb?G)iz>lsr;GWlnhyFkLVDBdY literal 0 HcmV?d00001 diff --git a/packages/curve-ui-kit/public/fonts/Hubot-Sans.woff2 b/packages/curve-ui-kit/public/fonts/Hubot-Sans.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c8281213136fda52ff9d74167f5be12558cb74b5 GIT binary patch literal 170164 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 ZG(Giu+waHE=KLP3?{_}_7ii^D008U2F!ule literal 0 HcmV?d00001 diff --git a/packages/curve-ui-kit/public/fonts/Mona-Sans.woff2 b/packages/curve-ui-kit/public/fonts/Mona-Sans.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d88d5ff27bea51dfc9954392acd7933d642415c9 GIT binary patch literal 137140 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 z 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ෝ((*zrDe-Wb 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 z∈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 L`RRHRxd#9MmJhQ4 literal 0 HcmV?d00001 diff --git a/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx b/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx new file mode 100644 index 000000000..dd8d2f7bd --- /dev/null +++ b/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx @@ -0,0 +1,275 @@ +import { Meta } from '@storybook/blocks' + +export const RightArrow = () => ( + + + +) + +export const GitHubIcon = () => ( + + + + +) + +export const DiscordIcon = () => ( + + + + + + + + + + + + + + + +) + + + +
+
+ # Welcome to Curve.fi UI Kit + + This Storybook showcases the UI components and design system for Curve.fi. It serves as a living documentation and development environment for our frontend team. + +
+ +
+
+ Component library illustration +

Component Library

+

Explore our collection of reusable UI components built with Material-UI (MUI) and styled according to Curve.fi's design system.

+ View Components +
+
+ State management illustration +

State Management

+

Learn how we manage global state with Zustand and handle data fetching using Tanstack Query (React Query).

+ Read Guide +
+
+ Testing illustration +

Testing

+

Discover our testing strategies using Cypress for end-to-end tests and component testing.

+ Learn More +
+
+
+ +
+
+ # Key Features + + Our UI Kit is designed to streamline development and ensure consistency across Curve.fi's frontend applications. + +
+ +
+
+

TypeScript

+

All components and utilities are written in TypeScript for improved type safety and developer experience.

+
+
+

Feature-Sliced Design

+

Our project structure follows the Feature-Sliced Design methodology for better organization and scalability.

+
+
+

Material-UI (MUI)

+

We use MUI as our component library foundation, customized to fit Curve.fi's unique design language.

+
+
+

Zustand & Tanstack Query

+

State management is handled by Zustand for global state and Tanstack Query for data fetching and caching.

+
+
+

React Hook Form

+

Forms are managed using React Hook Form for efficient and flexible form handling.

+
+
+

Blockchain Integration

+

We use curve-js, curve-lending-js, and curve-stablecoin-js for seamless blockchain interactions.

+
+
+
+ +
+
+ +
+

Contribute on GitHub

+

Help us improve the Curve.fi UI Kit by contributing to our repository.

+ + Visit Repository + + +
+
+
+ +
+

Join Our Community

+

Connect with other Curve.fi developers and get support on Discord.

+ + Join Discord + + +
+
+
+ Curve.fi logo +
+

Curve.fi Website

+

Visit the main Curve.fi website to learn more about our DeFi platform.

+ + Go to Curve.fi + + +
+
+
+ + From 815d99b1161e8e03a63907b3d98200289a890669 Mon Sep 17 00:00:00 2001 From: Ignat Date: Sat, 21 Sep 2024 15:55:30 +0500 Subject: [PATCH 005/137] feat: implement basic `MUI` theme --- .../src/shared/lib/basic-theme/basic.ts | 8 +++++ .../src/shared/lib/basic-theme/breakpoints.ts | 11 +++++++ .../src/shared/lib/basic-theme/config.ts | 8 +++++ .../shared/lib/basic-theme/font-variants.d.ts | 2 ++ .../src/shared/lib/basic-theme/index.ts | 3 ++ .../lib/basic-theme/override-breakpoint.d.ts | 14 ++++++++ .../lib/basic-theme/override-palette.d.ts | 32 +++++++++++++++++++ .../src/shared/lib/basic-theme/theme.types.ts | 1 + .../curve-ui-kit/src/shared/lib/capitalize.ts | 32 +++++++++++++++++++ .../src/shared/lib/object-properties.ts | 13 ++++++++ 10 files changed, 124 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/basic.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/breakpoints.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/font-variants.d.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/index.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/override-breakpoint.d.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/override-palette.d.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/basic-theme/theme.types.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/capitalize.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/object-properties.ts diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/basic.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/basic.ts new file mode 100644 index 000000000..c9ace1ba8 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/basic.ts @@ -0,0 +1,8 @@ +import { createTheme as createMuiTheme } from '@mui/material/styles' + +import { breakpoints } from './breakpoints' + +export const basicMuiTheme = createMuiTheme({ + breakpoints, + direction: 'ltr', +}) diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/breakpoints.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/breakpoints.ts new file mode 100644 index 000000000..072d4bb20 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/breakpoints.ts @@ -0,0 +1,11 @@ +import type { BreakpointsOptions } from '@mui/material' + +export const breakpoints: BreakpointsOptions = { + keys: ['mobile', 'tablet', 'desktop'] as const, + values: { + mobile: 0, + tablet: 640, + desktop: 1200, + }, + unit: 'px', +} diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts new file mode 100644 index 000000000..d72039807 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts @@ -0,0 +1,8 @@ +import { FontFamilyBasic, FontFamilyChad } from '@/shared/ui/Typography' +import type { ThemeKey } from './theme.types' + +export const ThemeFontFamily: Record = { + light: FontFamilyBasic, + dark: FontFamilyBasic, + chad: FontFamilyChad, +} diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/font-variants.d.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/font-variants.d.ts new file mode 100644 index 000000000..85a0dfc7e --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/font-variants.d.ts @@ -0,0 +1,2 @@ +declare module '*.woff' +declare module '*.woff2' diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/index.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/index.ts new file mode 100644 index 000000000..99a429987 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/index.ts @@ -0,0 +1,3 @@ +export * from './theme.types' +export * from './basic' +export * from './config' diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/override-breakpoint.d.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/override-breakpoint.d.ts new file mode 100644 index 000000000..29bf82a89 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/override-breakpoint.d.ts @@ -0,0 +1,14 @@ +declare module 'global' { + module '@mui/material' { + interface BreakpointOverrides { + xs: false + sm: false + md: false + lg: false + xl: false + mobile: true + tablet: true + desktop: true + } + } +} diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/override-palette.d.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/override-palette.d.ts new file mode 100644 index 000000000..ca1c6a085 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/override-palette.d.ts @@ -0,0 +1,32 @@ +declare module 'global' { + declare module '@mui/material/styles' { + interface Color { + 10: string + 25: string + 75: string + 150: string + 750: string + 850: string + 950: string + 975: string + } + + interface Palette { + neutral: PaletteColor + tertiary: PaletteColor + green: PartialColor + violet: PartialColor + red: PartialColor + blue: PartialColor + } + + interface PaletteOptions { + neutral: PaletteColorOptions + tertiary: PaletteColorOptions + green: PartialColor + violet: PartialColor + red: PartialColor + blue: PartialColor + } + } +} diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/theme.types.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/theme.types.ts new file mode 100644 index 000000000..b4f4b22cc --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/theme.types.ts @@ -0,0 +1 @@ +export type ThemeKey = 'light' | 'dark' | 'chad' diff --git a/packages/curve-ui-kit/src/shared/lib/capitalize.ts b/packages/curve-ui-kit/src/shared/lib/capitalize.ts new file mode 100644 index 000000000..d1954a1e8 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/capitalize.ts @@ -0,0 +1,32 @@ +import { escapeRegExp } from 'lodash' + +/** + * Capitalizes the first letter of a given string. + * @param {string} str - The input string to capitalize. + * @returns {string} The input string with its first letter capitalized. + */ +export const capitalizeFirstLetter = (str: string): string => { + if (str.length === 0) return str + return str.charAt(0).toUpperCase() + str.slice(1) +} + +/** + * Capitalizes specific words in a given text, even when they are part of longer words. + * @param {string} text - The input text to process. + * @param {string[]} [wordsToCapitalize=[]] - An array of words to capitalize. + * @returns {string} The input text with specified words capitalized. + */ +export const capitalizeSpecificWords = (text: string, wordsToCapitalize: string[] = []): string => { + if (wordsToCapitalize.length === 0) return text + + const escapedWords = wordsToCapitalize.map((word) => escapeRegExp(word)) + const pattern = new RegExp(`(${escapedWords.join('|')})`, 'gi') + + return text.replace(pattern, (match) => { + const lowercaseMatch = match.toLowerCase() + if (wordsToCapitalize.includes(lowercaseMatch)) { + return capitalizeFirstLetter(lowercaseMatch) + } + return match + }) +} diff --git a/packages/curve-ui-kit/src/shared/lib/object-properties.ts b/packages/curve-ui-kit/src/shared/lib/object-properties.ts new file mode 100644 index 000000000..d580f17dd --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/object-properties.ts @@ -0,0 +1,13 @@ +/** + * Removes a specified property from an object and returns a new object without that property. + * + * @template T - The type of the input object. + * @template K - The type of the key to be omitted (must be a key of T). + * @param {T} obj - The original object from which to omit a property. + * @param {K} propertyToOmit - The key of the property to be omitted. + * @returns {Omit} A new object with all properties of the original object except the omitted one. + */ +export function omitProperty(obj: T, propertyToOmit: K): Omit { + const { [propertyToOmit]: _, ...rest } = obj + return rest +} From f4e34e9d74c8726158686d0f2a541eb5be9700fe Mon Sep 17 00:00:00 2001 From: Ignat Date: Fri, 27 Sep 2024 15:55:30 +0500 Subject: [PATCH 006/137] feat: implement `CssBaseline` ui component --- .../src/shared/ui/CssBaseline/index.ts | 1 + .../shared/ui/CssBaseline/muiCssBaseline.ts | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts diff --git a/packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts b/packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts new file mode 100644 index 000000000..6ba52d3f1 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts @@ -0,0 +1 @@ +export { defineMuiCssBaseline } from './muiCssBaseline' diff --git a/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts b/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts new file mode 100644 index 000000000..70abe1b3f --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts @@ -0,0 +1,25 @@ +import type { Components } from '@mui/material/styles' + +export const defineMuiCssBaseline = () => { + const component: Components['MuiCssBaseline'] = { + styleOverrides: ` + @font-face { + font-family: 'Mona Sans'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: local('Mona Sans'), local('MonaSans-Regular'), url('fonts/Mona-Sans.woff2') format('woff2'); + unicodeRange: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF; + } + @font-face { + font-family: 'Hubot Sans'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: local('Hubot Sans'), local('HubotSans-Regular'), url('fonts/Hubot-Sans.woff2') format('woff2'); + unicodeRange: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF; + } + `, + } + return component +} From c6d0470d2b0b9a474d220457dd06830eb53bd604 Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 30 Sep 2024 15:55:30 +0500 Subject: [PATCH 007/137] feat: implement `Typography` ui styling --- .../src/shared/ui/Typography/Typography.tsx | 7 ++ .../src/shared/ui/Typography/index.ts | 3 + .../src/shared/ui/Typography/muiTypography.ts | 26 +++++ .../shared/ui/Typography/variants/config.ts | 94 +++++++++++++++++++ .../shared/ui/Typography/variants/index.ts | 2 + .../variants/override-typography.d.ts | 17 ++++ .../Typography/variants/resolve-typography.ts | 78 +++++++++++++++ 7 files changed, 227 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/index.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/variants/override-typography.d.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx b/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx new file mode 100644 index 000000000..657b42bc8 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx @@ -0,0 +1,7 @@ +import { Typography as MuiTypography, TypographyProps as MuiTypographyProps } from '@mui/material' + +export interface TypographyProps extends MuiTypographyProps {} + +export const Typography = ({ ...props }: TypographyProps) => { + return +} diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/index.ts b/packages/curve-ui-kit/src/shared/ui/Typography/index.ts new file mode 100644 index 000000000..371347982 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/index.ts @@ -0,0 +1,3 @@ +export { defineMuiTypography } from './muiTypography' +export * from './variants' +export * from './Typography' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts new file mode 100644 index 000000000..6d003bce8 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts @@ -0,0 +1,26 @@ +import type { Components } from '@mui/material/styles' + +export const defineMuiTypography = () => { + const component: Components['MuiTypography'] = { + defaultProps: { + variant: 'bodyMRegular', + variantMapping: { + bodyMBold: 'p', + bodyMRegular: 'p', + bodySBold: 'p', + bodySRegular: 'p', + bodyXsBold: 'p', + bodyXsRegular: 'p', + + headingXxl: 'h1', + headingMBold: 'h2', + headingMLight: 'h3', + headingSBold: 'h4', + headingXsBold: 'h5', + headingXsMedium: 'h6', + }, + }, + } + + return component +} diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts new file mode 100644 index 000000000..3719dd5bc --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts @@ -0,0 +1,94 @@ +import type { TypographyOptions } from '@mui/material/styles/createTypography' + +const headingVariantKeys = [ + 'headingXxl', + 'headingMBold', + 'headingMLight', + 'headingSBold', + 'headingXsBold', + 'headingXsMedium', +] as const + +const bodyVariantKeys = [ + 'bodyMBold', + 'bodyMRegular', + 'bodySBold', + 'bodySRegular', + 'bodyXsBold', + 'bodyXsRegular', +] as const + +const buttonLabelVariantKeys = ['buttonLabelM', 'buttonLabelS', 'buttonLabelXs'] as const + +const tableHeaderVariantKeys = ['tableHeaderM', 'tableHeaderS'] as const + +const tableCellVariantKeys = [ + 'tableCellL', + 'tableCellMBold', + 'tableCellMRegular', + 'tableCellSBold', + 'tableCellSRegular', +] as const + +const highlightedVariantKeys = [ + 'highLightedXxl', + 'highLightedXl', + 'highLightedL', + 'highLightedM', + 'highLightedS', + 'highLightedXs', + 'highLightedXsNotional', +] as const + +export const typographyVariantsKeys = { + heading: headingVariantKeys, + body: bodyVariantKeys, + buttonLabel: buttonLabelVariantKeys, + table: { + header: tableHeaderVariantKeys, + cell: tableCellVariantKeys, + }, + highlighted: highlightedVariantKeys, +} as const + +export const disabledTypographyKeys: (keyof TypographyOptions)[] = [ + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'button', + 'body1', + 'body2', + 'caption', + 'overline', + 'subtitle1', + 'subtitle2', +] as const + +export type TypographyVariantKey = + | (typeof headingVariantKeys)[number] + | (typeof bodyVariantKeys)[number] + | (typeof buttonLabelVariantKeys)[number] + | (typeof tableHeaderVariantKeys)[number] + | (typeof tableCellVariantKeys)[number] + | (typeof highlightedVariantKeys)[number] + +export type DisabledTypographyVariantKey = (typeof disabledTypographyKeys)[number] + +export type NonTableTypographyVariantKey = Exclude +export type TableTypographyVariantKey = Extract + +export type ResolvedTypography = Record + +export const FontFamilyBasic = ['"Mona Sans"', '"Helvetica Neue"', 'sans-serif'].join(',') +export const FontFamilyChad = [ + '"Hubot Sans"', + '"Helvetica Neue"', + 'sans-serif', + 'Minecraft', + '"SF Mono Regular 11"', + '"Ubuntu Mono"', + 'monospace', +].join(',') diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts new file mode 100644 index 000000000..93842781b --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts @@ -0,0 +1,2 @@ +export * from './resolve-typography' +export * from './config' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/override-typography.d.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/override-typography.d.ts new file mode 100644 index 000000000..b8b9b2f76 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/override-typography.d.ts @@ -0,0 +1,17 @@ +declare module 'global' { + type NewTypographyVariants = { + [key in import('./config').TypographyVariantKey]: T + } + type DisabledTypographyVariants = { + [key in import('./config').DisabledTypographyVariantKey]: false + } + + module '@mui/material/styles' { + interface TypographyVariants extends NewTypographyVariants {} + interface TypographyVariantsOptions extends Partial> {} + } + + module '@mui/material/Typography' { + interface TypographyPropsVariantOverrides extends NewTypographyVariants, DisabledTypographyVariants {} + } +} diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts new file mode 100644 index 000000000..1faa1c809 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts @@ -0,0 +1,78 @@ +import type { FigmaTypography, FigmaTypographyToken } from '@/shared/api/figma-tokens' +import { ThemeFontFamily, type ThemeKey } from '@/shared/lib/basic-theme' +import { capitalizeFirstLetter, capitalizeSpecificWords } from '@/shared/lib/capitalize' +import type { NonTableTypographyVariantKey, TableTypographyVariantKey, TypographyVariantKey } from './config' + +const wordsToCapitalize = ['bold', 'regular', 'medium', 'light', 'notional', 'label'] + +function transformTypographyToken(token: FigmaTypographyToken): React.CSSProperties & { description?: string } { + const { + fontSize, + fontStretch, + fontStyle, + fontWeight, + fontFamily, + letterSpacing, + lineHeight, + paragraphIndent, + paragraphSpacing, + textCase, + textDecoration, + description, + } = token + + return { + description, + fontSize: `${fontSize}px`, + fontWeight, + fontStyle, + fontStretch, + letterSpacing: `${letterSpacing}px`, + lineHeight: `${lineHeight}px`, + textDecoration, + fontFamily, + textIndent: paragraphIndent, + textTransform: textCase, + // We're not using paragraphSpacing here, as it's not a valid CSS property. + } +} + +export function resolveTypographyVariants>( + figmaTypography: T, +): Record { + const result: Partial> = {} + + for (const [category, styles] of Object.entries(figmaTypography)) { + if (category === 'table') { + continue + } + for (const [style, token] of Object.entries(styles) as [string, FigmaTypographyToken][]) { + const key = capitalizeSpecificWords( + `${category}${capitalizeFirstLetter(style)}`, + wordsToCapitalize, + ) as NonTableTypographyVariantKey + result[key] = transformTypographyToken(token) + } + } + + return result as Record +} + +export function resolveTableTypographyVariants>( + figmaTypography: T, +): Record { + const result: Partial> = {} + + for (const [tableType, styles] of Object.entries(figmaTypography.table)) { + for (const [style, token] of Object.entries(styles) as [string, FigmaTypographyToken][]) { + const key = capitalizeSpecificWords( + `table${capitalizeFirstLetter(tableType)}${capitalizeFirstLetter(style)}`, + wordsToCapitalize, + ) as TableTypographyVariantKey + + result[key] = transformTypographyToken(token) + } + } + + return result as Record +} From 9994cb0991e447165c6cc394c09cbce36d0a8473 Mon Sep 17 00:00:00 2001 From: Ignat Date: Tue, 1 Oct 2024 15:55:30 +0500 Subject: [PATCH 008/137] feat: implement `Typography` story --- .../Typography/stories/Typography.stories.tsx | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx b/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx new file mode 100644 index 000000000..5b349ab4c --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx @@ -0,0 +1,71 @@ +import { Divider, Stack } from '@mui/material' +import type { Meta, StoryObj } from '@storybook/react' +import { figmaTokens } from '@/shared/api/figma-tokens' +import { Typography } from '../Typography' +import { typographyVariantsKeys, TypographyVariantKey } from '../variants' + +const meta: Meta = { + title: 'UI Kit/Primitives/Typography', + component: Typography, + argTypes: { + color: { + control: 'select', + options: ['primary', 'secondary', 'tertiary', 'neutral', 'info', 'success', 'error', 'grey', undefined], + description: 'The color of the component', + }, + }, + args: { + children: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + }, +} + +type Story = StoryObj + +interface TypographyDisplayProps { + variant: TypographyVariantKey + [key: string]: any +} + +const TypographyDisplay: React.FC = ({ variant, ...args }) => { + const typography = figmaTokens.typography[variant] + + return ( + + + {args.children} + + + + Variant: {variant} + + {typography?.description && ( + Description: {typography.description} + )} + + ) +} + +const createStory = (categoryKey: keyof typeof typographyVariantsKeys): Story => ({ + decorators: [ + (Story, { args }) => { + const variants = typographyVariantsKeys[categoryKey] + + return ( + + {(Array.isArray(variants) ? variants : Object.values(variants).flat()).map((variant) => ( + + ))} + + ) + }, + ], +}) + +export const Heading = createStory('heading') +export const Body = createStory('body') +export const ButtonLabel = createStory('buttonLabel') +export const Table = createStory('table') +export const Highlighted = createStory('highlighted') + +export default meta From 3707e6cd5c79c9f0720ec99c9cd57526f8c2b225 Mon Sep 17 00:00:00 2001 From: Ignat Date: Tue, 1 Oct 2024 16:55:30 +0500 Subject: [PATCH 009/137] feat: implement `Button` ui style --- .../src/shared/ui/Button/Button.tsx | 9 ++ .../shared/ui/Button/button-overrides.d.ts | 23 +++ .../src/shared/ui/Button/index.ts | 2 + .../src/shared/ui/Button/muiButton.ts | 136 ++++++++++++++++++ 4 files changed, 170 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/ui/Button/Button.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/Button/button-overrides.d.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Button/index.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts diff --git a/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx b/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx new file mode 100644 index 000000000..2e3b07939 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx @@ -0,0 +1,9 @@ +import { Button as MuiButton, ButtonProps as MuiButtonProps } from '@mui/material' + +export interface ButtonProps extends MuiButtonProps { + label: string +} + +export const Button = ({ label, ...props }: ButtonProps) => { + return {label} +} diff --git a/packages/curve-ui-kit/src/shared/ui/Button/button-overrides.d.ts b/packages/curve-ui-kit/src/shared/ui/Button/button-overrides.d.ts new file mode 100644 index 000000000..0fbd6f457 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Button/button-overrides.d.ts @@ -0,0 +1,23 @@ +declare module 'global' { + module '@mui/material/Button' { + interface ButtonPropsVariantOverrides { + outlined: true + contained: true + ghost: true + + text: false + } + + interface ButtonPropsColorOverrides { + primary: true + secondary: true + navigation: true + success: true + alert: true + + error: false + info: false + warning: false + } + } +} diff --git a/packages/curve-ui-kit/src/shared/ui/Button/index.ts b/packages/curve-ui-kit/src/shared/ui/Button/index.ts new file mode 100644 index 000000000..bf775eb63 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Button/index.ts @@ -0,0 +1,2 @@ +export { Button } from './Button' +export { defineMuiButton } from './muiButton' diff --git a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts new file mode 100644 index 000000000..8e9e95f5c --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts @@ -0,0 +1,136 @@ +import type { Components, CSSObject } from '@mui/material/styles' +import { type FigmaTokens, extractNumber } from '@/shared/api/figma-tokens' +import { basicMuiTheme, type ThemeKey } from '@/shared/lib/basic-theme' +import { omitProperty } from '@/shared/lib/object-properties' + +export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey) => { + const buttonDesktop = figmaTokens.themes.desktop[mode].button + const buttonMobile = figmaTokens.themes.mobile[mode].button + const spacingDesktop = figmaTokens.mappedSizesAndSpaces.desktop.spacing + const spacingMobile = figmaTokens.mappedSizesAndSpaces.mobile.spacing + + const getColorButtonStyle = (color: 'primary' | 'secondary' | 'success' | 'alert'): CSSObject => { + return { + backgroundColor: buttonDesktop[color].default?.fill, + color: buttonDesktop[color].default['label & icon'], + '&:hover': { + backgroundColor: buttonDesktop[color].hover.fill, + color: buttonDesktop[color].hover['label & icon'], + }, + '&:disabled': { + backgroundColor: buttonDesktop[color].disabled.fill, + color: buttonDesktop[color].disabled['label & icon'], + }, + } + } + + const getNavigationButtonStyle = (): CSSObject => { + return { + color: buttonDesktop.navigation.default['label & icon'], + '&:hover': { + backgroundColor: buttonDesktop.navigation.hover.fill, + color: buttonDesktop.navigation.hover['label & icon'], + }, + '&:current': { + backgroundColor: buttonDesktop.navigation.current.fill, + color: buttonDesktop.navigation.current['label & icon'], + }, + } + } + + const getVariantButtonStyle = (variant: 'outlined'): CSSObject => { + return { + backgroundColor: 'transparent', + borderColor: buttonDesktop[variant].default.outline, + color: buttonDesktop[variant].default['label & icon'], + '&:hover': { + borderColor: buttonDesktop[variant].hover.outline, + color: buttonDesktop[variant].hover['label & icon'], + }, + '&:disabled': { + borderColor: buttonDesktop[variant].disabled.outline, + color: buttonDesktop[variant].disabled['label & icon'], + }, + } + } + + const getGhostButtonStyle = (): CSSObject => { + return { + backgroundColor: 'transparent', + color: buttonDesktop.ghost.default['label & icon'], + '&:hover': { + backgroundColor: buttonDesktop.ghost.hover.fill, + color: buttonDesktop.ghost.hover['label & icon'], + }, + '&:disabled': { + backgroundColor: buttonDesktop.ghost.disabled.fill, + color: buttonDesktop.ghost.disabled['label & icon'], + }, + } + } + + const muiButton: Components['MuiButton'] = { + styleOverrides: { + root: { + variants: [ + { + props: { color: 'primary' }, + style: getColorButtonStyle('primary'), + }, + { + props: { color: 'secondary' }, + style: getColorButtonStyle('secondary'), + }, + { + props: { color: 'success' }, + style: getColorButtonStyle('success'), + }, + { + props: { color: 'alert' }, + style: getColorButtonStyle('alert'), + }, + { + props: { color: 'navigation' }, + style: getNavigationButtonStyle(), + }, + { + props: { variant: 'outlined' }, + style: getVariantButtonStyle('outlined'), + }, + { + props: { variant: 'ghost' }, + style: getGhostButtonStyle(), + }, + ], + borderRadius: extractNumber(buttonDesktop.radius.md), + }, + + sizeLarge: { + height: '56px', + padding: `${spacingDesktop.md}px ${spacingDesktop.sm}px`, + [basicMuiTheme.breakpoints.down('tablet')]: { + padding: `${spacingMobile.md}0px ${spacingMobile.sm}0px`, + }, + ...omitProperty(figmaTokens.typography.buttonLabelM, 'description'), + }, + sizeMedium: { + height: '48px', + padding: `${spacingDesktop.xs}px ${spacingDesktop.sm}px`, + [basicMuiTheme.breakpoints.down('tablet')]: { + padding: `${spacingMobile.xs}px ${spacingMobile.sm}px`, + }, + ...omitProperty(figmaTokens.typography.buttonLabelS, 'description'), + }, + sizeSmall: { + height: '40px', + padding: `${spacingDesktop.xs}px ${spacingDesktop.md}px`, + [basicMuiTheme.breakpoints.down('tablet')]: { + padding: `${spacingMobile.xs}px ${spacingMobile.md}px`, + }, + ...omitProperty(figmaTokens.typography.buttonLabelS, 'description'), + }, + }, + } + + return muiButton +} From 80df14cd477d1133ba24d7c348271b958f13c1fb Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 1 Oct 2024 15:35:51 +0200 Subject: [PATCH 010/137] create useTvl hook and lend query structure --- apps/lend/src/entities/chain/index.ts | 3 + apps/lend/src/entities/chain/lib.ts | 41 +++++++++++ .../entities/chain/model/chain-validation.ts | 12 ++++ apps/lend/src/entities/chain/model/index.ts | 2 + .../src/entities/chain/model/query-keys.ts | 5 ++ apps/lend/src/entities/chain/types.ts | 3 + apps/lend/src/layout/Header.tsx | 70 +++---------------- apps/lend/src/pages/_app.tsx | 16 +++-- 8 files changed, 85 insertions(+), 67 deletions(-) create mode 100644 apps/lend/src/entities/chain/index.ts create mode 100644 apps/lend/src/entities/chain/lib.ts create mode 100644 apps/lend/src/entities/chain/model/chain-validation.ts create mode 100644 apps/lend/src/entities/chain/model/index.ts create mode 100644 apps/lend/src/entities/chain/model/query-keys.ts create mode 100644 apps/lend/src/entities/chain/types.ts diff --git a/apps/lend/src/entities/chain/index.ts b/apps/lend/src/entities/chain/index.ts new file mode 100644 index 000000000..1ac09c6e8 --- /dev/null +++ b/apps/lend/src/entities/chain/index.ts @@ -0,0 +1,3 @@ +export * from './lib' +export * from './model' +export * from './types' diff --git a/apps/lend/src/entities/chain/lib.ts b/apps/lend/src/entities/chain/lib.ts new file mode 100644 index 000000000..8435fbc01 --- /dev/null +++ b/apps/lend/src/entities/chain/lib.ts @@ -0,0 +1,41 @@ +import { useMemo } from 'react' +import { FORMAT_OPTIONS, formatNumber } from '@/ui/utils' +import useStore from '@/store/useStore' + +export const useTvl = (rChainId: ChainId) => { + const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[rChainId]) + const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[rChainId]) + const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[rChainId]) + const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[rChainId]) + const usdRatesMapper = useStore((state) => state.usdRates.tokens) + + return useMemo(() => { + if ( + owmDatasMapper && + marketsCollateralMapper && + marketsTotalSupplyMapper && + marketsTotalDebtMapper && + Object.keys(usdRatesMapper).length + ) { + let totalCollateral = 0 + let totalLiquidity = 0 + let totalDebt = 0 + + Object.values(owmDatasMapper).map(({ owm }) => { + const { id, collateral_token } = owm + + const ammBalance = marketsCollateralMapper[id] ?? {} + const collateralUsdRate = usdRatesMapper[collateral_token.address] + const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * +(collateralUsdRate ?? '0') + + totalCollateral += marketTotalCollateralUsd + totalDebt += +marketsTotalDebtMapper[id]?.totalDebt + totalLiquidity += +marketsTotalSupplyMapper[id]?.totalLiquidity + }) + + const tvl = totalCollateral + totalLiquidity - totalDebt + + return tvl > 0 ? formatNumber(tvl, { ...FORMAT_OPTIONS.USD, showDecimalIfSmallNumberOnly: true }) : '-' + } + }, [owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, usdRatesMapper]) +} diff --git a/apps/lend/src/entities/chain/model/chain-validation.ts b/apps/lend/src/entities/chain/model/chain-validation.ts new file mode 100644 index 000000000..5c242882c --- /dev/null +++ b/apps/lend/src/entities/chain/model/chain-validation.ts @@ -0,0 +1,12 @@ +import type { ChainQueryParams } from '@/entities/chain/types' +import { createValidationSuite } from '@/shared/curve-lib' +import { enforce, group, test } from 'vest' + +export const chainValidationGroup = ({ chainId }: ChainQueryParams) => + group('chainValidation', () => { + test('chainId', () => { + enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId() + }) + }) + +export const chainValidationSuite = createValidationSuite(chainValidationGroup) diff --git a/apps/lend/src/entities/chain/model/index.ts b/apps/lend/src/entities/chain/model/index.ts new file mode 100644 index 000000000..f8ed2b452 --- /dev/null +++ b/apps/lend/src/entities/chain/model/index.ts @@ -0,0 +1,2 @@ +export * from './query-keys' +export * from './chain-validation' diff --git a/apps/lend/src/entities/chain/model/query-keys.ts b/apps/lend/src/entities/chain/model/query-keys.ts new file mode 100644 index 000000000..229cec56b --- /dev/null +++ b/apps/lend/src/entities/chain/model/query-keys.ts @@ -0,0 +1,5 @@ +import type { ChainQueryParams } from '@/entities/chain/types' + +export const chainKeys = { + root: ({ chainId }: ChainQueryParams) => ['chain', chainId] as const, +} as const diff --git a/apps/lend/src/entities/chain/types.ts b/apps/lend/src/entities/chain/types.ts new file mode 100644 index 000000000..289076870 --- /dev/null +++ b/apps/lend/src/entities/chain/types.ts @@ -0,0 +1,3 @@ +export type ChainQueryParams = { + chainId?: ChainId +} diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index addb207d2..fc00049ad 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -1,4 +1,5 @@ import type { AppLogoProps } from '@/ui/Brand/AppLogo' +import AppLogo from '@/ui/Brand/AppLogo' import type { AppPage } from '@/ui/AppNav/types' import React, { useEffect, useMemo, useRef } from 'react' @@ -7,30 +8,29 @@ import { useNavigate, useParams } from 'react-router-dom' import { CONNECT_STAGE, ROUTE } from '@/constants' import { DEFAULT_LOCALES } from '@/lib/i18n' -import { getNetworkFromUrl, getRestFullPathname } from '@/utils/utilsRouter' -import { getParamsFromUrl, getRestPartialPathname } from '@/utils/utilsRouter' +import { getNetworkFromUrl, getParamsFromUrl, getRestFullPathname, getRestPartialPathname } from '@/utils/utilsRouter' import { getWalletSignerAddress } from '@/store/createWalletSlice' import { _parseRouteAndIsActive, FORMAT_OPTIONS, formatNumber, isLoading } from '@/ui/utils' import { useConnectWallet } from '@/onboard' import { useHeightResizeObserver } from '@/ui/hooks' -import { visibleNetworksList } from '@/networks' -import networks from '@/networks' +import networks, { visibleNetworksList } from '@/networks' import useStore from '@/store/useStore' import { APP_LINK, - APPS_LINKS, AppNavBar, AppNavBarContent, AppNavMenuSection, AppNavMobile, - AppSelectNetwork, + APPS_LINKS, + AppSelectNetwork } from '@/ui/AppNav' import { CommunitySection, ResourcesSection } from '@/layout/Footer' -import AppLogo from '@/ui/Brand/AppLogo' import AppNavPages from '@/ui/AppNav/AppNavPages' import ConnectWallet from '@/ui/Button/ConnectWallet' import HeaderSecondary from '@/layout/HeaderSecondary' +import { useTvl } from '@/entities/chain' + const Header = () => { const [{ wallet }] = useConnectWallet() @@ -41,11 +41,6 @@ const Header = () => { const { rChainId, rNetworkIdx, rLocalePathname } = getParamsFromUrl() - const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[rChainId]) - const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[rChainId]) - const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[rChainId]) - const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[rChainId]) - const usdRatesMapper = useStore((state) => state.usdRates.tokens) const connectState = useStore((state) => state.connectState) const isAdvanceMode = useStore((state) => state.isAdvanceMode) const isMdUp = useStore((state) => state.layout.isMdUp) @@ -57,6 +52,7 @@ const Header = () => { const setLayoutHeight = useStore((state) => state.layout.setLayoutHeight) const setAppCache = useStore((state) => state.setAppCache) const updateConnectState = useStore((state) => state.updateConnectState) + const tvl = useTvl(rChainId); const { params: routerParams, location } = routerProps ?? {} const routerPathname = location?.pathname ?? '' @@ -87,18 +83,6 @@ const Header = () => { return _parseRouteAndIsActive(links, rLocalePathname, routerPathname, routerNetwork) }, [isLgUp, rLocalePathname, routerNetwork, routerPathname]) - const tvl = useMemo(() => { - return _getTvl( - owmDatasMapper, - marketsCollateralMapper, - marketsTotalSupplyMapper, - marketsTotalDebtMapper, - usdRatesMapper - ) - }, [owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, usdRatesMapper]) - - const appStats = [{ label: 'TVL', value: tvl }] as { label: string; value: string }[] - const getPath = (route: string) => { const networkName = networks[rChainId || '1'].id return `#${rLocalePathname}/${networkName}${route}` @@ -179,7 +163,7 @@ const Header = () => { @@ -231,40 +215,4 @@ const Header = () => { ) } -function _getTvl( - owmDatasMapper: OWMDatasMapper | undefined, - marketsCollateralMapper: MarketsStatsAMMBalancesMapper | undefined, - marketsTotalSupplyMapper: MarketsTotalLiquidityMapper | undefined, - marketsTotalDebtMapper: MarketsStatsTotalsMapper | undefined, - usdRatesMapper: { [tokenAddress: string]: string | number } -) { - if ( - owmDatasMapper && - marketsCollateralMapper && - marketsTotalSupplyMapper && - marketsTotalDebtMapper && - Object.keys(usdRatesMapper) - ) { - let totalCollateral = 0 - let totalLiquidity = 0 - let totalDebt = 0 - - Object.values(owmDatasMapper).map(({ owm }) => { - const { id, collateral_token } = owm - - const ammBalance = marketsCollateralMapper[id] ?? {} - const collateralUsdRate = usdRatesMapper[collateral_token.address] - const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * +(collateralUsdRate ?? '0') - - totalCollateral += marketTotalCollateralUsd - totalDebt += +marketsTotalDebtMapper[id]?.totalDebt - totalLiquidity += +marketsTotalSupplyMapper[id]?.totalLiquidity - }) - - const tvl = totalCollateral + totalLiquidity - totalDebt - - return tvl > 0 ? formatNumber(tvl, { ...FORMAT_OPTIONS.USD, showDecimalIfSmallNumberOnly: true }) : '-' - } -} - export default Header diff --git a/apps/lend/src/pages/_app.tsx b/apps/lend/src/pages/_app.tsx index 66de4f21a..db90ca8ca 100644 --- a/apps/lend/src/pages/_app.tsx +++ b/apps/lend/src/pages/_app.tsx @@ -10,6 +10,8 @@ import 'intersection-observer' import 'focus-visible' import '@/globals.css' +import { persister, queryClient } from '@/shared/curve-lib' +import { QueryProvider } from '@/ui/QueryProvider' import { dynamicActivate, initTranslation } from '@/lib/i18n' import { getLocaleFromUrl } from '@/utils/utilsRouter' import { isMobile, removeExtraSpaces } from '@/utils/helpers' @@ -110,12 +112,14 @@ function CurveApp({ Component }: AppProps) { {typeof window === 'undefined' || !appLoaded ? null : ( - - - - - - + + + + + + + + )} From d13d870f30aea2e5470d463f90688756f2d411dd Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Thu, 3 Oct 2024 10:06:16 +0200 Subject: [PATCH 011/137] feat: first llamalend queries --- apps/lend/src/entities/chain/api/query.ts | 26 +++++++++++++++++++ .../entities/chain/{lib.ts => lib/hooks.ts} | 18 ++++++++++++- apps/lend/src/entities/chain/lib/index.ts | 3 +++ apps/lend/src/entities/chain/lib/queries.ts | 4 +++ .../lend/src/entities/chain/lib/validation.ts | 8 ++++++ .../entities/chain/model/chain-validation.ts | 6 +++-- .../src/entities/chain/model/query-keys.ts | 3 +++ .../src/entities/chain/model/query-options.ts | 13 ++++++++++ apps/lend/src/entities/chain/types.ts | 2 ++ apps/lend/src/pages/_app.tsx | 2 +- packages/ui/src/QueryProvider/index.tsx | 8 +++--- 11 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 apps/lend/src/entities/chain/api/query.ts rename apps/lend/src/entities/chain/{lib.ts => lib/hooks.ts} (76%) create mode 100644 apps/lend/src/entities/chain/lib/index.ts create mode 100644 apps/lend/src/entities/chain/lib/queries.ts create mode 100644 apps/lend/src/entities/chain/lib/validation.ts create mode 100644 apps/lend/src/entities/chain/model/query-options.ts diff --git a/apps/lend/src/entities/chain/api/query.ts b/apps/lend/src/entities/chain/api/query.ts new file mode 100644 index 000000000..df4de2ea0 --- /dev/null +++ b/apps/lend/src/entities/chain/api/query.ts @@ -0,0 +1,26 @@ +import { QueryFunction } from '@tanstack/react-query' +import { ChainQueryKeyType } from '@/entities/chain' +import { assertChainValidity } from '@/entities/chain/lib/validation' +import { logQuery } from '@/shared/lib/logging' +import { Contract } from 'ethers' +import { CRVUSD_ADDRESS } from 'loan/src/constants' +import useStore from '@/store/useStore' +import { BD } from '@/shared/curve-lib' + + +const TOTAL_SUPPLY_INTERFACE = ["function totalSupply() view returns (uint256)"]; +const SCALE = BD.from(10).pow(18) + +export const queryTotalCrvUsd: QueryFunction< + string, + ChainQueryKeyType<'root'> +> = async ({ queryKey }) => { + logQuery(queryKey) + const [, chainId] = queryKey + assertChainValidity({ chainId }) + + const { provider } = useStore.getState().wallet + const contract = new Contract(CRVUSD_ADDRESS, TOTAL_SUPPLY_INTERFACE, provider) + const supply = await contract.totalSupply() + return BD.from(supply).div(SCALE).toString() +} diff --git a/apps/lend/src/entities/chain/lib.ts b/apps/lend/src/entities/chain/lib/hooks.ts similarity index 76% rename from apps/lend/src/entities/chain/lib.ts rename to apps/lend/src/entities/chain/lib/hooks.ts index 8435fbc01..7c4da25af 100644 --- a/apps/lend/src/entities/chain/lib.ts +++ b/apps/lend/src/entities/chain/lib/hooks.ts @@ -1,6 +1,9 @@ +import useStore from '@/store/useStore' import { useMemo } from 'react' import { FORMAT_OPTIONS, formatNumber } from '@/ui/utils' -import useStore from '@/store/useStore' +import { CRVUSD_ADDRESS } from 'loan/src/constants' +import { BD } from '@/shared/curve-lib' +import { useCrvUsdTotalSupply } from '@/entities/chain' export const useTvl = (rChainId: ChainId) => { const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[rChainId]) @@ -39,3 +42,16 @@ export const useTvl = (rChainId: ChainId) => { } }, [owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, usdRatesMapper]) } + +export const useCrvUsdPrice = () => { + return useStore((state) => state.usdRates.tokens[CRVUSD_ADDRESS]) +} + +export const useCrvUsdTotalSupplyInUSD = (chainId: ChainId) => { + const { data: totalCrvUsd } = useCrvUsdTotalSupply({ chainId }) + const inUsd = useCrvUsdPrice() + if (!totalCrvUsd || !inUsd) { + return null + } + return BD.from(totalCrvUsd).div(BD.from(inUsd)) +} \ No newline at end of file diff --git a/apps/lend/src/entities/chain/lib/index.ts b/apps/lend/src/entities/chain/lib/index.ts new file mode 100644 index 000000000..43582e695 --- /dev/null +++ b/apps/lend/src/entities/chain/lib/index.ts @@ -0,0 +1,3 @@ +export * from './queries' +export * from './validation' +export * from './hooks' diff --git a/apps/lend/src/entities/chain/lib/queries.ts b/apps/lend/src/entities/chain/lib/queries.ts new file mode 100644 index 000000000..e190bcb64 --- /dev/null +++ b/apps/lend/src/entities/chain/lib/queries.ts @@ -0,0 +1,4 @@ +import { createQueryHook } from '@/shared/lib/queries' +import { getTotalCrvUsdQueryOptions } from '@/entities/chain/model/query-options' + +export const useCrvUsdTotalSupply = createQueryHook(getTotalCrvUsdQueryOptions); diff --git a/apps/lend/src/entities/chain/lib/validation.ts b/apps/lend/src/entities/chain/lib/validation.ts new file mode 100644 index 000000000..45b4682c6 --- /dev/null +++ b/apps/lend/src/entities/chain/lib/validation.ts @@ -0,0 +1,8 @@ +import { CombinedChainParams, chainValidationSuite } from '@/entities/chain' +import { assertValidity, checkValidity, ValidatedData } from '@/shared/lib/validation' + +export const assertChainValidity = (data: T, fields?: Extract[]) => + assertValidity(chainValidationSuite, data, fields) + +export const checkChainValidity = (data: T, fields?: Extract[]) => + checkValidity(chainValidationSuite, data, fields) diff --git a/apps/lend/src/entities/chain/model/chain-validation.ts b/apps/lend/src/entities/chain/model/chain-validation.ts index 5c242882c..44d164508 100644 --- a/apps/lend/src/entities/chain/model/chain-validation.ts +++ b/apps/lend/src/entities/chain/model/chain-validation.ts @@ -1,11 +1,13 @@ import type { ChainQueryParams } from '@/entities/chain/types' -import { createValidationSuite } from '@/shared/curve-lib' +import { createValidationSuite } from '@/shared/lib/validation' import { enforce, group, test } from 'vest' +import useStore from '@/store/useStore' export const chainValidationGroup = ({ chainId }: ChainQueryParams) => group('chainValidation', () => { test('chainId', () => { - enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId() + enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId(); + enforce(useStore.getState().api?.chainId).message('Chain ID should be loaded').equals(chainId) }) }) diff --git a/apps/lend/src/entities/chain/model/query-keys.ts b/apps/lend/src/entities/chain/model/query-keys.ts index 229cec56b..45500cf06 100644 --- a/apps/lend/src/entities/chain/model/query-keys.ts +++ b/apps/lend/src/entities/chain/model/query-keys.ts @@ -1,5 +1,8 @@ import type { ChainQueryParams } from '@/entities/chain/types' +import type { ExtractQueryKeyType } from '@/shared/types/api' export const chainKeys = { root: ({ chainId }: ChainQueryParams) => ['chain', chainId] as const, } as const + +export type ChainQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts new file mode 100644 index 000000000..554f5e942 --- /dev/null +++ b/apps/lend/src/entities/chain/model/query-options.ts @@ -0,0 +1,13 @@ +import { queryOptions } from '@tanstack/react-query' +import { chainKeys, ChainQueryParams } from '@/entities/chain' +import { queryTotalCrvUsd } from '@/entities/chain/api/query' +import { REFRESH_INTERVAL } from '@/constants' +import { checkChainValidity } from '@/entities/chain/lib/validation' + +export const getTotalCrvUsdQueryOptions = (params: ChainQueryParams) => + queryOptions({ + queryKey: chainKeys.root(params), + queryFn: queryTotalCrvUsd, + staleTime: REFRESH_INTERVAL['5m'], + enabled: checkChainValidity(params), + }) diff --git a/apps/lend/src/entities/chain/types.ts b/apps/lend/src/entities/chain/types.ts index 289076870..3ccc7c995 100644 --- a/apps/lend/src/entities/chain/types.ts +++ b/apps/lend/src/entities/chain/types.ts @@ -1,3 +1,5 @@ export type ChainQueryParams = { chainId?: ChainId } + +export type CombinedChainParams = ChainQueryParams diff --git a/apps/lend/src/pages/_app.tsx b/apps/lend/src/pages/_app.tsx index db90ca8ca..dc30b5df0 100644 --- a/apps/lend/src/pages/_app.tsx +++ b/apps/lend/src/pages/_app.tsx @@ -10,7 +10,7 @@ import 'intersection-observer' import 'focus-visible' import '@/globals.css' -import { persister, queryClient } from '@/shared/curve-lib' +import { persister, queryClient } from '@/shared/api/query-client' import { QueryProvider } from '@/ui/QueryProvider' import { dynamicActivate, initTranslation } from '@/lib/i18n' import { getLocaleFromUrl } from '@/utils/utilsRouter' diff --git a/packages/ui/src/QueryProvider/index.tsx b/packages/ui/src/QueryProvider/index.tsx index 9dabd14dc..a08be4b3f 100644 --- a/packages/ui/src/QueryProvider/index.tsx +++ b/packages/ui/src/QueryProvider/index.tsx @@ -1,6 +1,6 @@ -import { type QueryClient, QueryClientProvider } from "@tanstack/react-query" -import { type Persister, PersistQueryClientProvider } from "@tanstack/react-query-persist-client" -import type { ReactNode } from "react" +import { type QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { type Persister, PersistQueryClientProvider } from '@tanstack/react-query-persist-client' +import type { ReactNode } from 'react' type QueryProviderWrapperProps = { children: ReactNode @@ -9,7 +9,7 @@ type QueryProviderWrapperProps = { } export function QueryProvider({ children, persister, queryClient }: QueryProviderWrapperProps) { - if (persister) { + if (persister && !window?.localStorage?.getItem('react-query-no-persist')) { return ( {children} From 468cdfb7dca984bed8a218039624a7c2c244bf95 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Thu, 3 Oct 2024 10:06:16 +0200 Subject: [PATCH 012/137] feat: useTokenUsdRate query hook --- apps/lend/src/entities/chain/lib/index.ts | 2 +- .../chain/lib/{queries.ts => query-hooks.ts} | 0 apps/lend/src/entities/chain/model/index.ts | 2 +- .../{chain-validation.ts => validation.ts} | 0 apps/lend/src/entities/token/api/query.ts | 17 +++++++++++++++++ apps/lend/src/entities/token/index.ts | 3 +++ apps/lend/src/entities/token/lib/index.ts | 1 + apps/lend/src/entities/token/lib/query-hooks.ts | 4 ++++ apps/lend/src/entities/token/lib/validation.ts | 8 ++++++++ apps/lend/src/entities/token/model/index.ts | 2 ++ .../lend/src/entities/token/model/query-keys.ts | 9 +++++++++ .../src/entities/token/model/query-options.ts | 13 +++++++++++++ .../lend/src/entities/token/model/validation.ts | 15 +++++++++++++++ apps/lend/src/entities/token/types.ts | 7 +++++++ 14 files changed, 81 insertions(+), 2 deletions(-) rename apps/lend/src/entities/chain/lib/{queries.ts => query-hooks.ts} (100%) rename apps/lend/src/entities/chain/model/{chain-validation.ts => validation.ts} (100%) create mode 100644 apps/lend/src/entities/token/api/query.ts create mode 100644 apps/lend/src/entities/token/index.ts create mode 100644 apps/lend/src/entities/token/lib/index.ts create mode 100644 apps/lend/src/entities/token/lib/query-hooks.ts create mode 100644 apps/lend/src/entities/token/lib/validation.ts create mode 100644 apps/lend/src/entities/token/model/index.ts create mode 100644 apps/lend/src/entities/token/model/query-keys.ts create mode 100644 apps/lend/src/entities/token/model/query-options.ts create mode 100644 apps/lend/src/entities/token/model/validation.ts create mode 100644 apps/lend/src/entities/token/types.ts diff --git a/apps/lend/src/entities/chain/lib/index.ts b/apps/lend/src/entities/chain/lib/index.ts index 43582e695..96dc22595 100644 --- a/apps/lend/src/entities/chain/lib/index.ts +++ b/apps/lend/src/entities/chain/lib/index.ts @@ -1,3 +1,3 @@ -export * from './queries' +export * from './query-hooks' export * from './validation' export * from './hooks' diff --git a/apps/lend/src/entities/chain/lib/queries.ts b/apps/lend/src/entities/chain/lib/query-hooks.ts similarity index 100% rename from apps/lend/src/entities/chain/lib/queries.ts rename to apps/lend/src/entities/chain/lib/query-hooks.ts diff --git a/apps/lend/src/entities/chain/model/index.ts b/apps/lend/src/entities/chain/model/index.ts index f8ed2b452..0c515b32e 100644 --- a/apps/lend/src/entities/chain/model/index.ts +++ b/apps/lend/src/entities/chain/model/index.ts @@ -1,2 +1,2 @@ export * from './query-keys' -export * from './chain-validation' +export * from './validation' diff --git a/apps/lend/src/entities/chain/model/chain-validation.ts b/apps/lend/src/entities/chain/model/validation.ts similarity index 100% rename from apps/lend/src/entities/chain/model/chain-validation.ts rename to apps/lend/src/entities/chain/model/validation.ts diff --git a/apps/lend/src/entities/token/api/query.ts b/apps/lend/src/entities/token/api/query.ts new file mode 100644 index 000000000..fff585291 --- /dev/null +++ b/apps/lend/src/entities/token/api/query.ts @@ -0,0 +1,17 @@ +import { QueryFunction } from '@tanstack/react-query' +import { logQuery } from '@/shared/lib/logging' +import { assertTokenValidity } from '@/entities/token/lib/validation' +import { TokenQueryKeyType } from '@/entities/token' +import useStore from '@/store/useStore' + +export const queryTokenUsdRate: QueryFunction< + number, + TokenQueryKeyType<'root'> +> = async ({ queryKey }) => { + logQuery(queryKey) + const [, chainId, , givenAddress] = queryKey + const { address } = assertTokenValidity({ chainId, address: givenAddress }) + + const {api} = useStore.getState() + return await api!.getUsdRate(address) +} diff --git a/apps/lend/src/entities/token/index.ts b/apps/lend/src/entities/token/index.ts new file mode 100644 index 000000000..1ac09c6e8 --- /dev/null +++ b/apps/lend/src/entities/token/index.ts @@ -0,0 +1,3 @@ +export * from './lib' +export * from './model' +export * from './types' diff --git a/apps/lend/src/entities/token/lib/index.ts b/apps/lend/src/entities/token/lib/index.ts new file mode 100644 index 000000000..79ea55e73 --- /dev/null +++ b/apps/lend/src/entities/token/lib/index.ts @@ -0,0 +1 @@ +export * from './query-hooks' \ No newline at end of file diff --git a/apps/lend/src/entities/token/lib/query-hooks.ts b/apps/lend/src/entities/token/lib/query-hooks.ts new file mode 100644 index 000000000..e5ea5c0ba --- /dev/null +++ b/apps/lend/src/entities/token/lib/query-hooks.ts @@ -0,0 +1,4 @@ +import { createQueryHook } from '@/shared/lib/queries' +import { getTokenUsdRateQueryOptions } from '@/entities/token/model/query-options' + +export const useTokenUsdRate = createQueryHook(getTokenUsdRateQueryOptions); diff --git a/apps/lend/src/entities/token/lib/validation.ts b/apps/lend/src/entities/token/lib/validation.ts new file mode 100644 index 000000000..4655b5868 --- /dev/null +++ b/apps/lend/src/entities/token/lib/validation.ts @@ -0,0 +1,8 @@ +import { CombinedTokenParams, tokenValidationSuite } from '@/entities/token' +import { assertValidity, checkValidity } from '@/shared/lib/validation' + +export const assertTokenValidity = (data: T, fields?: Extract[]) => + assertValidity(tokenValidationSuite, data, fields) + +export const checkTokenValidity = (data: T, fields?: Extract[]) => + checkValidity(tokenValidationSuite, data, fields) diff --git a/apps/lend/src/entities/token/model/index.ts b/apps/lend/src/entities/token/model/index.ts new file mode 100644 index 000000000..0c515b32e --- /dev/null +++ b/apps/lend/src/entities/token/model/index.ts @@ -0,0 +1,2 @@ +export * from './query-keys' +export * from './validation' diff --git a/apps/lend/src/entities/token/model/query-keys.ts b/apps/lend/src/entities/token/model/query-keys.ts new file mode 100644 index 000000000..af7b47081 --- /dev/null +++ b/apps/lend/src/entities/token/model/query-keys.ts @@ -0,0 +1,9 @@ +import type { ChainQueryParams } from '@/entities/chain/types' +import type { ExtractQueryKeyType } from '@/shared/types/api' +import { TokenQueryParams } from '@/entities/token' + +export const tokenKeys = { + root: ({ chainId, address }: TokenQueryParams) => ['chain', chainId, 'token', address] as const, +} as const + +export type TokenQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/entities/token/model/query-options.ts b/apps/lend/src/entities/token/model/query-options.ts new file mode 100644 index 000000000..fc77a8207 --- /dev/null +++ b/apps/lend/src/entities/token/model/query-options.ts @@ -0,0 +1,13 @@ +import { queryOptions } from '@tanstack/react-query' +import { tokenKeys, TokenQueryParams } from '@/entities/token' +import { queryTokenUsdRate } from '@/entities/token/api/query' +import { REFRESH_INTERVAL } from '@/constants' +import { checkTokenValidity } from '@/entities/token/lib/validation' + +export const getTokenUsdRateQueryOptions = (params: TokenQueryParams) => + queryOptions({ + queryKey: tokenKeys.root(params), + queryFn: queryTokenUsdRate, + staleTime: REFRESH_INTERVAL['5m'], + enabled: checkTokenValidity(params), + }) diff --git a/apps/lend/src/entities/token/model/validation.ts b/apps/lend/src/entities/token/model/validation.ts new file mode 100644 index 000000000..ba7c7a368 --- /dev/null +++ b/apps/lend/src/entities/token/model/validation.ts @@ -0,0 +1,15 @@ +import type { TokenQueryParams } from '@/entities/token/types' +import { createValidationSuite } from '@/shared/lib/validation' +import { enforce, group, test } from 'vest' +import useStore from '@/store/useStore' +import { chainValidationGroup } from 'main/src/entities/chain' + +export const tokenValidationGroup = ({ chainId, address }: TokenQueryParams) => + group('tokenValidation', () => { + chainValidationGroup({ chainId }) + test('address', () => { + enforce(address).message('Token address is required').isNotEmpty().message('Invalid token address').isAddress(); + }) + }) + +export const tokenValidationSuite = createValidationSuite(tokenValidationGroup) diff --git a/apps/lend/src/entities/token/types.ts b/apps/lend/src/entities/token/types.ts new file mode 100644 index 000000000..1ec0755b7 --- /dev/null +++ b/apps/lend/src/entities/token/types.ts @@ -0,0 +1,7 @@ +import { ChainQueryParams } from '@/entities/chain/types' + +export type TokenQueryParams = ChainQueryParams & { + address?: string +} + +export type CombinedTokenParams = TokenQueryParams From be0b049f4aed9fc10341b19e787853bdbb494558 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Thu, 3 Oct 2024 16:06:13 +0200 Subject: [PATCH 013/137] refactor: get rid of usdRate slice --- .../src/components/DetailInfoEstimateGas.tsx | 8 +- apps/lend/src/components/DetailInfoLTV.tsx | 33 ++-- apps/lend/src/components/InpChipUsdRate.tsx | 8 +- .../MarketLabel/components/ChipMarket.tsx | 144 ------------------ .../MarketLabel/components/ChipToken.tsx | 137 ----------------- .../MarketLabel/components/ChipTokens.tsx | 71 --------- .../lend/src/components/MarketLabel/index.tsx | 104 ------------- .../components/SharedCellData/CellMarket.tsx | 27 ---- apps/lend/src/entities/chain/lib/hooks.ts | 38 +++-- apps/lend/src/entities/token/api/query.ts | 6 +- apps/lend/src/entities/token/lib/index.ts | 3 +- .../src/entities/token/lib/last-results.ts | 7 + .../src/entities/token/lib/query-hooks.ts | 8 +- .../src/entities/token/model/query-keys.ts | 4 +- .../src/entities/token/model/validation.ts | 9 +- apps/lend/src/entities/token/types.ts | 2 +- apps/lend/src/hooks/useVaultShares.ts | 7 +- apps/lend/src/store/createAppSlice.ts | 2 - apps/lend/src/store/createMarketListSlice.ts | 19 +-- apps/lend/src/store/createMarketsSlice.ts | 6 +- apps/lend/src/store/createUsdRatesSlice.ts | 93 ----------- apps/lend/src/store/useStore.ts | 3 - packages/curve-lib/package.json | 3 +- .../src/shared/lib/queries/combine.ts | 45 ++++-- .../curve-lib/src/shared/lib/queries/types.ts | 10 +- 25 files changed, 112 insertions(+), 685 deletions(-) delete mode 100644 apps/lend/src/components/MarketLabel/components/ChipMarket.tsx delete mode 100644 apps/lend/src/components/MarketLabel/components/ChipToken.tsx delete mode 100644 apps/lend/src/components/MarketLabel/components/ChipTokens.tsx delete mode 100644 apps/lend/src/components/MarketLabel/index.tsx delete mode 100644 apps/lend/src/components/SharedCellData/CellMarket.tsx create mode 100644 apps/lend/src/entities/token/lib/last-results.ts delete mode 100644 apps/lend/src/store/createUsdRatesSlice.ts diff --git a/apps/lend/src/components/DetailInfoEstimateGas.tsx b/apps/lend/src/components/DetailInfoEstimateGas.tsx index 8617aa7e0..e38fb53f3 100644 --- a/apps/lend/src/components/DetailInfoEstimateGas.tsx +++ b/apps/lend/src/components/DetailInfoEstimateGas.tsx @@ -10,6 +10,8 @@ import useStore from '@/store/useStore' import DetailInfo from '@/ui/DetailInfo' import IconTooltip from '@/ui/Tooltip/TooltipIcon' +import { useTokenUsdRate } from '@/entities/token' +import { CRVUSD_ADDRESS } from 'loan/src/constants' export type StepProgress = { active: number @@ -26,7 +28,7 @@ interface Props { } const DetailInfoEstimateGas = ({ chainId, isDivider, loading, estimatedGas, stepProgress }: Props) => { - const chainTokenUsdRate = useStore((state) => state.usdRates.tokens['0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee']) + const { data: chainTokenUsdRate } = useTokenUsdRate({ chainId, tokenAddress: CRVUSD_ADDRESS }) const gasPricesDefault = chainId && networks[chainId].gasPricesDefault // TODO: allow gas prices priority adjustment const basePlusPriorities = useStore((state) => state.gas.gasInfo?.basePlusPriority) @@ -38,10 +40,10 @@ const DetailInfoEstimateGas = ({ chainId, isDivider, loading, estimatedGas, step const { symbol, gasPricesUnit } = networks[chainId] const estGasCost = new BN(gweiToEther(weiToGwei(basePlusPriority) * estimatedGas)) - if (chainTokenUsdRate === 'NaN') { + if (isNaN(chainTokenUsdRate)) { return { estGasCost: estGasCost.toString(), estGasCostUsd: 'NaN', tooltip: '' } } else { - const estGasCostUsd = estGasCost.multipliedBy(chainTokenUsdRate).toString() + const estGasCostUsd = estGasCost.multipliedBy(new BN(chainTokenUsdRate)).toString() const gasAmountUnit = formatNumber(weiToGwei(basePlusPriority), { maximumFractionDigits: 2 }) const tooltip = `${formatNumber(estGasCost.toString())} ${symbol} at ${gasAmountUnit} ${gasPricesUnit}` return { estGasCost: estGasCost.toString(), estGasCostUsd, tooltip } diff --git a/apps/lend/src/components/DetailInfoLTV.tsx b/apps/lend/src/components/DetailInfoLTV.tsx index 669813b79..c112652ba 100644 --- a/apps/lend/src/components/DetailInfoLTV.tsx +++ b/apps/lend/src/components/DetailInfoLTV.tsx @@ -2,9 +2,10 @@ import React, { useMemo } from 'react' import { t } from '@lingui/macro' import { FORMAT_OPTIONS, formatNumber } from '@/ui/utils' -import useStore from '@/store/useStore' import DetailInfo from '@/ui/DetailInfo' +import { useTokenUsdRate, useTokenUsdRates } from '@/entities/token' +import { useChainId } from '@/entities/chain' type Amount = { amount: string; address: string } @@ -17,31 +18,17 @@ const DetailInfoLTV = ({ debt: Amount | undefined collaterals: Amount[] | undefined }) => { - const usdRatesMapper = useStore((state) => state.usdRates.tokens) + const chainId = useChainId() + const { data: debtUsdRate } = useTokenUsdRate({ chainId, tokenAddress: debt?.address }) + const collateralAddresses = useMemo(() => collaterals?.map(c => c.address), [collaterals]) + const { data: collateralUsdRates } = useTokenUsdRates({ chainId, tokenAddresses: collateralAddresses }) - const debtUsd = useMemo(() => { - if (debt) { - const usdRate = usdRatesMapper[debt.address] - return +debt.amount * +usdRate - } - }, [debt, usdRatesMapper]) + const debtUsd = useMemo(() => debt && debtUsdRate && +debt.amount * +debtUsdRate, [debt, debtUsdRate]) const collateralUsd = useMemo(() => { - if (!collaterals) return undefined - - const haveMissingUsdRates = collaterals.some(({ amount, address }) => { - typeof usdRatesMapper[address] === 'undefined' - }) - - if (haveMissingUsdRates) return undefined - - return collaterals.reduce((prev, { amount, address }) => { - const usdRate = usdRatesMapper[address] - const amountInUsd = +amount * +usdRate - prev += amountInUsd - return prev - }, 0) - }, [collaterals, usdRatesMapper]) + if (!collaterals?.every(c => c.address in collateralUsdRates)) return undefined + return collaterals.reduce((prev, { amount, address }) => prev + (+amount * +collateralUsdRates[address]), 0) + }, [collaterals, collateralUsdRates]) return ( diff --git a/apps/lend/src/components/InpChipUsdRate.tsx b/apps/lend/src/components/InpChipUsdRate.tsx index a7a22a002..ca5f3f411 100644 --- a/apps/lend/src/components/InpChipUsdRate.tsx +++ b/apps/lend/src/components/InpChipUsdRate.tsx @@ -1,14 +1,14 @@ import type { InpChipUsdRateProps } from '@/ui/InpChipUsdRate/InpChipUsdRate' -import useStore from '@/store/useStore' - import InpChipUsdRateComp from '@/ui/InpChipUsdRate' +import { useTokenUsdRate } from '@/entities/token' +import { useChainId } from '@/entities/chain' const InpChipUsdRate = ({ - address = '', + address: tokenAddress, ...props }: Omit & { address: string | undefined }) => { - const usdRate = useStore((state) => state.usdRates.tokens[address]) + const { data: usdRate } = useTokenUsdRate({ chainId: useChainId(), tokenAddress }) return } diff --git a/apps/lend/src/components/MarketLabel/components/ChipMarket.tsx b/apps/lend/src/components/MarketLabel/components/ChipMarket.tsx deleted file mode 100644 index e5b016786..000000000 --- a/apps/lend/src/components/MarketLabel/components/ChipMarket.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import type { AriaButtonProps } from 'react-aria' - -import { useButton } from 'react-aria' -import { useRef } from 'react' -import styled from 'styled-components' - -import { breakpoints } from '@/ui/utils/responsive' -import { copyToClipboard, shortenTokenAddress } from '@/utils/helpers' - -import Icon from '@/ui/Icon' -import TextEllipsis from '@/ui/TextEllipsis' - -const CopyButton = ({ - className = '', - ...props -}: AriaButtonProps & { - className?: string -}) => { - let ref = useRef(null) - let { buttonProps, isPressed } = useButton(props, ref) - let { children } = props - - return ( - - {children} - - ) -} - -const ChipPoolCopyButton = styled.button` - margin-right: 2px; - color: inherit; - background: transparent; - cursor: pointer; - - &.isPressed { - color: white; - background-color: var(--primary-400); - } -` - -const ChipMarket = ({ - className, - isMobile, - isHighlightLabelName, - isHighlightLabelAddress, - label, - labelAddress, - ...props -}: AriaButtonProps & { - className?: string - isMobile?: boolean - isHighlightLabelName?: boolean // highlight name if it is part of pool list search result - isHighlightLabelAddress?: boolean - amount?: string - showUsdAmount?: boolean // display amount instead of token name - label: string | React.ReactNode - labelAddress: string -}) => { - const handleCopyClick = (address: string) => { - copyToClipboard(address) - console.log(`Copied ${address}`) - } - - const shortenLabelAddress = shortenTokenAddress(labelAddress) - - return ( - - - {!isMobile && ( - - handleCopyClick(labelAddress)}> - - {isHighlightLabelAddress ? {shortenLabelAddress} : shortenLabelAddress} - - - - - )} - - ) -} - -const HoveredContent = styled.span` - align-items: center; - display: inline-flex; - max-width: 0; - transition: max-width 1s; - white-space: nowrap; - overflow: hidden; -` - -const Wrapper = styled.span<{ isMobile?: boolean }>` - display: inherit; - min-height: 25px; - border: 1px solid transparent; - - ${({ isMobile }) => { - if (!isMobile) { - return ` - :hover { - border-color: lightgray; - - ${HoveredContent} { - max-width: 18.75rem; // 300px - } - } - ` - } - }} -` - -const MarketAddress = styled.span` - margin-right: 2px; - font-family: var(--font-mono); - font-size: var(--font-size-2); -` - -const Label = styled(TextEllipsis)<{ isMobile?: boolean }>` - font-size: var(--font-size-4); - font-weight: bold; - ${({ isMobile }) => isMobile && `max-width: 11.875rem;`}; // 190px - - @media (min-width: ${breakpoints.sm}rem) { - font-size: 1.25rem; // 20px - max-width: 13.75rem; // 220px - } - @media (min-width: ${breakpoints.lg}rem) { - max-width: 13.125rem; // 210px - } -` - -const CopyButtonIcon = styled(Icon)` - position: relative; - top: 2px; -` - -ChipMarket.defaultProps = { - className: '', -} - -export default ChipMarket diff --git a/apps/lend/src/components/MarketLabel/components/ChipToken.tsx b/apps/lend/src/components/MarketLabel/components/ChipToken.tsx deleted file mode 100644 index ef7edce56..000000000 --- a/apps/lend/src/components/MarketLabel/components/ChipToken.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import type { AriaButtonProps } from 'react-aria' - -import { useButton } from 'react-aria' -import { useMemo, useRef } from 'react' -import styled from 'styled-components' -import useStore from '@/store/useStore' - -import { copyToClipboard } from '@/utils/helpers' -import { formatNumberUsdRate } from '@/ui/utils' - -import Icon from '@/ui/Icon' -import Spinner from '@/ui/Spinner' - -const Button = ({ - className = '', - ...props -}: AriaButtonProps & { - className?: string -}) => { - let ref = useRef(null) - let { buttonProps, isPressed } = useButton(props, ref) - let { children } = props - - return ( - - {children} - - ) -} - -const ChipTokenCopyButton = styled.button` - margin-left: 2px; - color: inherit; - background: transparent; - cursor: pointer; - - &.isPressed { - color: white; - background-color: var(--primary-400); - } -` - -const ChipToken = ({ - className, - isHighlight, - tokenName, - tokenAddress, - ...props -}: AriaButtonProps & { - className?: string - isHighlight?: boolean // highlight name if it is part of pool list search result - amount?: string - showUsdAmount?: boolean // display amount instead of token name - tokenName: string - tokenAddress: string -}) => { - const api = useStore((state) => state.api) - const usdRate = useStore((state) => state.usdRates.tokens[tokenAddress]) - const fetchUsdRateByToken = useStore((state) => state.usdRates.fetchUsdRateByToken) - const parsedUsdRate = formatNumberUsdRate(usdRate) - - const handleCopyClick = (address: string) => { - copyToClipboard(address) - console.log(`Copied ${address}`) - } - - const handleMouseEnter = (foundUsdRate?: string) => { - if (!foundUsdRate && api) { - fetchUsdRateByToken(api, tokenAddress) - } - } - - const parsedTokenName = useMemo(() => { - if (tokenName && tokenName.length > 10) { - return `${tokenName.slice(0, 5)}...` - } - return tokenName - }, [tokenName]) - - return ( - handleMouseEnter(parsedUsdRate)}> - {isHighlight ? {parsedTokenName} : parsedTokenName} - - - - - ) -} - -const ChipTokenAdditionalInfo = styled.span` - align-items: center; - max-width: 0; - transition: max-width 1s; - white-space: nowrap; - overflow: hidden; -` - -const ChipTokenWrapper = styled.span` - align-items: center; - display: inline-flex; - min-height: 24px; - padding: 0 1px; - border: 1px solid transparent; - font-size: var(--font-size-2); - - :hover { - margin-right: 4px; - border-color: lightgray; - - ${ChipTokenAdditionalInfo} { - max-width: 18.75rem; // 300px - } - } -` - -const ChipTokenUsdRate = styled.span` - margin: 0 2px; - position: relative; - top: -2px; - font-size: var(--font-size-1); - font-weight: bold; -` - -const ChipTokenCopyButtonIcon = styled(Icon)` - position: relative; - top: 1px; - margin: 0 2px; -` - -ChipToken.defaultProps = { - className: '', -} - -export default ChipToken diff --git a/apps/lend/src/components/MarketLabel/components/ChipTokens.tsx b/apps/lend/src/components/MarketLabel/components/ChipTokens.tsx deleted file mode 100644 index 3a1ffb237..000000000 --- a/apps/lend/src/components/MarketLabel/components/ChipTokens.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react' -import styled from 'styled-components' - -import { _isStartPartOrEnd, _parseSearchTextToList } from '@/components/PageMarketList/utils' - -import ChipToken from '@/components/MarketLabel/components/ChipToken' - -const ChipTokens = ({ - isMobile, - isVisible, - owmDataCachedOrApi, - searchText, - searchTextByTokensAndAddresses, -}: { - isMobile?: boolean - isVisible?: boolean - owmDataCachedOrApi: OWMDataCacheOrApi - searchText?: string - searchTextByTokensAndAddresses?: { [address: string]: boolean } -}) => { - const { addresses, borrowed_token, collateral_token } = owmDataCachedOrApi?.owm ?? {} - - const parsedSearchText = searchText?.toLowerCase().trim() - const tokens = borrowed_token && collateral_token ? [collateral_token.symbol, borrowed_token.symbol] : [] - const tokenAddresses = borrowed_token && collateral_token ? [collateral_token.address, borrowed_token.address] : [] - - return ( - -
- {isMobile - ? tokens.map((token, idx) => { - return {token} - }) - : isVisible && - tokens.map((token, idx) => { - const tokenAddress = tokenAddresses[idx] - const parsedSearchTexts = parsedSearchText ? _parseSearchTextToList(parsedSearchText) : null - - const isHighlight = - !!parsedSearchTexts && - !!searchTextByTokensAndAddresses && - addresses && - addresses.amm in searchTextByTokensAndAddresses - ? parsedSearchTexts.some((st) => _isStartPartOrEnd(st, token.toLowerCase())) || - parsedSearchTexts.some((st) => _isStartPartOrEnd(st, tokenAddress.toLowerCase())) - : false - - return ( - - ) - })} -
-
- ) -} - -const Wrapper = styled.div` - min-height: 1.5rem; // 24px; - text-align: left; -` - -const TokenLabel = styled.span` - font-size: var(--font-size-2); -` - -export default ChipTokens diff --git a/apps/lend/src/components/MarketLabel/index.tsx b/apps/lend/src/components/MarketLabel/index.tsx deleted file mode 100644 index 48d84eeff..000000000 --- a/apps/lend/src/components/MarketLabel/index.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import React from 'react' -import styled from 'styled-components' - -import networks from '@/networks' - -import Chip from '@/ui/Typography/Chip' -import Box from '@/ui/Box' -import ChipMarket from '@/components/MarketLabel/components/ChipMarket' -import ChipTokens from '@/components/MarketLabel/components/ChipTokens' -import TokenIcons from '@/components/TokenIcons' - -const MarketLabel = ({ - rChainId, - className, - isMobile, - isVisible, - owmDataCachedOrApi, - tableListProps, -}: { - rChainId: ChainId - className?: string - isMobile?: boolean - isVisible?: boolean - owmDataCachedOrApi: OWMDataCacheOrApi - tableListProps?: { - hideTokens?: boolean - quickViewValue?: string | React.ReactNode | null - searchText?: string - searchTextByTokensAndAddresses?: { [address: string]: boolean } - searchTextByOther?: { [address: string]: boolean } - onClick(target: EventTarget): void - } -}) => { - const { id, addresses, borrowed_token, collateral_token } = owmDataCachedOrApi?.owm ?? {} - const { hideTokens, searchText, searchTextByTokensAndAddresses, searchTextByOther, quickViewValue, onClick } = - tableListProps ?? {} - - const parsedSearchText = searchText?.toLowerCase().trim() - const isHighlightLabelAddress = parsedSearchText && id ? searchTextByOther?.[id] ?? false : false - const isHighlightLabelName = parsedSearchText && id ? searchTextByOther?.[id] ?? false : false - const tokens = collateral_token && borrowed_token ? [collateral_token.symbol, borrowed_token.symbol] : [] - const tokenAddresses = collateral_token && borrowed_token ? [collateral_token.address, borrowed_token.address] : [] - - const handleClick = (target: EventTarget) => { - if (typeof onClick === 'function') { - const { nodeName } = target as HTMLElement - if (nodeName !== 'A') { - // prevent click-through link from tooltip - onClick(target) - } - } - } - - return ( -
- handleClick(target)}> - - {isVisible && ( - - )} - -
- - - - - {!hideTokens && ( - - )} - {quickViewValue && {quickViewValue}} -
-
-
- ) -} - -const IconsWrapper = styled.div` - min-width: 3.3125rem; // 53px -` - -const Wrapper = styled.div<{ isMobile?: boolean }>` - align-items: center; - display: grid; - height: 100%; - grid-template-columns: auto 1fr; -` - -export default MarketLabel diff --git a/apps/lend/src/components/SharedCellData/CellMarket.tsx b/apps/lend/src/components/SharedCellData/CellMarket.tsx deleted file mode 100644 index c59b7195c..000000000 --- a/apps/lend/src/components/SharedCellData/CellMarket.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import MarketLabel from '@/components/MarketLabel' -import React from 'react' - -const CellMarket = ({ - rChainId, - isVisible, - owmDataCachedOrApi, -}: { - rChainId: ChainId - isVisible: boolean - owmDataCachedOrApi: OWMDataCacheOrApi -}) => { - return ( - {}, - }} - /> - ) -} - -export default CellMarket diff --git a/apps/lend/src/entities/chain/lib/hooks.ts b/apps/lend/src/entities/chain/lib/hooks.ts index 7c4da25af..5d10f154d 100644 --- a/apps/lend/src/entities/chain/lib/hooks.ts +++ b/apps/lend/src/entities/chain/lib/hooks.ts @@ -4,13 +4,22 @@ import { FORMAT_OPTIONS, formatNumber } from '@/ui/utils' import { CRVUSD_ADDRESS } from 'loan/src/constants' import { BD } from '@/shared/curve-lib' import { useCrvUsdTotalSupply } from '@/entities/chain' +import { useTokenUsdRate, useTokenUsdRates } from '@/entities/token' -export const useTvl = (rChainId: ChainId) => { - const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[rChainId]) - const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[rChainId]) - const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[rChainId]) - const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[rChainId]) - const usdRatesMapper = useStore((state) => state.usdRates.tokens) +export const useChainId = () => { + const api = useStore(state => state.api) + return api?.chainId +} + +const getTokenAddresses = (oneWayMarkets?: OWMDatasMapper) => Object.values(oneWayMarkets ?? {}).flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]).map(t => t.address) + +export const useTvl = (chainId: ChainId) => { + const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[chainId]) + const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[chainId]) + const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[chainId]) + const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[chainId]) + const tokenAddresses = useMemo(() => getTokenAddresses(owmDatasMapper), [owmDatasMapper]); + const { data: usdRatesMapper } = useTokenUsdRates({ chainId, tokenAddresses: tokenAddresses }) return useMemo(() => { if ( @@ -28,8 +37,8 @@ export const useTvl = (rChainId: ChainId) => { const { id, collateral_token } = owm const ammBalance = marketsCollateralMapper[id] ?? {} - const collateralUsdRate = usdRatesMapper[collateral_token.address] - const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * +(collateralUsdRate ?? '0') + const collateralUsdRate = usdRatesMapper[collateral_token.address] ?? 0 + const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * collateralUsdRate totalCollateral += marketTotalCollateralUsd totalDebt += +marketsTotalDebtMapper[id]?.totalDebt @@ -42,16 +51,3 @@ export const useTvl = (rChainId: ChainId) => { } }, [owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, usdRatesMapper]) } - -export const useCrvUsdPrice = () => { - return useStore((state) => state.usdRates.tokens[CRVUSD_ADDRESS]) -} - -export const useCrvUsdTotalSupplyInUSD = (chainId: ChainId) => { - const { data: totalCrvUsd } = useCrvUsdTotalSupply({ chainId }) - const inUsd = useCrvUsdPrice() - if (!totalCrvUsd || !inUsd) { - return null - } - return BD.from(totalCrvUsd).div(BD.from(inUsd)) -} \ No newline at end of file diff --git a/apps/lend/src/entities/token/api/query.ts b/apps/lend/src/entities/token/api/query.ts index fff585291..e7480dce9 100644 --- a/apps/lend/src/entities/token/api/query.ts +++ b/apps/lend/src/entities/token/api/query.ts @@ -6,12 +6,12 @@ import useStore from '@/store/useStore' export const queryTokenUsdRate: QueryFunction< number, - TokenQueryKeyType<'root'> + TokenQueryKeyType<'usdRate'> > = async ({ queryKey }) => { logQuery(queryKey) const [, chainId, , givenAddress] = queryKey - const { address } = assertTokenValidity({ chainId, address: givenAddress }) + const { tokenAddress } = assertTokenValidity({ chainId, tokenAddress: givenAddress }) const {api} = useStore.getState() - return await api!.getUsdRate(address) + return await api!.getUsdRate(tokenAddress) } diff --git a/apps/lend/src/entities/token/lib/index.ts b/apps/lend/src/entities/token/lib/index.ts index 79ea55e73..2668e5370 100644 --- a/apps/lend/src/entities/token/lib/index.ts +++ b/apps/lend/src/entities/token/lib/index.ts @@ -1 +1,2 @@ -export * from './query-hooks' \ No newline at end of file +export * from './query-hooks' +export * from './validation' \ No newline at end of file diff --git a/apps/lend/src/entities/token/lib/last-results.ts b/apps/lend/src/entities/token/lib/last-results.ts new file mode 100644 index 000000000..1afb3d6a5 --- /dev/null +++ b/apps/lend/src/entities/token/lib/last-results.ts @@ -0,0 +1,7 @@ +import { queryClient } from '@/shared/api/query-client' +import { tokenKeys } from '@/entities/token' + +export const getLastTokenUsdRate = (chainId: ChainId, tokenAddress: string) => queryClient.getQueryData(tokenKeys.usdRate({ + chainId, + tokenAddress +})) diff --git a/apps/lend/src/entities/token/lib/query-hooks.ts b/apps/lend/src/entities/token/lib/query-hooks.ts index e5ea5c0ba..9eef6c766 100644 --- a/apps/lend/src/entities/token/lib/query-hooks.ts +++ b/apps/lend/src/entities/token/lib/query-hooks.ts @@ -1,4 +1,10 @@ -import { createQueryHook } from '@/shared/lib/queries' +import { createQueryHook, useQueryMapping } from '@/shared/lib/queries' import { getTokenUsdRateQueryOptions } from '@/entities/token/model/query-options' +import { ChainQueryParams } from '@/entities/chain' export const useTokenUsdRate = createQueryHook(getTokenUsdRateQueryOptions); +export const useTokenUsdRates = ({ chainId, tokenAddresses = [] }: ChainQueryParams & { tokenAddresses?: string[] }) => + useQueryMapping( + tokenAddresses.map((tokenAddress) => getTokenUsdRateQueryOptions({ chainId, tokenAddress })), + tokenAddresses + ) diff --git a/apps/lend/src/entities/token/model/query-keys.ts b/apps/lend/src/entities/token/model/query-keys.ts index af7b47081..cc84fb9ed 100644 --- a/apps/lend/src/entities/token/model/query-keys.ts +++ b/apps/lend/src/entities/token/model/query-keys.ts @@ -1,9 +1,9 @@ -import type { ChainQueryParams } from '@/entities/chain/types' import type { ExtractQueryKeyType } from '@/shared/types/api' import { TokenQueryParams } from '@/entities/token' export const tokenKeys = { - root: ({ chainId, address }: TokenQueryParams) => ['chain', chainId, 'token', address] as const, + root: ({ chainId, tokenAddress }: TokenQueryParams) => ['chain', chainId, 'token', tokenAddress] as const, + usdRate: (params: TokenQueryParams) => [...tokenKeys.root(params), 'usdRate'] as const, } as const export type TokenQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/entities/token/model/validation.ts b/apps/lend/src/entities/token/model/validation.ts index ba7c7a368..8c7ca055e 100644 --- a/apps/lend/src/entities/token/model/validation.ts +++ b/apps/lend/src/entities/token/model/validation.ts @@ -1,14 +1,13 @@ import type { TokenQueryParams } from '@/entities/token/types' import { createValidationSuite } from '@/shared/lib/validation' import { enforce, group, test } from 'vest' -import useStore from '@/store/useStore' -import { chainValidationGroup } from 'main/src/entities/chain' +import { chainValidationGroup } from '@/entities/chain' -export const tokenValidationGroup = ({ chainId, address }: TokenQueryParams) => +export const tokenValidationGroup = ({ chainId, tokenAddress }: TokenQueryParams) => group('tokenValidation', () => { chainValidationGroup({ chainId }) - test('address', () => { - enforce(address).message('Token address is required').isNotEmpty().message('Invalid token address').isAddress(); + test('tokenAddress', () => { + enforce(tokenAddress).message('Token address is required').isNotEmpty().message('Invalid token address').isAddress(); }) }) diff --git a/apps/lend/src/entities/token/types.ts b/apps/lend/src/entities/token/types.ts index 1ec0755b7..8829c43d5 100644 --- a/apps/lend/src/entities/token/types.ts +++ b/apps/lend/src/entities/token/types.ts @@ -1,7 +1,7 @@ import { ChainQueryParams } from '@/entities/chain/types' export type TokenQueryParams = ChainQueryParams & { - address?: string + tokenAddress?: string } export type CombinedTokenParams = TokenQueryParams diff --git a/apps/lend/src/hooks/useVaultShares.ts b/apps/lend/src/hooks/useVaultShares.ts index ccae59be3..8cfca61c3 100644 --- a/apps/lend/src/hooks/useVaultShares.ts +++ b/apps/lend/src/hooks/useVaultShares.ts @@ -2,18 +2,19 @@ import { useEffect, useMemo } from 'react' import useStore from '@/store/useStore' import { FORMAT_OPTIONS, formatNumber } from '@/ui/utils' +import { useTokenUsdRate } from '@/entities/token' function useVaultShares(rChainId: ChainId, rOwmId: string, vaultShares: string | number | undefined = '0') { const owmData = useStore((state) => state.markets.owmDatasMapper[rChainId]?.[rOwmId]) const pricePerShareResp = useStore((state) => state.markets.vaultPricePerShare[rChainId]?.[rOwmId]) const { address = '', symbol = '' } = owmData?.owm?.borrowed_token ?? {} - const usdRate = useStore((state) => state.usdRates.tokens[address]) + const { data: usdRate } = useTokenUsdRate({ chainId: rChainId, tokenAddress: address }) const fetchVaultPricePerShare = useStore((state) => state.markets.fetchVaultPricePerShare) const { borrowedAmount, borrowedAmountUsd } = useMemo<{ borrowedAmount: string; borrowedAmountUsd: string }>(() => { const { pricePerShare, error } = pricePerShareResp ?? {} - if (error || usdRate === 'NaN') { + if (error || usdRate == null || isNaN(usdRate)) { return { borrowedAmount: '?', borrowedAmountUsd: '?' } } @@ -22,7 +23,7 @@ function useVaultShares(rChainId: ChainId, rOwmId: string, vaultShares: string | const borrowedAmtUsd = +pricePerShare * +vaultShares * +usdRate return { - borrowedAmount: `${formatNumber(borrowedAmt, { showDecimalIfSmallNumberOnly: true })}${' '}${symbol}`, + borrowedAmount: `${formatNumber(borrowedAmt, { showDecimalIfSmallNumberOnly: true })} ${symbol}`, borrowedAmountUsd: formatNumber(borrowedAmtUsd, FORMAT_OPTIONS.USD), } } diff --git a/apps/lend/src/store/createAppSlice.ts b/apps/lend/src/store/createAppSlice.ts index 1b5704079..7c13d6785 100644 --- a/apps/lend/src/store/createAppSlice.ts +++ b/apps/lend/src/store/createAppSlice.ts @@ -91,7 +91,6 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => if ( stateKey.startsWith('loan') || stateKey.startsWith('user') || - stateKey === 'usdRates' || stateKey === 'tokens' || stateKey === 'chartBands' || stateKey === 'campaigns' @@ -111,7 +110,6 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => state.updateGlobalStoreByKey('isLoadingCurve', false) await state.markets.fetchMarkets(api) - await state.usdRates.fetchAllStoredUsdRates(api) state.updateGlobalStoreByKey('isLoadingApi', false) if (!prevApi || isNetworkSwitched) { diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index 2344b16df..bb091c06c 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -3,22 +3,26 @@ import type { State } from '@/store/useStore' import type { FilterTypeKey, FormStatus, - MarketListMapper, MarketListItemResult, + MarketListMapper, SearchParams, - TableSettings, + TableSettings } from '@/components/PageMarketList/types' import chunk from 'lodash/chunk' import orderBy from 'lodash/orderBy' import sortByFn from 'lodash/sortBy' -import { DEFAULT_FORM_STATUS, _searchByTokensAddresses, _getMarketList } from '@/components/PageMarketList/utils' +import { _getMarketList, _searchByTokensAddresses, DEFAULT_FORM_STATUS } from '@/components/PageMarketList/utils' import { TITLE } from '@/constants' import { getTotalApr } from '@/utils/utilsRewards' import { helpers } from '@/lib/apiLending' import { sleep } from '@/utils/helpers' import networks from '@/networks' +import { tokenKeys } from '@/entities/token' + +import { queryClient } from '@/shared/api/query-client' +import { getLastTokenUsdRate } from '@/entities/token/lib/last-results' type StateKey = keyof typeof DEFAULT_STATE @@ -86,12 +90,10 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark filterSmallMarkets: (api, owmDatas) => { const { chainId } = api const capAndAvailableMapper = get().markets.statsCapAndAvailableMapper[chainId] ?? {} - const usdRatesMapper = get().usdRates.tokens const { smallMarketAmount, marketListShowOnlyInSmallMarkets } = networks[chainId] return owmDatas.filter(({ owm }) => { const { cap } = capAndAvailableMapper[owm.id] ?? {} - const token = owm.borrowed_token - const usdRate = usdRatesMapper[token.address] + const usdRate = getLastTokenUsdRate(chainId, owm.borrowed_token.address) if (typeof usdRate === 'undefined') return true if (marketListShowOnlyInSmallMarkets[owm.id]) return false return +cap * +usdRate > smallMarketAmount @@ -231,7 +233,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark } }, setFormValues: async (rChainId, api, shouldRefetch) => { - const { markets, storeCache, usdRates, user } = get() + const { markets, storeCache, user } = get() let { activeKey: prevActiveKey, initialLoaded, @@ -244,7 +246,6 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const storedOwmDatas = markets.owmDatas[rChainId] const storedOwmDatasMapper = markets.owmDatasMapper[rChainId] const storedMarketListMapper = marketListMapper[rChainId] - const storedUsdRatesMapper = usdRates.tokens // update activeKey, formStatus const activeKey = _getActiveKey(rChainId, searchParams) @@ -276,7 +277,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark // allow UI to update paint await sleep(100) - if (!api || !storedOwmDatasMapper || !storedMarketListMapper || !storedUsdRatesMapper) return + if (!api || !storedOwmDatasMapper || !storedMarketListMapper) return const { chainId, signerAddress } = api const { filterKey, filterTypeKey, hideSmallMarkets, searchText, sortBy, sortByOrder } = searchParams diff --git a/apps/lend/src/store/createMarketsSlice.ts b/apps/lend/src/store/createMarketsSlice.ts index 547ed07d0..c2e5b2892 100644 --- a/apps/lend/src/store/createMarketsSlice.ts +++ b/apps/lend/src/store/createMarketsSlice.ts @@ -76,7 +76,7 @@ const createMarketsSlice = (set: SetState, get: GetState): Markets ...DEFAULT_STATE, fetchMarkets: async (api) => { - const { marketList, usdRates, storeCache } = get() + const { marketList, storeCache } = get() const { ...sliceState } = get()[sliceKey] const { chainId } = api @@ -84,7 +84,6 @@ const createMarketsSlice = (set: SetState, get: GetState): Markets const { marketList: marketListNames, error } = await helpers.fetchMarkets(api) const chainIdStr = chainId.toString() - let cTokens = { ...usdRates.tokens } let owmDatas: OWMData[] = [] let owmDatasMapper: OWMDatasMapper = {} let owmDatasCacheMapper: OWMDatasCacheMapper = {} @@ -103,8 +102,6 @@ const createMarketsSlice = (set: SetState, get: GetState): Markets const { address: cAddress } = owm.collateral_token const { symbol: bSymbol, address: bAddress } = owm.borrowed_token - if (typeof cTokens[cAddress] === 'undefined') cTokens[cAddress] = '' - if (typeof cTokens[bAddress] === 'undefined') cTokens[bAddress] = '' owmDatas.push(owmData) owmDatasMapper[owm.id] = owmData owmDatasCacheMapper[owm.id] = owmDataCache @@ -115,7 +112,6 @@ const createMarketsSlice = (set: SetState, get: GetState): Markets sliceState.setStateByActiveKey('crvusdAddress', chainIdStr, crvusdAddress) sliceState.setStateByActiveKey('owmDatas', chainIdStr, owmDatas) sliceState.setStateByActiveKey('owmDatasMapper', chainIdStr, owmDatasMapper) - usdRates.setStateByKey('tokens', cTokens) // update market list const { marketListMapper } = _getMarketList(owmDatas, crvusdAddress) diff --git a/apps/lend/src/store/createUsdRatesSlice.ts b/apps/lend/src/store/createUsdRatesSlice.ts deleted file mode 100644 index 6c01dd13b..000000000 --- a/apps/lend/src/store/createUsdRatesSlice.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { GetState, SetState } from 'zustand' -import type { State } from '@/store/useStore' - -import { PromisePool } from '@supercharge/promise-pool' -import cloneDeep from 'lodash/cloneDeep' - -import { log } from '@/shared/lib/logging' -import { helpers } from '@/lib/apiLending' - -type StateKey = keyof typeof DEFAULT_STATE - -type SliceState = { - tokens: UsdRate - loading: boolean -} - -const sliceKey = 'usdRates' - -// prettier-ignore -export type UsdRatesSlice = { - [sliceKey]: SliceState & { - fetchUsdRateByToken(api: Api, tokenAddress: string): Promise - fetchUsdRateByTokens(api: Api, tokenAddresses: string[]): Promise - fetchAllStoredUsdRates(api: Api): Promise - - // steps helper - setStateByActiveKey(key: StateKey, activeKey: string, value: T): void - setStateByKey(key: StateKey, value: T): void - setStateByKeys(SliceState: Partial): void - resetState(): void - } -} - -const DEFAULT_STATE: SliceState = { - tokens: { - // [CRVUSD_ADDRESS]: '', - '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': '', - }, - loading: true, -} - -const createUsdRatesSlice = (set: SetState, get: GetState): UsdRatesSlice => ({ - [sliceKey]: { - ...DEFAULT_STATE, - - fetchUsdRateByToken: async (api, tokenAddress) => { - log('fetchUsdRateByToken', api.chainId, tokenAddress) - const { chainId } = api - const resp = await helpers.fetchUsdRate(api, tokenAddress) - get()[sliceKey].setStateByActiveKey('tokens', tokenAddress, resp.usdRate) - }, - fetchUsdRateByTokens: async (api, tokenAddresses) => { - log('fetchUsdRateByTokens', api.chainId, tokenAddresses.join(',')) - get().usdRates.setStateByKey('loading', true) - - const { results } = await PromisePool.for(tokenAddresses) - .withConcurrency(5) - .process(async (tokenAddress) => { - const resp = await helpers.fetchUsdRate(api, tokenAddress) - return { tokenAddress, usdRate: resp.usdRate } - }) - const { chainId } = api - - const usdRatesTokens: UsdRate = cloneDeep(get()[sliceKey].tokens) - for (const idx in results) { - const { tokenAddress, usdRate } = results[idx] - usdRatesTokens[tokenAddress] = usdRate - } - get()[sliceKey].setStateByKey('tokens', usdRatesTokens) - get().usdRates.setStateByKey('loading', false) - }, - fetchAllStoredUsdRates: async (api) => { - const tokenAddresses = Object.keys(get().usdRates.tokens) - await get()[sliceKey].fetchUsdRateByTokens(api, tokenAddresses) - }, - - // slice helpers - setStateByActiveKey: (key: StateKey, activeKey: string, value: T) => { - get().setAppStateByActiveKey(sliceKey, key, activeKey, value) - }, - setStateByKey: (key: StateKey, value: T) => { - get().setAppStateByKey(sliceKey, key, value) - }, - setStateByKeys: (sliceState: Partial) => { - get().setAppStateByKeys(sliceKey, sliceState) - }, - resetState: () => { - get().resetAppState(sliceKey, cloneDeep(DEFAULT_STATE)) - }, - }, -}) - -export default createUsdRatesSlice diff --git a/apps/lend/src/store/useStore.ts b/apps/lend/src/store/useStore.ts index 77dd1941c..666fe9eae 100644 --- a/apps/lend/src/store/useStore.ts +++ b/apps/lend/src/store/useStore.ts @@ -9,7 +9,6 @@ import createAppSlice, { AppSlice } from '@/store/createAppSlice' import createLayoutSlice, { AppLayoutSlice } from '@/store/createLayoutSlice' import createWalletSlice, { WalletSlice } from '@/store/createWalletSlice' import createGasSlice, { GasSlice } from '@/store/createGasSlice' -import createUsdRatesSlice, { UsdRatesSlice } from '@/store/createUsdRatesSlice' import createTokensSlice, { TokensSlice } from '@/store/createTokensSlice' import createMarketsSlice, { MarketsSlice } from '@/store/createMarketsSlice' import createUserSlice, { UserSlice } from '@/store/createUserSlice' @@ -36,7 +35,6 @@ export type State = CacheSlice & AppLayoutSlice & WalletSlice & GasSlice & - UsdRatesSlice & TokensSlice & IntegrationsSlice & ChartBandsSlice & @@ -63,7 +61,6 @@ const store = (set: SetState, get: GetState): State => ({ ...createWalletSlice(set, get), ...createLayoutSlice(set, get), ...createGasSlice(set, get), - ...createUsdRatesSlice(set, get), ...createTokensSlice(set, get), ...createChartBandsSlice(set, get), ...createMarketsSlice(set, get), diff --git a/packages/curve-lib/package.json b/packages/curve-lib/package.json index 82aed94c9..47e25c182 100644 --- a/packages/curve-lib/package.json +++ b/packages/curve-lib/package.json @@ -9,7 +9,8 @@ "lint": "eslint \"**/*.ts*\"" }, "dependencies": { - "ethers": "^6.11.0" + "ethers": "^6.11.0", + "react": "^18.2.0" }, "devDependencies": { "eslint-config-custom": "*", diff --git a/packages/curve-lib/src/shared/lib/queries/combine.ts b/packages/curve-lib/src/shared/lib/queries/combine.ts index 58ac18767..46785e76e 100644 --- a/packages/curve-lib/src/shared/lib/queries/combine.ts +++ b/packages/curve-lib/src/shared/lib/queries/combine.ts @@ -1,19 +1,34 @@ import { useQueries } from '@tanstack/react-query' -import { CombinedQueriesResult, QueryOptionsArray, QueryResultsArray } from './types' +import { + CombinedQueriesResult, + ExtractDataType, + PartialQueryResult, + QueryOptionsArray, + QueryResultsArray +} from './types' +import { useMemo } from 'react' -export function useCombinedQueries(queryOptions: [...T]): CombinedQueriesResult { - return useQueries({ - queries: queryOptions, - combine: combineQueries, - }) -} +const combineQueriesMeta = (results: QueryResultsArray): Omit, 'data'> => ({ + isLoading: results.some((result) => result.isLoading), + isPending: results.some((result) => result.isPending), + isError: results.some((result) => result.isError), + isFetching: results.some((result) => result.isFetching), +}) + +const combineQueriesToList = (results: QueryResultsArray): CombinedQueriesResult => ({ + data: results.map((result) => result.data), + ...combineQueriesMeta(results), +}) + +export const useCombinedQueries = (queryOptions: [...T]): CombinedQueriesResult => useQueries({ + queries: queryOptions, + combine: combineQueriesToList, +}) -function combineQueries(results: QueryResultsArray): CombinedQueriesResult { - return { - isLoading: results.some((result) => result.isLoading), - data: results.map((result) => result.data), - isPending: results.some((result) => result.isPending), - isError: results.some((result) => result.isError), - isFetching: results.some((result) => result.isFetching), - } +export const useQueryMapping = (queryOptions: [...T], keys: K[]) => { + const { data, ...meta } = useCombinedQueries(queryOptions) + return useMemo(() => ({ + ...meta, + data: Object.fromEntries((data || []).map((result, index) => [keys[index], result])) as Record> + }), [data, meta, keys]) } diff --git a/packages/curve-lib/src/shared/lib/queries/types.ts b/packages/curve-lib/src/shared/lib/queries/types.ts index cd7ae69c4..24817abf7 100644 --- a/packages/curve-lib/src/shared/lib/queries/types.ts +++ b/packages/curve-lib/src/shared/lib/queries/types.ts @@ -10,10 +10,6 @@ export type QueryResultsArray = { [K in keyof T]: T[K] extends UseQueryOptions ? UseQueryResult : never } -export type CombinedQueriesResult = { - isLoading: boolean - data: CombinedDataType - isPending: boolean - isError: boolean - isFetching: boolean -} +export type PartialQueryResult = Pick, 'data' | 'isLoading' | 'isPending' | 'isError' | 'isFetching'> + +export type CombinedQueriesResult = PartialQueryResult>; From bb10315f53ff48fecfa5d0cbd78304cb5216e5a4 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 4 Oct 2024 15:28:10 +0200 Subject: [PATCH 014/137] refactor: cleanup unused code + review --- apps/lend/src/entities/chain/api/query.ts | 26 --------- .../entities/chain/lib/chain-data-hooks.ts | 55 +++++++++++++++++++ apps/lend/src/entities/chain/lib/hooks.ts | 53 ------------------ apps/lend/src/entities/chain/lib/index.ts | 3 +- .../src/entities/chain/lib/query-hooks.ts | 4 -- .../src/entities/chain/model/query-options.ts | 13 ----- .../src/entities/token/model/query-options.ts | 2 +- apps/lend/src/layout/Header.tsx | 4 +- apps/lend/src/store/createMarketListSlice.ts | 2 +- .../src/shared/lib/queries/combine.ts | 37 +++++++++---- .../curve-lib/src/shared/lib/queries/types.ts | 2 + 11 files changed, 89 insertions(+), 112 deletions(-) delete mode 100644 apps/lend/src/entities/chain/api/query.ts create mode 100644 apps/lend/src/entities/chain/lib/chain-data-hooks.ts delete mode 100644 apps/lend/src/entities/chain/lib/hooks.ts delete mode 100644 apps/lend/src/entities/chain/lib/query-hooks.ts delete mode 100644 apps/lend/src/entities/chain/model/query-options.ts diff --git a/apps/lend/src/entities/chain/api/query.ts b/apps/lend/src/entities/chain/api/query.ts deleted file mode 100644 index df4de2ea0..000000000 --- a/apps/lend/src/entities/chain/api/query.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { QueryFunction } from '@tanstack/react-query' -import { ChainQueryKeyType } from '@/entities/chain' -import { assertChainValidity } from '@/entities/chain/lib/validation' -import { logQuery } from '@/shared/lib/logging' -import { Contract } from 'ethers' -import { CRVUSD_ADDRESS } from 'loan/src/constants' -import useStore from '@/store/useStore' -import { BD } from '@/shared/curve-lib' - - -const TOTAL_SUPPLY_INTERFACE = ["function totalSupply() view returns (uint256)"]; -const SCALE = BD.from(10).pow(18) - -export const queryTotalCrvUsd: QueryFunction< - string, - ChainQueryKeyType<'root'> -> = async ({ queryKey }) => { - logQuery(queryKey) - const [, chainId] = queryKey - assertChainValidity({ chainId }) - - const { provider } = useStore.getState().wallet - const contract = new Contract(CRVUSD_ADDRESS, TOTAL_SUPPLY_INTERFACE, provider) - const supply = await contract.totalSupply() - return BD.from(supply).div(SCALE).toString() -} diff --git a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts b/apps/lend/src/entities/chain/lib/chain-data-hooks.ts new file mode 100644 index 000000000..b2b4ea29b --- /dev/null +++ b/apps/lend/src/entities/chain/lib/chain-data-hooks.ts @@ -0,0 +1,55 @@ +import useStore from '@/store/useStore' +import { useMemo } from 'react' +import { useTokenUsdRates } from '@/entities/token' +import { PartialQueryResult } from '@/shared/lib/queries' + +export const useChainId = () => { + const api = useStore(state => state.api) + return api?.chainId +} + +const getTokenAddresses = (oneWayMarkets?: OWMDatasMapper) => Object.values(oneWayMarkets ?? {}).flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]).map(t => t.address) + +export const useTvl = (chainId: ChainId): PartialQueryResult => { + const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[chainId]) + const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[chainId]) + const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[chainId]) + const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[chainId]) + const tokenAddresses = useMemo(() => getTokenAddresses(owmDatasMapper), [owmDatasMapper]); + const { data: tokenUsdRates, isError: isUsdRatesError } = useTokenUsdRates({ chainId, tokenAddresses: tokenAddresses }) + + return useMemo(() => { + if (!owmDatasMapper || !marketsCollateralMapper || !marketsTotalSupplyMapper || !marketsTotalDebtMapper || !Object.keys(tokenUsdRates).length) { + return { + isError: isUsdRatesError, + isLoading: true, + isPending: true, + isFetching: true, + data: undefined + } + } + let totalCollateral = 0 + let totalLiquidity = 0 + let totalDebt = 0 + + Object.values(owmDatasMapper).map(({ owm }) => { + const { id, collateral_token } = owm + + const ammBalance = marketsCollateralMapper[id] ?? {} + const collateralUsdRate = tokenUsdRates[collateral_token.address] ?? 0 + const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * collateralUsdRate + + totalCollateral += marketTotalCollateralUsd + totalDebt += +marketsTotalDebtMapper[id]?.totalDebt + totalLiquidity += +marketsTotalSupplyMapper[id]?.totalLiquidity + }) + + return { + data: totalCollateral +totalLiquidity - totalDebt, + isError: false, + isLoading: false, + isPending: false, + isFetching: false + } + }, [isUsdRatesError, owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, tokenUsdRates]) +} diff --git a/apps/lend/src/entities/chain/lib/hooks.ts b/apps/lend/src/entities/chain/lib/hooks.ts deleted file mode 100644 index 5d10f154d..000000000 --- a/apps/lend/src/entities/chain/lib/hooks.ts +++ /dev/null @@ -1,53 +0,0 @@ -import useStore from '@/store/useStore' -import { useMemo } from 'react' -import { FORMAT_OPTIONS, formatNumber } from '@/ui/utils' -import { CRVUSD_ADDRESS } from 'loan/src/constants' -import { BD } from '@/shared/curve-lib' -import { useCrvUsdTotalSupply } from '@/entities/chain' -import { useTokenUsdRate, useTokenUsdRates } from '@/entities/token' - -export const useChainId = () => { - const api = useStore(state => state.api) - return api?.chainId -} - -const getTokenAddresses = (oneWayMarkets?: OWMDatasMapper) => Object.values(oneWayMarkets ?? {}).flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]).map(t => t.address) - -export const useTvl = (chainId: ChainId) => { - const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[chainId]) - const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[chainId]) - const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[chainId]) - const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[chainId]) - const tokenAddresses = useMemo(() => getTokenAddresses(owmDatasMapper), [owmDatasMapper]); - const { data: usdRatesMapper } = useTokenUsdRates({ chainId, tokenAddresses: tokenAddresses }) - - return useMemo(() => { - if ( - owmDatasMapper && - marketsCollateralMapper && - marketsTotalSupplyMapper && - marketsTotalDebtMapper && - Object.keys(usdRatesMapper).length - ) { - let totalCollateral = 0 - let totalLiquidity = 0 - let totalDebt = 0 - - Object.values(owmDatasMapper).map(({ owm }) => { - const { id, collateral_token } = owm - - const ammBalance = marketsCollateralMapper[id] ?? {} - const collateralUsdRate = usdRatesMapper[collateral_token.address] ?? 0 - const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * collateralUsdRate - - totalCollateral += marketTotalCollateralUsd - totalDebt += +marketsTotalDebtMapper[id]?.totalDebt - totalLiquidity += +marketsTotalSupplyMapper[id]?.totalLiquidity - }) - - const tvl = totalCollateral + totalLiquidity - totalDebt - - return tvl > 0 ? formatNumber(tvl, { ...FORMAT_OPTIONS.USD, showDecimalIfSmallNumberOnly: true }) : '-' - } - }, [owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, usdRatesMapper]) -} diff --git a/apps/lend/src/entities/chain/lib/index.ts b/apps/lend/src/entities/chain/lib/index.ts index 96dc22595..4085c9e61 100644 --- a/apps/lend/src/entities/chain/lib/index.ts +++ b/apps/lend/src/entities/chain/lib/index.ts @@ -1,3 +1,2 @@ -export * from './query-hooks' export * from './validation' -export * from './hooks' +export * from './chain-data-hooks' diff --git a/apps/lend/src/entities/chain/lib/query-hooks.ts b/apps/lend/src/entities/chain/lib/query-hooks.ts deleted file mode 100644 index e190bcb64..000000000 --- a/apps/lend/src/entities/chain/lib/query-hooks.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createQueryHook } from '@/shared/lib/queries' -import { getTotalCrvUsdQueryOptions } from '@/entities/chain/model/query-options' - -export const useCrvUsdTotalSupply = createQueryHook(getTotalCrvUsdQueryOptions); diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts deleted file mode 100644 index 554f5e942..000000000 --- a/apps/lend/src/entities/chain/model/query-options.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { queryOptions } from '@tanstack/react-query' -import { chainKeys, ChainQueryParams } from '@/entities/chain' -import { queryTotalCrvUsd } from '@/entities/chain/api/query' -import { REFRESH_INTERVAL } from '@/constants' -import { checkChainValidity } from '@/entities/chain/lib/validation' - -export const getTotalCrvUsdQueryOptions = (params: ChainQueryParams) => - queryOptions({ - queryKey: chainKeys.root(params), - queryFn: queryTotalCrvUsd, - staleTime: REFRESH_INTERVAL['5m'], - enabled: checkChainValidity(params), - }) diff --git a/apps/lend/src/entities/token/model/query-options.ts b/apps/lend/src/entities/token/model/query-options.ts index fc77a8207..6a61edf0a 100644 --- a/apps/lend/src/entities/token/model/query-options.ts +++ b/apps/lend/src/entities/token/model/query-options.ts @@ -6,7 +6,7 @@ import { checkTokenValidity } from '@/entities/token/lib/validation' export const getTokenUsdRateQueryOptions = (params: TokenQueryParams) => queryOptions({ - queryKey: tokenKeys.root(params), + queryKey: tokenKeys.usdRate(params), queryFn: queryTokenUsdRate, staleTime: REFRESH_INTERVAL['5m'], enabled: checkTokenValidity(params), diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index fc00049ad..f537d9e01 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -52,7 +52,7 @@ const Header = () => { const setLayoutHeight = useStore((state) => state.layout.setLayoutHeight) const setAppCache = useStore((state) => state.setAppCache) const updateConnectState = useStore((state) => state.updateConnectState) - const tvl = useTvl(rChainId); + const { data: tvl } = useTvl(rChainId); const { params: routerParams, location } = routerProps ?? {} const routerPathname = location?.pathname ?? '' @@ -163,7 +163,7 @@ const Header = () => { diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index bb091c06c..b219bdbd9 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -96,7 +96,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const usdRate = getLastTokenUsdRate(chainId, owm.borrowed_token.address) if (typeof usdRate === 'undefined') return true if (marketListShowOnlyInSmallMarkets[owm.id]) return false - return +cap * +usdRate > smallMarketAmount + return +cap * usdRate > smallMarketAmount }) }, filterBySearchText: (searchText, owmDatas) => { diff --git a/packages/curve-lib/src/shared/lib/queries/combine.ts b/packages/curve-lib/src/shared/lib/queries/combine.ts index 46785e76e..16e7f7b07 100644 --- a/packages/curve-lib/src/shared/lib/queries/combine.ts +++ b/packages/curve-lib/src/shared/lib/queries/combine.ts @@ -1,13 +1,14 @@ -import { useQueries } from '@tanstack/react-query' +import { useQueries, UseQueryResult } from '@tanstack/react-query' import { CombinedQueriesResult, + CombinedQueryMappingResult, ExtractDataType, - PartialQueryResult, QueryOptionsArray, QueryResultsArray } from './types' -import { useMemo } from 'react' +import { useCallback } from 'react' +/** Combines the metadata of multiple queries into a single object. */ const combineQueriesMeta = (results: QueryResultsArray): Omit, 'data'> => ({ isLoading: results.some((result) => result.isLoading), isPending: results.some((result) => result.isPending), @@ -15,20 +16,36 @@ const combineQueriesMeta = (results: QueryResultsAr isFetching: results.some((result) => result.isFetching), }) +/** Combines the data and metadata of multiple queries into a single object. */ const combineQueriesToList = (results: QueryResultsArray): CombinedQueriesResult => ({ data: results.map((result) => result.data), ...combineQueriesMeta(results), }) +/** Combines the data and metadata of multiple queries into a single object. */ +const combineQueriesToObject = (results: QueryResultsArray, keys: K): CombinedQueryMappingResult => ({ + data: Object.fromEntries((results || []).map((result, index) => [keys[index], result])) as Record>, + ...combineQueriesMeta(results), +}) + +/** + * Combines multiple queries into a single list. + * @param queryOptions The query options to combine + * @returns The combined queries in a list + */ export const useCombinedQueries = (queryOptions: [...T]): CombinedQueriesResult => useQueries({ queries: queryOptions, combine: combineQueriesToList, }) -export const useQueryMapping = (queryOptions: [...T], keys: K[]) => { - const { data, ...meta } = useCombinedQueries(queryOptions) - return useMemo(() => ({ - ...meta, - data: Object.fromEntries((data || []).map((result, index) => [keys[index], result])) as Record> - }), [data, meta, keys]) -} +/** + * Combines multiple queries into a single object with keys for each query + * @param queryOptions The query options to combine + * @param keys The keys to use for each query + * @returns The combined queries in an object + */ +export const useQueryMapping = (queryOptions: [...T], keys: [...K]): CombinedQueryMappingResult => + useQueries({ + queries: queryOptions, + combine: useCallback((results: UseQueryResult[]) => combineQueriesToObject(results, keys), [keys]) + }) diff --git a/packages/curve-lib/src/shared/lib/queries/types.ts b/packages/curve-lib/src/shared/lib/queries/types.ts index 24817abf7..d7a26e559 100644 --- a/packages/curve-lib/src/shared/lib/queries/types.ts +++ b/packages/curve-lib/src/shared/lib/queries/types.ts @@ -13,3 +13,5 @@ export type QueryResultsArray = { export type PartialQueryResult = Pick, 'data' | 'isLoading' | 'isPending' | 'isError' | 'isFetching'> export type CombinedQueriesResult = PartialQueryResult>; + +export type CombinedQueryMappingResult = PartialQueryResult[number]>>; From 122090f66d9ced64eddd3c878aacd2e4d370bfb0 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 4 Oct 2024 15:56:04 +0200 Subject: [PATCH 015/137] fix: build errors --- apps/lend/src/components/DetailInfoLTV.tsx | 4 ++-- apps/lend/src/entities/chain/lib/chain-data-hooks.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/lend/src/components/DetailInfoLTV.tsx b/apps/lend/src/components/DetailInfoLTV.tsx index c112652ba..d0ff0408c 100644 --- a/apps/lend/src/components/DetailInfoLTV.tsx +++ b/apps/lend/src/components/DetailInfoLTV.tsx @@ -26,8 +26,8 @@ const DetailInfoLTV = ({ const debtUsd = useMemo(() => debt && debtUsdRate && +debt.amount * +debtUsdRate, [debt, debtUsdRate]) const collateralUsd = useMemo(() => { - if (!collaterals?.every(c => c.address in collateralUsdRates)) return undefined - return collaterals.reduce((prev, { amount, address }) => prev + (+amount * +collateralUsdRates[address]), 0) + if (!collaterals?.every(c => collateralUsdRates?.[c.address] != null)) return undefined + return collaterals.reduce((prev, { amount, address }) => prev + (+amount * +collateralUsdRates![address]), 0) }, [collaterals, collateralUsdRates]) return ( diff --git a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts b/apps/lend/src/entities/chain/lib/chain-data-hooks.ts index b2b4ea29b..c5a2564fb 100644 --- a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts +++ b/apps/lend/src/entities/chain/lib/chain-data-hooks.ts @@ -19,7 +19,7 @@ export const useTvl = (chainId: ChainId): PartialQueryResult => { const { data: tokenUsdRates, isError: isUsdRatesError } = useTokenUsdRates({ chainId, tokenAddresses: tokenAddresses }) return useMemo(() => { - if (!owmDatasMapper || !marketsCollateralMapper || !marketsTotalSupplyMapper || !marketsTotalDebtMapper || !Object.keys(tokenUsdRates).length) { + if (!owmDatasMapper || !marketsCollateralMapper || !marketsTotalSupplyMapper || !marketsTotalDebtMapper || !tokenUsdRates) { return { isError: isUsdRatesError, isLoading: true, From 2c0feffe4625f0cc108058e7b6043e084502ba53 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 4 Oct 2024 16:01:22 +0200 Subject: [PATCH 016/137] fix: unused import --- apps/lend/src/store/createMarketListSlice.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index b219bdbd9..6a013b656 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -19,9 +19,6 @@ import { getTotalApr } from '@/utils/utilsRewards' import { helpers } from '@/lib/apiLending' import { sleep } from '@/utils/helpers' import networks from '@/networks' -import { tokenKeys } from '@/entities/token' - -import { queryClient } from '@/shared/api/query-client' import { getLastTokenUsdRate } from '@/entities/token/lib/last-results' type StateKey = keyof typeof DEFAULT_STATE From c12cf1db680e771e6f0b6819c2e40b4a4870964a Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 4 Oct 2024 16:17:51 +0200 Subject: [PATCH 017/137] fix: lock file --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index cd5141a2d..3d2182139 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11494,6 +11494,7 @@ __metadata: dependencies: eslint-config-custom: "npm:*" ethers: "npm:^6.11.0" + react: "npm:^18.2.0" tsconfig: "npm:*" languageName: unknown linkType: soft From 82f0cb16adfbf662e633c776cbdfa0718a1eee63 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 4 Oct 2024 16:43:55 +0200 Subject: [PATCH 018/137] refactor: start replacing marketsSlice (WIP) --- .../src/components/DetailInfoEstimateGas.tsx | 4 +- .../src/components/PageMarketList/utils.ts | 9 +- apps/lend/src/constants.ts | 1 + .../src/entities/chain/api/markets-api.ts | 18 ++++ .../{chain-data-hooks.ts => data-hooks.ts} | 27 ++++-- apps/lend/src/entities/chain/lib/index.ts | 3 +- .../src/entities/chain/lib/query-hooks.ts | 4 + apps/lend/src/entities/chain/model/index.ts | 1 + .../src/entities/chain/model/query-keys.ts | 1 + .../src/entities/chain/model/query-options.ts | 12 +++ .../src/entities/token/lib/query-hooks.ts | 1 + apps/lend/src/store/createAppSlice.ts | 2 - apps/lend/src/store/createCacheSlice.ts | 6 -- apps/lend/src/store/createMarketListSlice.ts | 2 +- apps/lend/src/store/createMarketsSlice.ts | 83 +------------------ 15 files changed, 72 insertions(+), 102 deletions(-) create mode 100644 apps/lend/src/entities/chain/api/markets-api.ts rename apps/lend/src/entities/chain/lib/{chain-data-hooks.ts => data-hooks.ts} (68%) create mode 100644 apps/lend/src/entities/chain/lib/query-hooks.ts create mode 100644 apps/lend/src/entities/chain/model/query-options.ts diff --git a/apps/lend/src/components/DetailInfoEstimateGas.tsx b/apps/lend/src/components/DetailInfoEstimateGas.tsx index e38fb53f3..eba609f65 100644 --- a/apps/lend/src/components/DetailInfoEstimateGas.tsx +++ b/apps/lend/src/components/DetailInfoEstimateGas.tsx @@ -11,7 +11,7 @@ import useStore from '@/store/useStore' import DetailInfo from '@/ui/DetailInfo' import IconTooltip from '@/ui/Tooltip/TooltipIcon' import { useTokenUsdRate } from '@/entities/token' -import { CRVUSD_ADDRESS } from 'loan/src/constants' +import { NETWORK_TOKEN } from '@/constants' export type StepProgress = { active: number @@ -28,7 +28,7 @@ interface Props { } const DetailInfoEstimateGas = ({ chainId, isDivider, loading, estimatedGas, stepProgress }: Props) => { - const { data: chainTokenUsdRate } = useTokenUsdRate({ chainId, tokenAddress: CRVUSD_ADDRESS }) + const { data: chainTokenUsdRate } = useTokenUsdRate({ chainId, tokenAddress: NETWORK_TOKEN }) const gasPricesDefault = chainId && networks[chainId].gasPricesDefault // TODO: allow gas prices priority adjustment const basePlusPriorities = useStore((state) => state.gas.gasInfo?.basePlusPriority) diff --git a/apps/lend/src/components/PageMarketList/utils.ts b/apps/lend/src/components/PageMarketList/utils.ts index 6a4a12bc3..f46f8fb37 100644 --- a/apps/lend/src/components/PageMarketList/utils.ts +++ b/apps/lend/src/components/PageMarketList/utils.ts @@ -55,7 +55,7 @@ export function _searchByTokensAddresses(parsedSearchText: string, searchText: s }) } -export function _getMarketList(owmDatas: OWMData[], crvusdAddress: string) { +export function _getMarketList(owmDatas: OWMData[]) { let marketListMapper: MarketListMapper = {} let marketListMapperCache: { [tokenAddress: string]: { symbol: string; address: string } } = {} @@ -75,8 +75,11 @@ export function _getMarketList(owmDatas: OWMData[], crvusdAddress: string) { }) // filter crvusd - delete marketListMapper[crvusdAddress] - delete marketListMapperCache[crvusdAddress] + const crvUsdAddress = owmDatas.map(({ owm }) => owm.borrowed_token).find(({ symbol }) => symbol.toLowerCase() === 'crvusd')?.address + if (crvUsdAddress) { + delete marketListMapper[crvUsdAddress] + delete marketListMapperCache[crvUsdAddress] + } const sortedMarketListMapperCache = sortBy(marketListMapperCache, (l) => l.symbol) return { marketListMapper, sortedMarketListMapperCache } diff --git a/apps/lend/src/constants.ts b/apps/lend/src/constants.ts index da2a31206..024df1b76 100644 --- a/apps/lend/src/constants.ts +++ b/apps/lend/src/constants.ts @@ -1,4 +1,5 @@ export const INVALID_ADDRESS = '0x0000000000000000000000000000000000000000' +export const NETWORK_TOKEN = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' export const LARGE_APY = 5000000 export const MAIN_ROUTE = { diff --git a/apps/lend/src/entities/chain/api/markets-api.ts b/apps/lend/src/entities/chain/api/markets-api.ts new file mode 100644 index 000000000..6f4193188 --- /dev/null +++ b/apps/lend/src/entities/chain/api/markets-api.ts @@ -0,0 +1,18 @@ +import { QueryFunction } from '@tanstack/react-query' +import { logQuery } from '@/shared/lib/logging' +import { assertChainValidity, ChainQueryKeyType } from '@/entities/chain' +import useStore from '@/store/useStore' + + +export const queryOneWayMarketNames: QueryFunction< + string[], + ChainQueryKeyType<'markets'> +> = async ({ queryKey }) => { + logQuery(queryKey) + const [, chainId, , ] = queryKey + assertChainValidity({ chainId }) + + const {api} = useStore.getState() + await api!.oneWayfactory.fetchMarkets() + return api!.oneWayfactory.getMarketList() +} diff --git a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts b/apps/lend/src/entities/chain/lib/data-hooks.ts similarity index 68% rename from apps/lend/src/entities/chain/lib/chain-data-hooks.ts rename to apps/lend/src/entities/chain/lib/data-hooks.ts index c5a2564fb..a5af8e817 100644 --- a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts +++ b/apps/lend/src/entities/chain/lib/data-hooks.ts @@ -2,13 +2,17 @@ import useStore from '@/store/useStore' import { useMemo } from 'react' import { useTokenUsdRates } from '@/entities/token' import { PartialQueryResult } from '@/shared/lib/queries' +import { useOneWayMarketNames } from '@/entities/chain' +import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' +import networks from '@/networks' -export const useChainId = () => { - const api = useStore(state => state.api) - return api?.chainId -} +export const useApi = (): Api | null => useStore(state => state.api) +export const useChainId = () => useApi()?.chainId -const getTokenAddresses = (oneWayMarkets?: OWMDatasMapper) => Object.values(oneWayMarkets ?? {}).flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]).map(t => t.address) +const getTokenAddresses = (oneWayMarkets?: OWMDatasMapper) => + Object.values(oneWayMarkets ?? {}) + .flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]) + .map(t => t.address) export const useTvl = (chainId: ChainId): PartialQueryResult => { const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[chainId]) @@ -53,3 +57,16 @@ export const useTvl = (chainId: ChainId): PartialQueryResult => { } }, [isUsdRatesError, owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, tokenUsdRates]) } + +export const useMarketMapping = (chainId: ChainId) => { + const { data: marketNames = null, ...rest } = useOneWayMarketNames({ chainId }) + const api = useApi(); + const data: Record | null = useMemo(() => + marketNames && api && Object.fromEntries( + marketNames + .filter(name => !networks[chainId].hideMarketsInUI[name]) + .map(name => [name, api.getOneWayMarket(name)]) + ), [api, chainId, marketNames] + ) + return { data, ...rest } +} diff --git a/apps/lend/src/entities/chain/lib/index.ts b/apps/lend/src/entities/chain/lib/index.ts index 4085c9e61..29033981e 100644 --- a/apps/lend/src/entities/chain/lib/index.ts +++ b/apps/lend/src/entities/chain/lib/index.ts @@ -1,2 +1,3 @@ export * from './validation' -export * from './chain-data-hooks' +export * from './data-hooks' +export * from './query-hooks' diff --git a/apps/lend/src/entities/chain/lib/query-hooks.ts b/apps/lend/src/entities/chain/lib/query-hooks.ts new file mode 100644 index 000000000..890f88051 --- /dev/null +++ b/apps/lend/src/entities/chain/lib/query-hooks.ts @@ -0,0 +1,4 @@ +import { createQueryHook } from '@/shared/lib/queries' +import { getOneWayMarketNames } from '@/entities/chain' + +export const useOneWayMarketNames = createQueryHook(getOneWayMarketNames); diff --git a/apps/lend/src/entities/chain/model/index.ts b/apps/lend/src/entities/chain/model/index.ts index 0c515b32e..6668b7943 100644 --- a/apps/lend/src/entities/chain/model/index.ts +++ b/apps/lend/src/entities/chain/model/index.ts @@ -1,2 +1,3 @@ export * from './query-keys' +export * from './query-options' export * from './validation' diff --git a/apps/lend/src/entities/chain/model/query-keys.ts b/apps/lend/src/entities/chain/model/query-keys.ts index 45500cf06..9ffda732d 100644 --- a/apps/lend/src/entities/chain/model/query-keys.ts +++ b/apps/lend/src/entities/chain/model/query-keys.ts @@ -3,6 +3,7 @@ import type { ExtractQueryKeyType } from '@/shared/types/api' export const chainKeys = { root: ({ chainId }: ChainQueryParams) => ['chain', chainId] as const, + markets: ({ chainId }: ChainQueryParams) => ['chain', chainId, 'markets'] as const, } as const export type ChainQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts new file mode 100644 index 000000000..79b351e31 --- /dev/null +++ b/apps/lend/src/entities/chain/model/query-options.ts @@ -0,0 +1,12 @@ +import { queryOptions } from '@tanstack/react-query' +import { REFRESH_INTERVAL } from '@/constants' +import { chainKeys, ChainQueryParams, checkChainValidity } from '@/entities/chain' +import { queryOneWayMarketNames } from '@/entities/chain/api/markets-api' + +export const getOneWayMarketNames = (params: ChainQueryParams) => + queryOptions({ + queryKey: chainKeys.markets(params), + queryFn: queryOneWayMarketNames, + staleTime: REFRESH_INTERVAL['5m'], + enabled: checkChainValidity(params), + }) diff --git a/apps/lend/src/entities/token/lib/query-hooks.ts b/apps/lend/src/entities/token/lib/query-hooks.ts index 9eef6c766..7a198266c 100644 --- a/apps/lend/src/entities/token/lib/query-hooks.ts +++ b/apps/lend/src/entities/token/lib/query-hooks.ts @@ -3,6 +3,7 @@ import { getTokenUsdRateQueryOptions } from '@/entities/token/model/query-option import { ChainQueryParams } from '@/entities/chain' export const useTokenUsdRate = createQueryHook(getTokenUsdRateQueryOptions); + export const useTokenUsdRates = ({ chainId, tokenAddresses = [] }: ChainQueryParams & { tokenAddresses?: string[] }) => useQueryMapping( tokenAddresses.map((tokenAddress) => getTokenUsdRateQueryOptions({ chainId, tokenAddress })), diff --git a/apps/lend/src/store/createAppSlice.ts b/apps/lend/src/store/createAppSlice.ts index 7c13d6785..33d5e0268 100644 --- a/apps/lend/src/store/createAppSlice.ts +++ b/apps/lend/src/store/createAppSlice.ts @@ -108,8 +108,6 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => // update network settings from api state.updateGlobalStoreByKey('api', api) state.updateGlobalStoreByKey('isLoadingCurve', false) - - await state.markets.fetchMarkets(api) state.updateGlobalStoreByKey('isLoadingApi', false) if (!prevApi || isNetworkSwitched) { diff --git a/apps/lend/src/store/createCacheSlice.ts b/apps/lend/src/store/createCacheSlice.ts index b86a271c1..96b4a81ba 100644 --- a/apps/lend/src/store/createCacheSlice.ts +++ b/apps/lend/src/store/createCacheSlice.ts @@ -9,9 +9,6 @@ import cloneDeep from 'lodash/cloneDeep' type StateKey = keyof typeof DEFAULT_STATE type SliceState = { - owmDatasMapper: { [chainId: string]: OWMDatasCacheMapper } - marketListMapper: { [chainId: string]: MarketListMapper } - marketListResult: { [chainId: string]: MarketListItem[] } campaignRewardsMapper: { [chainId: string]: CampaignRewardsMapper } } @@ -27,9 +24,6 @@ export type CacheSlice = { } const DEFAULT_STATE: SliceState = { - owmDatasMapper: {}, - marketListMapper: {}, - marketListResult: {}, campaignRewardsMapper: {}, } diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index 6a013b656..6a712bce0 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -195,7 +195,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const owmDatasMapper = markets.owmDatasMapper[chainId] const parsedTableRowsSettings: { [tokenAddress: string]: TableSettings } = {} - const { marketListMapper } = _getMarketList(owmDatas, markets.crvusdAddress[chainId]) + const { marketListMapper } = _getMarketList(owmDatas) const marketsResult = sortByFn(Object.values(marketListMapper), (m) => m.symbol.toLowerCase()).map((m, idx) => { // set table settings for each market diff --git a/apps/lend/src/store/createMarketsSlice.ts b/apps/lend/src/store/createMarketsSlice.ts index c2e5b2892..eff968e74 100644 --- a/apps/lend/src/store/createMarketsSlice.ts +++ b/apps/lend/src/store/createMarketsSlice.ts @@ -1,19 +1,11 @@ import type { GetState, SetState } from 'zustand' import type { State } from '@/store/useStore' - -import pick from 'lodash/pick' - -import { _getMarketList } from '@/components/PageMarketList/utils' import { getErrorMessage } from '@/utils/helpers' -import apiLending, { helpers } from '@/lib/apiLending' -import networks from '@/networks' +import apiLending from '@/lib/apiLending' type StateKey = keyof typeof DEFAULT_STATE type SliceState = { - crvusdAddress: { [chainId: string]: string } - owmDatas: { [chainId: string]: OWMData[] } - owmDatasMapper: { [chainId: string]: OWMDatasMapper } statsParametersMapper: { [chainId: string]: MarketsStatsParametersMapper } statsBandsMapper: { [chainId: string]: MarketsStatsBandsMapper } statsTotalsMapper: { [chainId: string]: MarketsStatsTotalsMapper } @@ -36,7 +28,6 @@ const sliceKey = 'markets' export type MarketsSlice = { [sliceKey]: SliceState & { // grouped - fetchMarkets(api: Api): Promise<{ owmDatasMapper: OWMDatasMapper; owmDatas: OWMData[] }> fetchDatas(key: string, api: Api, owmDatas: OWMData[], shouldRefetch?: boolean): Promise // individual @@ -52,9 +43,6 @@ export type MarketsSlice = { } const DEFAULT_STATE: SliceState = { - crvusdAddress: {}, - owmDatas: {}, - owmDatasMapper: {}, statsParametersMapper: {}, statsBandsMapper: {}, statsTotalsMapper: {}, @@ -74,56 +62,6 @@ const DEFAULT_STATE: SliceState = { const createMarketsSlice = (set: SetState, get: GetState): MarketsSlice => ({ [sliceKey]: { ...DEFAULT_STATE, - - fetchMarkets: async (api) => { - const { marketList, storeCache } = get() - const { ...sliceState } = get()[sliceKey] - - const { chainId } = api - sliceState.setStateByKey('error', '') - const { marketList: marketListNames, error } = await helpers.fetchMarkets(api) - - const chainIdStr = chainId.toString() - let owmDatas: OWMData[] = [] - let owmDatasMapper: OWMDatasMapper = {} - let owmDatasCacheMapper: OWMDatasCacheMapper = {} - let crvusdAddress = '' - - if (error) { - sliceState.setStateByKey('error', error) - sliceState.setStateByActiveKey('owmDatas', chainIdStr, owmDatas) - sliceState.setStateByActiveKey('owmDatasMapper', chainIdStr, owmDatasMapper) - } else { - marketListNames.forEach((owmId) => { - if (networks[chainId].hideMarketsInUI[owmId]) return - - const owm = api.getOneWayMarket(owmId) - const { owmData, owmDataCache } = getOWMData(owm) - const { address: cAddress } = owm.collateral_token - const { symbol: bSymbol, address: bAddress } = owm.borrowed_token - - owmDatas.push(owmData) - owmDatasMapper[owm.id] = owmData - owmDatasCacheMapper[owm.id] = owmDataCache - - if (bSymbol.toLowerCase() === 'crvusd') crvusdAddress = bAddress - }) - - sliceState.setStateByActiveKey('crvusdAddress', chainIdStr, crvusdAddress) - sliceState.setStateByActiveKey('owmDatas', chainIdStr, owmDatas) - sliceState.setStateByActiveKey('owmDatasMapper', chainIdStr, owmDatasMapper) - - // update market list - const { marketListMapper } = _getMarketList(owmDatas, crvusdAddress) - marketList.setStateByKey('marketListMapper', { [chainId]: marketListMapper }) - - // add to cache - storeCache.setStateByActiveKey('owmDatasMapper', chainIdStr, owmDatasCacheMapper) - storeCache.setStateByActiveKey('marketListMapper', chainIdStr, marketListMapper) - } - - return { owmDatas, owmDatasMapper } - }, fetchDatas: async (key, api, owmDatas, shouldRefetch) => { const { ...sliceState } = get()[sliceKey] @@ -235,23 +173,4 @@ const createMarketsSlice = (set: SetState, get: GetState): Markets }, }) -function getOWMData(owm: OWM) { - const owmData: OWMData = { - owm, - hasLeverage: owm.leverage.hasLeverage(), - displayName: owm.name, - } - - const owmDataCache = pick(owmData, [ - 'owm.id', - 'owm.addresses', - 'owm.borrowed_token', - 'owm.collateral_token', - 'displayName', - 'hasLeverage', - ]) as OWMDataCache - - return { owmData, owmDataCache } -} - export default createMarketsSlice From b8f2407f55f3b06aabbd4e7714106b8befc9cb39 Mon Sep 17 00:00:00 2001 From: Ignat Date: Sat, 5 Oct 2024 16:55:30 +0500 Subject: [PATCH 019/137] feat: implement `Button` story --- .../ui/Button/stories/Button.stories.ts | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts diff --git a/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts b/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts new file mode 100644 index 000000000..594c768e8 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts @@ -0,0 +1,105 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { fn } from '@storybook/test' +import { Button } from '../Button' + +const meta: Meta = { + title: 'UI Kit/Primitives/Button', + component: Button, + argTypes: { + variant: { + control: 'select', + options: ['contained', 'outlined', 'ghost', undefined], + description: 'The variant of the component', + }, + color: { + control: 'select', + options: ['primary', 'secondary', 'success', 'alert', 'navigation', undefined], + description: 'The color of the component', + }, + label: { + control: 'text', + description: 'The label of the component', + }, + size: { + control: 'select', + options: ['small', 'medium', 'large'], + description: 'The size of the component', + }, + disabled: { + control: 'boolean', + description: 'The disabled state of the component', + }, + }, + args: { + size: 'medium', + disabled: false, + onClick: fn(), + }, +} + +type Story = StoryObj + +export const Primary: Story = { + parameters: { + docs: { + description: { + component: 'Primary button component', + story: 'Primary button with label', + }, + }, + }, + args: { + variant: 'contained', + color: 'primary', + label: 'Primary', + }, +} +export const Secondary: Story = { + args: { + variant: 'contained', + color: 'secondary', + label: 'Secondary', + }, +} + +export const Outlined: Story = { + args: { + variant: 'outlined', + color: undefined, + label: 'Outlined', + }, +} + +export const Ghost: Story = { + args: { + variant: 'ghost', + color: undefined, + label: 'Ghost', + }, +} + +export const Success: Story = { + args: { + variant: 'contained', + color: 'success', + label: 'Success', + }, +} + +export const Alert: Story = { + args: { + variant: 'contained', + color: 'alert', + label: 'Alert', + }, +} + +export const Navigation: Story = { + args: { + variant: 'contained', + color: 'navigation', + label: 'Navigation', + }, +} + +export default meta From e9f5cdc2e913be6d0951e8a37d966ad2cc8ed396 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 7 Oct 2024 11:05:31 +0200 Subject: [PATCH 020/137] fix: review comments and formatting --- apps/lend/src/components/DetailInfoLTV.tsx | 2 +- apps/lend/src/components/InpChipUsdRate.tsx | 3 +- apps/lend/src/entities/chain/index.ts | 1 - .../entities/chain/lib/chain-data-hooks.ts | 55 ------------------- .../lend/src/entities/chain/lib/chain-info.ts | 8 +++ apps/lend/src/entities/chain/lib/chain-tvl.ts | 47 ++++++++++++++++ apps/lend/src/entities/chain/lib/index.ts | 3 +- .../lend/src/entities/chain/lib/validation.ts | 5 +- apps/lend/src/entities/chain/model/index.ts | 1 + apps/lend/src/entities/chain/model/tvl.ts | 25 +++++++++ .../src/entities/chain/model/validation.ts | 2 +- apps/lend/src/entities/token/api/query.ts | 17 ------ .../src/entities/token/api/token-rates.ts | 12 ++++ apps/lend/src/entities/token/index.ts | 1 - apps/lend/src/entities/token/lib/index.ts | 3 +- .../src/entities/token/lib/last-results.ts | 13 +++-- .../src/entities/token/lib/query-hooks.ts | 6 +- .../lend/src/entities/token/lib/validation.ts | 9 ++- apps/lend/src/entities/token/model/index.ts | 1 + .../src/entities/token/model/query-keys.ts | 3 - .../src/entities/token/model/query-options.ts | 5 +- .../src/entities/token/model/validation.ts | 8 ++- apps/lend/src/entities/token/types.ts | 4 ++ packages/curve-lib/src/shared/api/cache.ts | 7 +-- packages/curve-lib/src/shared/lib/logging.ts | 4 +- .../src/shared/lib/queries/combine.ts | 36 ++++++++---- .../src/shared/lib/queries/factory.ts | 2 +- .../curve-lib/src/shared/lib/queries/types.ts | 14 ++++- .../src/shared/lib/validation/lib.ts | 8 +-- packages/curve-lib/src/shared/types/nested.ts | 7 ++- 30 files changed, 187 insertions(+), 125 deletions(-) delete mode 100644 apps/lend/src/entities/chain/lib/chain-data-hooks.ts create mode 100644 apps/lend/src/entities/chain/lib/chain-info.ts create mode 100644 apps/lend/src/entities/chain/lib/chain-tvl.ts create mode 100644 apps/lend/src/entities/chain/model/tvl.ts delete mode 100644 apps/lend/src/entities/token/api/query.ts create mode 100644 apps/lend/src/entities/token/api/token-rates.ts diff --git a/apps/lend/src/components/DetailInfoLTV.tsx b/apps/lend/src/components/DetailInfoLTV.tsx index d0ff0408c..b65c8d2d2 100644 --- a/apps/lend/src/components/DetailInfoLTV.tsx +++ b/apps/lend/src/components/DetailInfoLTV.tsx @@ -18,7 +18,7 @@ const DetailInfoLTV = ({ debt: Amount | undefined collaterals: Amount[] | undefined }) => { - const chainId = useChainId() + const { data: chainId } = useChainId() const { data: debtUsdRate } = useTokenUsdRate({ chainId, tokenAddress: debt?.address }) const collateralAddresses = useMemo(() => collaterals?.map(c => c.address), [collaterals]) const { data: collateralUsdRates } = useTokenUsdRates({ chainId, tokenAddresses: collateralAddresses }) diff --git a/apps/lend/src/components/InpChipUsdRate.tsx b/apps/lend/src/components/InpChipUsdRate.tsx index ca5f3f411..6ba359ab3 100644 --- a/apps/lend/src/components/InpChipUsdRate.tsx +++ b/apps/lend/src/components/InpChipUsdRate.tsx @@ -8,7 +8,8 @@ const InpChipUsdRate = ({ address: tokenAddress, ...props }: Omit & { address: string | undefined }) => { - const { data: usdRate } = useTokenUsdRate({ chainId: useChainId(), tokenAddress }) + const { data: chainId } = useChainId() + const { data: usdRate } = useTokenUsdRate({ chainId, tokenAddress }) return } diff --git a/apps/lend/src/entities/chain/index.ts b/apps/lend/src/entities/chain/index.ts index 1ac09c6e8..64aadcacc 100644 --- a/apps/lend/src/entities/chain/index.ts +++ b/apps/lend/src/entities/chain/index.ts @@ -1,3 +1,2 @@ export * from './lib' -export * from './model' export * from './types' diff --git a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts b/apps/lend/src/entities/chain/lib/chain-data-hooks.ts deleted file mode 100644 index c5a2564fb..000000000 --- a/apps/lend/src/entities/chain/lib/chain-data-hooks.ts +++ /dev/null @@ -1,55 +0,0 @@ -import useStore from '@/store/useStore' -import { useMemo } from 'react' -import { useTokenUsdRates } from '@/entities/token' -import { PartialQueryResult } from '@/shared/lib/queries' - -export const useChainId = () => { - const api = useStore(state => state.api) - return api?.chainId -} - -const getTokenAddresses = (oneWayMarkets?: OWMDatasMapper) => Object.values(oneWayMarkets ?? {}).flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]).map(t => t.address) - -export const useTvl = (chainId: ChainId): PartialQueryResult => { - const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[chainId]) - const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[chainId]) - const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[chainId]) - const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[chainId]) - const tokenAddresses = useMemo(() => getTokenAddresses(owmDatasMapper), [owmDatasMapper]); - const { data: tokenUsdRates, isError: isUsdRatesError } = useTokenUsdRates({ chainId, tokenAddresses: tokenAddresses }) - - return useMemo(() => { - if (!owmDatasMapper || !marketsCollateralMapper || !marketsTotalSupplyMapper || !marketsTotalDebtMapper || !tokenUsdRates) { - return { - isError: isUsdRatesError, - isLoading: true, - isPending: true, - isFetching: true, - data: undefined - } - } - let totalCollateral = 0 - let totalLiquidity = 0 - let totalDebt = 0 - - Object.values(owmDatasMapper).map(({ owm }) => { - const { id, collateral_token } = owm - - const ammBalance = marketsCollateralMapper[id] ?? {} - const collateralUsdRate = tokenUsdRates[collateral_token.address] ?? 0 - const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * collateralUsdRate - - totalCollateral += marketTotalCollateralUsd - totalDebt += +marketsTotalDebtMapper[id]?.totalDebt - totalLiquidity += +marketsTotalSupplyMapper[id]?.totalLiquidity - }) - - return { - data: totalCollateral +totalLiquidity - totalDebt, - isError: false, - isLoading: false, - isPending: false, - isFetching: false - } - }, [isUsdRatesError, owmDatasMapper, marketsCollateralMapper, marketsTotalSupplyMapper, marketsTotalDebtMapper, tokenUsdRates]) -} diff --git a/apps/lend/src/entities/chain/lib/chain-info.ts b/apps/lend/src/entities/chain/lib/chain-info.ts new file mode 100644 index 000000000..37223284b --- /dev/null +++ b/apps/lend/src/entities/chain/lib/chain-info.ts @@ -0,0 +1,8 @@ +import useStore from '@/store/useStore' +import { useMemo } from 'react' +import { FETCHING, PartialQueryResult, READY } from '@/shared/lib/queries' + +export const useChainId = (): PartialQueryResult => { + const api = useStore((state) => state.api) + return useMemo(() => (api ? { ...READY, data: api.chainId } : FETCHING), [api]) +} diff --git a/apps/lend/src/entities/chain/lib/chain-tvl.ts b/apps/lend/src/entities/chain/lib/chain-tvl.ts new file mode 100644 index 000000000..1c3616582 --- /dev/null +++ b/apps/lend/src/entities/chain/lib/chain-tvl.ts @@ -0,0 +1,47 @@ +import { FETCHING, PartialQueryResult, READY } from '@/shared/lib/queries' +import useStore from '@/store/useStore' +import { useMemo } from 'react' +import { useTokenUsdRates } from '@/entities/token/lib' +import { calculateChainTvl } from '@/entities/chain/model' + +export const useTvl = (chainId: ChainId): PartialQueryResult => { + const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[chainId]) + const marketsCollateralMapper = useStore((state) => state.markets.statsAmmBalancesMapper[chainId]) + const marketsTotalSupplyMapper = useStore((state) => state.markets.totalLiquidityMapper[chainId]) + const marketsTotalDebtMapper = useStore((state) => state.markets.statsTotalsMapper[chainId]) + const tokenAddresses = useMemo( + () => + Object.values(owmDatasMapper ?? {}) + .flatMap(({ owm }) => [owm.borrowed_token, owm.collateral_token]) + .map((t) => t.address), + [owmDatasMapper], + ) + const { data: tokenUsdRates, isError: isUsdRatesError } = useTokenUsdRates({ chainId, tokenAddresses }) + + return useMemo(() => { + if ( + !owmDatasMapper || + !marketsCollateralMapper || + !marketsTotalSupplyMapper || + !marketsTotalDebtMapper || + !tokenUsdRates + ) { + return { ...FETCHING, isError: isUsdRatesError } + } + const data = calculateChainTvl( + owmDatasMapper, + marketsCollateralMapper, + tokenUsdRates, + marketsTotalDebtMapper, + marketsTotalSupplyMapper, + ) + return { ...READY, data } + }, [ + isUsdRatesError, + owmDatasMapper, + marketsCollateralMapper, + marketsTotalSupplyMapper, + marketsTotalDebtMapper, + tokenUsdRates, + ]) +} diff --git a/apps/lend/src/entities/chain/lib/index.ts b/apps/lend/src/entities/chain/lib/index.ts index 4085c9e61..f402d3d80 100644 --- a/apps/lend/src/entities/chain/lib/index.ts +++ b/apps/lend/src/entities/chain/lib/index.ts @@ -1,2 +1,3 @@ export * from './validation' -export * from './chain-data-hooks' +export * from './chain-info' +export * from './chain-tvl' diff --git a/apps/lend/src/entities/chain/lib/validation.ts b/apps/lend/src/entities/chain/lib/validation.ts index 45b4682c6..4dcd9f98a 100644 --- a/apps/lend/src/entities/chain/lib/validation.ts +++ b/apps/lend/src/entities/chain/lib/validation.ts @@ -1,5 +1,6 @@ -import { CombinedChainParams, chainValidationSuite } from '@/entities/chain' -import { assertValidity, checkValidity, ValidatedData } from '@/shared/lib/validation' +import { CombinedChainParams } from '@/entities/chain' +import { chainValidationSuite } from '@/entities/chain/model' +import { assertValidity, checkValidity } from '@/shared/lib/validation' export const assertChainValidity = (data: T, fields?: Extract[]) => assertValidity(chainValidationSuite, data, fields) diff --git a/apps/lend/src/entities/chain/model/index.ts b/apps/lend/src/entities/chain/model/index.ts index 0c515b32e..4c7a836aa 100644 --- a/apps/lend/src/entities/chain/model/index.ts +++ b/apps/lend/src/entities/chain/model/index.ts @@ -1,2 +1,3 @@ export * from './query-keys' export * from './validation' +export * from './tvl' diff --git a/apps/lend/src/entities/chain/model/tvl.ts b/apps/lend/src/entities/chain/model/tvl.ts new file mode 100644 index 000000000..2f76df5f2 --- /dev/null +++ b/apps/lend/src/entities/chain/model/tvl.ts @@ -0,0 +1,25 @@ +export function calculateChainTvl( + owmDatasMapper: OWMDatasMapper, + marketsCollateralMapper: MarketsStatsAMMBalancesMapper, + tokenUsdRates: Record, + marketsTotalDebtMapper: MarketsStatsTotalsMapper, + marketsTotalSupplyMapper: MarketsTotalLiquidityMapper, +) { + let totalCollateral = 0 + let totalLiquidity = 0 + let totalDebt = 0 + + Object.values(owmDatasMapper).forEach(({ owm }) => { + const { id, collateral_token } = owm + + const ammBalance = marketsCollateralMapper[id] ?? {} + const collateralUsdRate = tokenUsdRates[collateral_token.address] ?? 0 + const marketTotalCollateralUsd = +(ammBalance?.collateral ?? '0') * collateralUsdRate + + totalCollateral += marketTotalCollateralUsd + totalDebt += +marketsTotalDebtMapper[id]?.totalDebt + totalLiquidity += +marketsTotalSupplyMapper[id]?.totalLiquidity + }) + + return totalCollateral + totalLiquidity - totalDebt +} diff --git a/apps/lend/src/entities/chain/model/validation.ts b/apps/lend/src/entities/chain/model/validation.ts index 44d164508..20c396d65 100644 --- a/apps/lend/src/entities/chain/model/validation.ts +++ b/apps/lend/src/entities/chain/model/validation.ts @@ -6,7 +6,7 @@ import useStore from '@/store/useStore' export const chainValidationGroup = ({ chainId }: ChainQueryParams) => group('chainValidation', () => { test('chainId', () => { - enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId(); + enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId() enforce(useStore.getState().api?.chainId).message('Chain ID should be loaded').equals(chainId) }) }) diff --git a/apps/lend/src/entities/token/api/query.ts b/apps/lend/src/entities/token/api/query.ts deleted file mode 100644 index e7480dce9..000000000 --- a/apps/lend/src/entities/token/api/query.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { QueryFunction } from '@tanstack/react-query' -import { logQuery } from '@/shared/lib/logging' -import { assertTokenValidity } from '@/entities/token/lib/validation' -import { TokenQueryKeyType } from '@/entities/token' -import useStore from '@/store/useStore' - -export const queryTokenUsdRate: QueryFunction< - number, - TokenQueryKeyType<'usdRate'> -> = async ({ queryKey }) => { - logQuery(queryKey) - const [, chainId, , givenAddress] = queryKey - const { tokenAddress } = assertTokenValidity({ chainId, tokenAddress: givenAddress }) - - const {api} = useStore.getState() - return await api!.getUsdRate(tokenAddress) -} diff --git a/apps/lend/src/entities/token/api/token-rates.ts b/apps/lend/src/entities/token/api/token-rates.ts new file mode 100644 index 000000000..1036281c1 --- /dev/null +++ b/apps/lend/src/entities/token/api/token-rates.ts @@ -0,0 +1,12 @@ +import { QueryFunction } from '@tanstack/react-query' +import { logQuery } from '@/shared/lib/logging' +import { extractTokenParams } from '@/entities/token/lib/validation' +import useStore from '@/store/useStore' +import { TokenQueryKeyType } from '@/entities/token' + +export const queryTokenUsdRate: QueryFunction> = async ({ queryKey }) => { + logQuery(queryKey) + const { tokenAddress } = extractTokenParams(queryKey) + const { api } = useStore.getState() + return await api!.getUsdRate(tokenAddress) +} diff --git a/apps/lend/src/entities/token/index.ts b/apps/lend/src/entities/token/index.ts index 1ac09c6e8..64aadcacc 100644 --- a/apps/lend/src/entities/token/index.ts +++ b/apps/lend/src/entities/token/index.ts @@ -1,3 +1,2 @@ export * from './lib' -export * from './model' export * from './types' diff --git a/apps/lend/src/entities/token/lib/index.ts b/apps/lend/src/entities/token/lib/index.ts index 2668e5370..7e8199c1f 100644 --- a/apps/lend/src/entities/token/lib/index.ts +++ b/apps/lend/src/entities/token/lib/index.ts @@ -1,2 +1,3 @@ export * from './query-hooks' -export * from './validation' \ No newline at end of file +export * from './validation' +export * from './last-results' diff --git a/apps/lend/src/entities/token/lib/last-results.ts b/apps/lend/src/entities/token/lib/last-results.ts index 1afb3d6a5..527fdb851 100644 --- a/apps/lend/src/entities/token/lib/last-results.ts +++ b/apps/lend/src/entities/token/lib/last-results.ts @@ -1,7 +1,10 @@ import { queryClient } from '@/shared/api/query-client' -import { tokenKeys } from '@/entities/token' +import { tokenKeys } from '@/entities/token/model' -export const getLastTokenUsdRate = (chainId: ChainId, tokenAddress: string) => queryClient.getQueryData(tokenKeys.usdRate({ - chainId, - tokenAddress -})) +export const getLastTokenUsdRate = (chainId: ChainId, tokenAddress: string) => + queryClient.getQueryData( + tokenKeys.usdRate({ + chainId, + tokenAddress, + }), + ) diff --git a/apps/lend/src/entities/token/lib/query-hooks.ts b/apps/lend/src/entities/token/lib/query-hooks.ts index 9eef6c766..12be8badc 100644 --- a/apps/lend/src/entities/token/lib/query-hooks.ts +++ b/apps/lend/src/entities/token/lib/query-hooks.ts @@ -1,10 +1,10 @@ import { createQueryHook, useQueryMapping } from '@/shared/lib/queries' -import { getTokenUsdRateQueryOptions } from '@/entities/token/model/query-options' +import { getTokenUsdRateQueryOptions } from '@/entities/token/model' import { ChainQueryParams } from '@/entities/chain' -export const useTokenUsdRate = createQueryHook(getTokenUsdRateQueryOptions); +export const useTokenUsdRate = createQueryHook(getTokenUsdRateQueryOptions) export const useTokenUsdRates = ({ chainId, tokenAddresses = [] }: ChainQueryParams & { tokenAddresses?: string[] }) => useQueryMapping( tokenAddresses.map((tokenAddress) => getTokenUsdRateQueryOptions({ chainId, tokenAddress })), - tokenAddresses + tokenAddresses, ) diff --git a/apps/lend/src/entities/token/lib/validation.ts b/apps/lend/src/entities/token/lib/validation.ts index 4655b5868..e080faed4 100644 --- a/apps/lend/src/entities/token/lib/validation.ts +++ b/apps/lend/src/entities/token/lib/validation.ts @@ -1,8 +1,15 @@ -import { CombinedTokenParams, tokenValidationSuite } from '@/entities/token' +import { CombinedTokenParams, TokenQueryKeyType } from '@/entities/token' import { assertValidity, checkValidity } from '@/shared/lib/validation' +import { tokenValidationSuite } from '@/entities/token/model/validation' export const assertTokenValidity = (data: T, fields?: Extract[]) => assertValidity(tokenValidationSuite, data, fields) export const checkTokenValidity = (data: T, fields?: Extract[]) => checkValidity(tokenValidationSuite, data, fields) + +export const extractTokenParams = ([, chainId, , givenAddress]: TokenQueryKeyType<'usdRate'>) => + assertTokenValidity({ + chainId, + tokenAddress: givenAddress, + }) diff --git a/apps/lend/src/entities/token/model/index.ts b/apps/lend/src/entities/token/model/index.ts index 0c515b32e..6668b7943 100644 --- a/apps/lend/src/entities/token/model/index.ts +++ b/apps/lend/src/entities/token/model/index.ts @@ -1,2 +1,3 @@ export * from './query-keys' +export * from './query-options' export * from './validation' diff --git a/apps/lend/src/entities/token/model/query-keys.ts b/apps/lend/src/entities/token/model/query-keys.ts index cc84fb9ed..1d96a3522 100644 --- a/apps/lend/src/entities/token/model/query-keys.ts +++ b/apps/lend/src/entities/token/model/query-keys.ts @@ -1,9 +1,6 @@ -import type { ExtractQueryKeyType } from '@/shared/types/api' import { TokenQueryParams } from '@/entities/token' export const tokenKeys = { root: ({ chainId, tokenAddress }: TokenQueryParams) => ['chain', chainId, 'token', tokenAddress] as const, usdRate: (params: TokenQueryParams) => [...tokenKeys.root(params), 'usdRate'] as const, } as const - -export type TokenQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/entities/token/model/query-options.ts b/apps/lend/src/entities/token/model/query-options.ts index 6a61edf0a..f01ea4f23 100644 --- a/apps/lend/src/entities/token/model/query-options.ts +++ b/apps/lend/src/entities/token/model/query-options.ts @@ -1,8 +1,9 @@ import { queryOptions } from '@tanstack/react-query' -import { tokenKeys, TokenQueryParams } from '@/entities/token' -import { queryTokenUsdRate } from '@/entities/token/api/query' +import { TokenQueryParams } from '@/entities/token' +import { queryTokenUsdRate } from '@/entities/token/api/token-rates' import { REFRESH_INTERVAL } from '@/constants' import { checkTokenValidity } from '@/entities/token/lib/validation' +import { tokenKeys } from '@/entities/token/model' export const getTokenUsdRateQueryOptions = (params: TokenQueryParams) => queryOptions({ diff --git a/apps/lend/src/entities/token/model/validation.ts b/apps/lend/src/entities/token/model/validation.ts index 8c7ca055e..e8e3897bc 100644 --- a/apps/lend/src/entities/token/model/validation.ts +++ b/apps/lend/src/entities/token/model/validation.ts @@ -1,13 +1,17 @@ import type { TokenQueryParams } from '@/entities/token/types' import { createValidationSuite } from '@/shared/lib/validation' import { enforce, group, test } from 'vest' -import { chainValidationGroup } from '@/entities/chain' +import { chainValidationGroup } from '@/entities/chain/model' export const tokenValidationGroup = ({ chainId, tokenAddress }: TokenQueryParams) => group('tokenValidation', () => { chainValidationGroup({ chainId }) test('tokenAddress', () => { - enforce(tokenAddress).message('Token address is required').isNotEmpty().message('Invalid token address').isAddress(); + enforce(tokenAddress) + .message('Token address is required') + .isNotEmpty() + .message('Invalid token address') + .isAddress() }) }) diff --git a/apps/lend/src/entities/token/types.ts b/apps/lend/src/entities/token/types.ts index 8829c43d5..22cc466aa 100644 --- a/apps/lend/src/entities/token/types.ts +++ b/apps/lend/src/entities/token/types.ts @@ -1,7 +1,11 @@ import { ChainQueryParams } from '@/entities/chain/types' +import type { ExtractQueryKeyType } from '@/shared/types/api' +import { tokenKeys } from '@/entities/token/model' export type TokenQueryParams = ChainQueryParams & { tokenAddress?: string } export type CombinedTokenParams = TokenQueryParams + +export type TokenQueryKeyType = ExtractQueryKeyType diff --git a/packages/curve-lib/src/shared/api/cache.ts b/packages/curve-lib/src/shared/api/cache.ts index 939a6d012..37b59088c 100644 --- a/packages/curve-lib/src/shared/api/cache.ts +++ b/packages/curve-lib/src/shared/api/cache.ts @@ -1,7 +1,6 @@ -import { logError, logMutation, logSuccess } from '@/shared/lib/logging'; +import { logError, logMutation, logSuccess } from '@/shared/lib/logging' import { MutationCache, QueryCache, type Mutation } from '@tanstack/react-query' - export const queryCache = new QueryCache({ onError: (error: Error, query) => { logError(query.queryKey, error, error.message) @@ -14,8 +13,8 @@ export const queryCache = new QueryCache({ const getMutationKey = (mutation: Mutation, variables: unknown) => { const queryKeyFn = mutation.options.meta?.queryKeyFn return typeof queryKeyFn === 'function' - ? queryKeyFn(variables) - : mutation.options.mutationKey ?? String(mutation.mutationId) + ? queryKeyFn(variables) + : (mutation.options.mutationKey ?? String(mutation.mutationId)) } export const mutationCache = new MutationCache({ diff --git a/packages/curve-lib/src/shared/lib/logging.ts b/packages/curve-lib/src/shared/lib/logging.ts index ff95aa0d1..4e5302a77 100644 --- a/packages/curve-lib/src/shared/lib/logging.ts +++ b/packages/curve-lib/src/shared/lib/logging.ts @@ -104,7 +104,7 @@ export function log( ...keyStyles, ...(args.length > 0 ? ['color: 666;'] : []), 'color: inherit;', - ...args + ...args, ) } else { const [formattedKeyString, keyStyles] = formatKeyArray(keyArray) @@ -116,7 +116,7 @@ export function log( 'color: #666;', ...keyStyles, 'color: inherit;', - ...args + ...args, ) } } diff --git a/packages/curve-lib/src/shared/lib/queries/combine.ts b/packages/curve-lib/src/shared/lib/queries/combine.ts index 16e7f7b07..59e39c1fa 100644 --- a/packages/curve-lib/src/shared/lib/queries/combine.ts +++ b/packages/curve-lib/src/shared/lib/queries/combine.ts @@ -4,12 +4,14 @@ import { CombinedQueryMappingResult, ExtractDataType, QueryOptionsArray, - QueryResultsArray + QueryResultsArray, } from './types' import { useCallback } from 'react' /** Combines the metadata of multiple queries into a single object. */ -const combineQueriesMeta = (results: QueryResultsArray): Omit, 'data'> => ({ +const combineQueriesMeta = ( + results: QueryResultsArray, +): Omit, 'data'> => ({ isLoading: results.some((result) => result.isLoading), isPending: results.some((result) => result.isPending), isError: results.some((result) => result.isError), @@ -17,14 +19,22 @@ const combineQueriesMeta = (results: QueryResultsAr }) /** Combines the data and metadata of multiple queries into a single object. */ -const combineQueriesToList = (results: QueryResultsArray): CombinedQueriesResult => ({ +const combineQueriesToList = ( + results: QueryResultsArray, +): CombinedQueriesResult => ({ data: results.map((result) => result.data), ...combineQueriesMeta(results), }) /** Combines the data and metadata of multiple queries into a single object. */ -const combineQueriesToObject = (results: QueryResultsArray, keys: K): CombinedQueryMappingResult => ({ - data: Object.fromEntries((results || []).map((result, index) => [keys[index], result])) as Record>, +const combineQueriesToObject = ( + results: QueryResultsArray, + keys: K, +): CombinedQueryMappingResult => ({ + data: Object.fromEntries((results || []).map((result, index) => [keys[index], result])) as Record< + K[number], + ExtractDataType + >, ...combineQueriesMeta(results), }) @@ -33,10 +43,11 @@ const combineQueriesToObject = * @param queryOptions The query options to combine * @returns The combined queries in a list */ -export const useCombinedQueries = (queryOptions: [...T]): CombinedQueriesResult => useQueries({ - queries: queryOptions, - combine: combineQueriesToList, -}) +export const useCombinedQueries = (queryOptions: [...T]): CombinedQueriesResult => + useQueries({ + queries: queryOptions, + combine: combineQueriesToList, + }) /** * Combines multiple queries into a single object with keys for each query @@ -44,8 +55,11 @@ export const useCombinedQueries = (queryOptions: [. * @param keys The keys to use for each query * @returns The combined queries in an object */ -export const useQueryMapping = (queryOptions: [...T], keys: [...K]): CombinedQueryMappingResult => +export const useQueryMapping = ( + queryOptions: [...T], + keys: [...K], +): CombinedQueryMappingResult => useQueries({ queries: queryOptions, - combine: useCallback((results: UseQueryResult[]) => combineQueriesToObject(results, keys), [keys]) + combine: useCallback((results: UseQueryResult[]) => combineQueriesToObject(results, keys), [keys]), }) diff --git a/packages/curve-lib/src/shared/lib/queries/factory.ts b/packages/curve-lib/src/shared/lib/queries/factory.ts index 0d801c712..4960990f1 100644 --- a/packages/curve-lib/src/shared/lib/queries/factory.ts +++ b/packages/curve-lib/src/shared/lib/queries/factory.ts @@ -2,7 +2,7 @@ import { useQuery, QueryKey } from '@tanstack/react-query' import type { UseQueryOptions } from '@tanstack/react-query' export function createQueryHook( - getQueryOptions: (params: TParams, condition?: boolean) => UseQueryOptions + getQueryOptions: (params: TParams, condition?: boolean) => UseQueryOptions, ) { return (params: TParams, condition?: boolean) => { const options = getQueryOptions(params, condition) diff --git a/packages/curve-lib/src/shared/lib/queries/types.ts b/packages/curve-lib/src/shared/lib/queries/types.ts index d7a26e559..b141849a8 100644 --- a/packages/curve-lib/src/shared/lib/queries/types.ts +++ b/packages/curve-lib/src/shared/lib/queries/types.ts @@ -10,8 +10,16 @@ export type QueryResultsArray = { [K in keyof T]: T[K] extends UseQueryOptions ? UseQueryResult : never } -export type PartialQueryResult = Pick, 'data' | 'isLoading' | 'isPending' | 'isError' | 'isFetching'> +export type PartialQueryResult = Pick< + UseQueryResult, + 'data' | 'isLoading' | 'isPending' | 'isError' | 'isFetching' +> -export type CombinedQueriesResult = PartialQueryResult>; +export type CombinedQueriesResult = PartialQueryResult> -export type CombinedQueryMappingResult = PartialQueryResult[number]>>; +export type CombinedQueryMappingResult = PartialQueryResult< + Record[number]> +> + +export const FETCHING = { isError: false, isLoading: true, isPending: true, isFetching: true, data: undefined } as const +export const READY = { isError: false, isLoading: false, isPending: false, isFetching: false } as const diff --git a/packages/curve-lib/src/shared/lib/validation/lib.ts b/packages/curve-lib/src/shared/lib/validation/lib.ts index 3951d0e23..4cdefc452 100644 --- a/packages/curve-lib/src/shared/lib/validation/lib.ts +++ b/packages/curve-lib/src/shared/lib/validation/lib.ts @@ -6,7 +6,7 @@ extendEnforce(enforce) function getFieldsList[] = Extract[]>( data: T, - fields?: F + fields?: F, ): F { return fields && fields.length > 0 ? fields : (Object.keys(data) as F) } @@ -14,7 +14,7 @@ function getFieldsList[] = export function checkValidity>( suite: S, data: D, - fields?: Extract[] + fields?: Extract[], ): boolean { const fieldsList = getFieldsList(data, fields) const result = suite(data, fieldsList) @@ -25,7 +25,7 @@ export function checkValidity>( export function assertValidity>( suite: S, data: D, - fields?: Extract[] + fields?: Extract[], ): ValidatedData { const fieldsList = getFieldsList(data, fields) const result = suite(data, fieldsList) @@ -38,7 +38,7 @@ export function assertValidity>( export function createValidationSuite< T extends object, - F extends Extract[] = Extract[] + F extends Extract[] = Extract[], >(validationGroup: (data: T) => void) { return create((data: T, fieldsList?: F) => { only(fieldsList) diff --git a/packages/curve-lib/src/shared/types/nested.ts b/packages/curve-lib/src/shared/types/nested.ts index e9c9d7529..b6d60248a 100644 --- a/packages/curve-lib/src/shared/types/nested.ts +++ b/packages/curve-lib/src/shared/types/nested.ts @@ -9,7 +9,8 @@ export type NestedProperty = K extends `${infer P}.${infer ? NestedProperty : never : K extends keyof T - ? T[K] - : never + ? T[K] + : never -export type NestedFunction = NestedProperty extends (...args: any) => any ? NestedProperty : never +export type NestedFunction = + NestedProperty extends (...args: any) => any ? NestedProperty : never From 1087b2fe7c55a11ffd189818c2471222743ca2d9 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 7 Oct 2024 11:20:43 +0200 Subject: [PATCH 021/137] refactor: inline function, re-enable cache --- apps/lend/src/entities/token/lib/index.ts | 1 - apps/lend/src/entities/token/lib/last-results.ts | 10 ---------- apps/lend/src/store/createMarketListSlice.ts | 10 ++++++++-- packages/ui/src/QueryProvider/index.tsx | 2 +- 4 files changed, 9 insertions(+), 14 deletions(-) delete mode 100644 apps/lend/src/entities/token/lib/last-results.ts diff --git a/apps/lend/src/entities/token/lib/index.ts b/apps/lend/src/entities/token/lib/index.ts index 7e8199c1f..e0069df3f 100644 --- a/apps/lend/src/entities/token/lib/index.ts +++ b/apps/lend/src/entities/token/lib/index.ts @@ -1,3 +1,2 @@ export * from './query-hooks' export * from './validation' -export * from './last-results' diff --git a/apps/lend/src/entities/token/lib/last-results.ts b/apps/lend/src/entities/token/lib/last-results.ts deleted file mode 100644 index 527fdb851..000000000 --- a/apps/lend/src/entities/token/lib/last-results.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { queryClient } from '@/shared/api/query-client' -import { tokenKeys } from '@/entities/token/model' - -export const getLastTokenUsdRate = (chainId: ChainId, tokenAddress: string) => - queryClient.getQueryData( - tokenKeys.usdRate({ - chainId, - tokenAddress, - }), - ) diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index 6a013b656..b270b2933 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -19,7 +19,8 @@ import { getTotalApr } from '@/utils/utilsRewards' import { helpers } from '@/lib/apiLending' import { sleep } from '@/utils/helpers' import networks from '@/networks' -import { getLastTokenUsdRate } from '@/entities/token/lib/last-results' +import { queryClient } from '@/shared/api/query-client' +import { tokenKeys } from '@/entities/token/model' type StateKey = keyof typeof DEFAULT_STATE @@ -90,7 +91,12 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const { smallMarketAmount, marketListShowOnlyInSmallMarkets } = networks[chainId] return owmDatas.filter(({ owm }) => { const { cap } = capAndAvailableMapper[owm.id] ?? {} - const usdRate = getLastTokenUsdRate(chainId, owm.borrowed_token.address) + const usdRate = queryClient.getQueryData( + tokenKeys.usdRate({ + chainId, + tokenAddress: owm.borrowed_token.address, + }), + ) if (typeof usdRate === 'undefined') return true if (marketListShowOnlyInSmallMarkets[owm.id]) return false return +cap * usdRate > smallMarketAmount diff --git a/packages/ui/src/QueryProvider/index.tsx b/packages/ui/src/QueryProvider/index.tsx index a08be4b3f..ef56382d9 100644 --- a/packages/ui/src/QueryProvider/index.tsx +++ b/packages/ui/src/QueryProvider/index.tsx @@ -9,7 +9,7 @@ type QueryProviderWrapperProps = { } export function QueryProvider({ children, persister, queryClient }: QueryProviderWrapperProps) { - if (persister && !window?.localStorage?.getItem('react-query-no-persist')) { + if (persister) { return ( {children} From 959677ffec719c510535f20555f050249af29e6a Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 8 Oct 2024 11:37:10 +0200 Subject: [PATCH 022/137] refactor: try to fix review comments --- apps/lend/src/entities/token/api/token-rates.ts | 4 ++-- apps/lend/src/entities/token/lib/index.ts | 1 + apps/lend/src/entities/token/lib/query-data.ts | 6 ++++++ apps/lend/src/entities/token/lib/validation.ts | 7 ++----- apps/lend/src/entities/token/types.ts | 3 ++- apps/lend/src/store/createMarketListSlice.ts | 10 ++-------- packages/curve-lib/src/shared/lib/queries/config.ts | 2 ++ packages/curve-lib/src/shared/lib/queries/index.ts | 1 + packages/curve-lib/src/shared/lib/queries/types.ts | 2 -- 9 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 apps/lend/src/entities/token/lib/query-data.ts create mode 100644 packages/curve-lib/src/shared/lib/queries/config.ts diff --git a/apps/lend/src/entities/token/api/token-rates.ts b/apps/lend/src/entities/token/api/token-rates.ts index 1036281c1..85c81d2ba 100644 --- a/apps/lend/src/entities/token/api/token-rates.ts +++ b/apps/lend/src/entities/token/api/token-rates.ts @@ -1,12 +1,12 @@ import { QueryFunction } from '@tanstack/react-query' import { logQuery } from '@/shared/lib/logging' -import { extractTokenParams } from '@/entities/token/lib/validation' +import { assertTokenParams } from '@/entities/token/lib/validation' import useStore from '@/store/useStore' import { TokenQueryKeyType } from '@/entities/token' export const queryTokenUsdRate: QueryFunction> = async ({ queryKey }) => { logQuery(queryKey) - const { tokenAddress } = extractTokenParams(queryKey) + const { tokenAddress } = assertTokenParams(queryKey) const { api } = useStore.getState() return await api!.getUsdRate(tokenAddress) } diff --git a/apps/lend/src/entities/token/lib/index.ts b/apps/lend/src/entities/token/lib/index.ts index e0069df3f..ebeda0f45 100644 --- a/apps/lend/src/entities/token/lib/index.ts +++ b/apps/lend/src/entities/token/lib/index.ts @@ -1,2 +1,3 @@ export * from './query-hooks' +export * from './query-data' export * from './validation' diff --git a/apps/lend/src/entities/token/lib/query-data.ts b/apps/lend/src/entities/token/lib/query-data.ts new file mode 100644 index 000000000..cb2fcc913 --- /dev/null +++ b/apps/lend/src/entities/token/lib/query-data.ts @@ -0,0 +1,6 @@ +import { tokenKeys } from '../model' +import { queryClient } from '@/shared/api/query-client' +import { TokenKey } from '@/entities/token' + +export const getTokenQueryData = (key: TokenKey, keyData: Parameters[0]) => + queryClient.getQueryData(tokenKeys[key](keyData)) diff --git a/apps/lend/src/entities/token/lib/validation.ts b/apps/lend/src/entities/token/lib/validation.ts index e080faed4..c6dd43ea7 100644 --- a/apps/lend/src/entities/token/lib/validation.ts +++ b/apps/lend/src/entities/token/lib/validation.ts @@ -8,8 +8,5 @@ export const assertTokenValidity = (data: T, fiel export const checkTokenValidity = (data: T, fields?: Extract[]) => checkValidity(tokenValidationSuite, data, fields) -export const extractTokenParams = ([, chainId, , givenAddress]: TokenQueryKeyType<'usdRate'>) => - assertTokenValidity({ - chainId, - tokenAddress: givenAddress, - }) +export const assertTokenParams = ([, chainId, , tokenAddress]: T) => + assertTokenValidity({ chainId, tokenAddress }) diff --git a/apps/lend/src/entities/token/types.ts b/apps/lend/src/entities/token/types.ts index 22cc466aa..1d53fdddb 100644 --- a/apps/lend/src/entities/token/types.ts +++ b/apps/lend/src/entities/token/types.ts @@ -8,4 +8,5 @@ export type TokenQueryParams = ChainQueryParams & { export type CombinedTokenParams = TokenQueryParams -export type TokenQueryKeyType = ExtractQueryKeyType +export type TokenKey = keyof typeof tokenKeys +export type TokenQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index b270b2933..7150997d5 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -19,8 +19,7 @@ import { getTotalApr } from '@/utils/utilsRewards' import { helpers } from '@/lib/apiLending' import { sleep } from '@/utils/helpers' import networks from '@/networks' -import { queryClient } from '@/shared/api/query-client' -import { tokenKeys } from '@/entities/token/model' +import { getTokenQueryData } from '@/entities/token' type StateKey = keyof typeof DEFAULT_STATE @@ -91,12 +90,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const { smallMarketAmount, marketListShowOnlyInSmallMarkets } = networks[chainId] return owmDatas.filter(({ owm }) => { const { cap } = capAndAvailableMapper[owm.id] ?? {} - const usdRate = queryClient.getQueryData( - tokenKeys.usdRate({ - chainId, - tokenAddress: owm.borrowed_token.address, - }), - ) + const usdRate = getTokenQueryData('usdRate', { chainId, tokenAddress: owm.borrowed_token.address }) if (typeof usdRate === 'undefined') return true if (marketListShowOnlyInSmallMarkets[owm.id]) return false return +cap * usdRate > smallMarketAmount diff --git a/packages/curve-lib/src/shared/lib/queries/config.ts b/packages/curve-lib/src/shared/lib/queries/config.ts new file mode 100644 index 000000000..e2659c7a9 --- /dev/null +++ b/packages/curve-lib/src/shared/lib/queries/config.ts @@ -0,0 +1,2 @@ +export const FETCHING = { isError: false, isLoading: true, isPending: true, isFetching: true, data: undefined } as const +export const READY = { isError: false, isLoading: false, isPending: false, isFetching: false } as const \ No newline at end of file diff --git a/packages/curve-lib/src/shared/lib/queries/index.ts b/packages/curve-lib/src/shared/lib/queries/index.ts index cf575e39e..2d6b08409 100644 --- a/packages/curve-lib/src/shared/lib/queries/index.ts +++ b/packages/curve-lib/src/shared/lib/queries/index.ts @@ -1,3 +1,4 @@ export * from './types' export * from './combine' export * from './factory' +export * from './config' diff --git a/packages/curve-lib/src/shared/lib/queries/types.ts b/packages/curve-lib/src/shared/lib/queries/types.ts index b141849a8..d51a760b9 100644 --- a/packages/curve-lib/src/shared/lib/queries/types.ts +++ b/packages/curve-lib/src/shared/lib/queries/types.ts @@ -21,5 +21,3 @@ export type CombinedQueryMappingResult[number]> > -export const FETCHING = { isError: false, isLoading: true, isPending: true, isFetching: true, data: undefined } as const -export const READY = { isError: false, isLoading: false, isPending: false, isFetching: false } as const From 1980bae1e1fa65c4defeecb25958a5f4f5036895 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 8 Oct 2024 14:49:10 +0200 Subject: [PATCH 023/137] fix: update usage after owm refactor --- apps/lend/src/components/DetailInfoHealth.tsx | 14 ++--- .../DetailsMarket/components/DetailsLoan.tsx | 11 ++-- .../components/DetailsSupply.tsx | 8 +-- .../components/DetailsUserLoan.tsx | 19 +++---- .../DetailsUserLoanAlertSoftLiquidation.tsx | 3 +- .../components/DetailsUserSupply.tsx | 6 +- .../LoanFormCreate/components/DetailInfo.tsx | 12 ++-- .../components/DetailInfoLeverage.tsx | 6 +- .../components/DetailInfoNonLeverage.tsx | 11 ++-- .../PageLoanCreate/LoanFormCreate/index.tsx | 29 +++++----- .../src/components/PageLoanCreate/types.ts | 2 +- .../src/components/PageLoanManage/index.tsx | 6 +- .../components/MarketListNoResult.tsx | 6 +- .../TableRowViewContentTable/TableRow.tsx | 4 +- .../TableRowContainer.tsx | 13 ++--- .../TableRowMobile.tsx | 6 +- .../src/components/PageMarketList/index.tsx | 3 +- .../src/components/PageMarketList/utils.ts | 6 +- .../components/SharedCellData/CellToken.tsx | 2 +- .../CellTotalCollateralValue.tsx | 7 ++- .../src/store/createLoanBorrowMoreSlice.ts | 30 +++++----- .../src/store/createLoanCollateralAddSlice.ts | 14 ++--- .../store/createLoanCollateralRemoveSlice.ts | 12 ++-- apps/lend/src/store/createLoanCreateSlice.ts | 34 +++++------ apps/lend/src/store/createLoanRepaySlice.ts | 16 +++--- .../store/createLoanSelfLiquidationSlice.ts | 10 ++-- apps/lend/src/store/createMarketListSlice.ts | 6 +- apps/lend/src/store/createMarketsSlice.ts | 10 ++-- apps/lend/src/store/createUserSlice.ts | 56 +++++++++---------- 29 files changed, 174 insertions(+), 188 deletions(-) diff --git a/apps/lend/src/components/DetailInfoHealth.tsx b/apps/lend/src/components/DetailInfoHealth.tsx index 288c0f629..ce3904228 100644 --- a/apps/lend/src/components/DetailInfoHealth.tsx +++ b/apps/lend/src/components/DetailInfoHealth.tsx @@ -44,7 +44,7 @@ const DetailInfoHealth = ({ loading: boolean setHealthMode: React.Dispatch> }) => { - const owmData = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId)?.data const oraclePriceBand = useStore((state) => state.markets.pricesMapper[rChainId]?.[rOwmId]?.prices?.oraclePriceBand) const userLoanDetails = useStore((state) => state.user.loansDetailsMapper[userActiveKey]?.details) @@ -58,7 +58,7 @@ const DetailInfoHealth = ({ if (typeof oraclePriceBand === 'number' && healthFull) { setHealthMode( getHealthMode( - owmData, + market, oraclePriceBand, amount, bands, @@ -79,7 +79,7 @@ const DetailInfoHealth = ({ formType, healthFull, newHealthModeColorKey, - owmData, + market, setHealthMode, ]) @@ -88,10 +88,10 @@ const DetailInfoHealth = ({ if (typeof oraclePriceBand === 'number' && userLoanDetails) { const { healthFull, bands } = userLoanDetails setCurrentHealthMode( - getHealthMode(owmData, oraclePriceBand, amount, bands, formType, healthFull, '', newHealthModeColorKey) + getHealthMode(market, oraclePriceBand, amount, bands, formType, healthFull, '', newHealthModeColorKey) ) } - }, [oraclePriceBand, amount, formType, newHealthModeColorKey, owmData, userLoanDetails]) + }, [oraclePriceBand, amount, formType, newHealthModeColorKey, market, userLoanDetails]) const healthPercent = useMemo(() => { if (healthMode.percent) { @@ -153,7 +153,7 @@ export default DetailInfoHealth // 1. If health(full=true) < loan_discount, user is at risk to go from healthy mode to soft liquidation mode (green —> orange). // 2. If health(full=false) < liquidation_discount , user is at risk to go from soft liquidation mode to hard liquidation mode (orange —> red). export function getHealthMode( - owmData: OneWayMarketTemplate | undefined, + market: OneWayMarketTemplate | undefined, oraclePriceBand: number | null, amount: string, bands: [number, number] | number[], @@ -179,7 +179,7 @@ export function getHealthMode( message = t`You are still close to soft liquidation.` } else if (newColorKey === 'close_to_liquidation') { const formattedAmount = formatNumber(amount) - const borrowedToken = owmData?.borrowed_token?.symbol + const borrowedToken = market?.borrowed_token?.symbol if (formType === 'collateral-decrease') { message = t`Removing ${formattedAmount} collateral, will put you close to soft liquidation.` } else if (formType === 'create-loan') { diff --git a/apps/lend/src/components/DetailsMarket/components/DetailsLoan.tsx b/apps/lend/src/components/DetailsMarket/components/DetailsLoan.tsx index fe09b12b8..48bf605b1 100644 --- a/apps/lend/src/components/DetailsMarket/components/DetailsLoan.tsx +++ b/apps/lend/src/components/DetailsMarket/components/DetailsLoan.tsx @@ -20,14 +20,14 @@ import ChartOhlcWrapper from '@/components/ChartOhlcWrapper' import ListInfoItem, { ListInfoItems, ListInfoItemsWrapper } from '@/ui/ListInfo' const DetailsLoan = ({ type, ...pageProps }: PageContentProps & { type: MarketListType }) => { - const { rChainId, rOwmId, owmDataCachedOrApi, borrowed_token, collateral_token, titleMapper, userActiveKey } = + const { rChainId, rOwmId, market, titleMapper, userActiveKey } = pageProps const chartExpanded = useStore((state) => state.ohlcCharts.chartExpanded) const cellProps = { rChainId, rOwmId, - owmDataCachedOrApi, + market, size: 'md' as const, } @@ -73,8 +73,7 @@ const DetailsLoan = ({ type, ...pageProps }: PageContentProps & { type: MarketLi @@ -82,9 +81,7 @@ const DetailsLoan = ({ type, ...pageProps }: PageContentProps & { type: MarketLi diff --git a/apps/lend/src/components/DetailsMarket/components/DetailsSupply.tsx b/apps/lend/src/components/DetailsMarket/components/DetailsSupply.tsx index 9b1c4c5be..df2753ebe 100644 --- a/apps/lend/src/components/DetailsMarket/components/DetailsSupply.tsx +++ b/apps/lend/src/components/DetailsMarket/components/DetailsSupply.tsx @@ -16,12 +16,12 @@ import ListInfoItem, { ListInfoItems, ListInfoItemsWrapper } from '@/ui/ListInfo import MarketParameters from '@/components/DetailsMarket/components/MarketParameters' const DetailsSupply = ({ type, ...pageProps }: PageContentProps & { type: MarketListType }) => { - const { rChainId, rOwmId, owmDataCachedOrApi, borrowed_token, collateral_token, titleMapper } = pageProps + const { rChainId, rOwmId, market, titleMapper } = pageProps const cellProps = { rChainId, rOwmId, - owmDataCachedOrApi, + market, size: 'md' as const, } @@ -63,9 +63,7 @@ const DetailsSupply = ({ type, ...pageProps }: PageContentProps & { type: Market
diff --git a/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx b/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx index 406ab66a9..cf82f6721 100644 --- a/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx +++ b/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx @@ -24,7 +24,7 @@ import ChartOhlcWrapper from '@/components/ChartOhlcWrapper' import ListInfoItem, { ListInfoItems, ListInfoItemsWrapper } from '@/ui/ListInfo' const DetailsUserLoan = (pageProps: PageContentProps) => { - const { rChainId, rOwmId, api, owmDataCachedOrApi, titleMapper, userActiveKey } = pageProps + const { rChainId, rOwmId, api, market, titleMapper, userActiveKey } = pageProps const isAdvanceMode = useStore((state) => state.isAdvanceMode) const loanExistsResp = useStore((state) => state.user.loansExistsMapper[userActiveKey]) @@ -43,7 +43,7 @@ const DetailsUserLoan = (pageProps: PageContentProps) => { rChainId, rOwmId, isBold: true, - owmDataCachedOrApi, + market: market!, userActiveKey, size: 'md' as const, } @@ -83,20 +83,17 @@ const DetailsUserLoan = (pageProps: PageContentProps) => { - + {/* stats */} {contents.map((groupedContents, idx) => ( - {groupedContents.map(({ titleKey, content, show, ...props }, idx) => { - if (!_showContent(show)) return null - return ( - - {content} - - ) - })} + {groupedContents.filter(({show}) => _showContent(show)).map(({ titleKey, content }, idx) => ( + + {content} + + ))} ))} diff --git a/apps/lend/src/components/DetailsUser/components/DetailsUserLoanAlertSoftLiquidation.tsx b/apps/lend/src/components/DetailsUser/components/DetailsUserLoanAlertSoftLiquidation.tsx index 0baf16655..150b0d2be 100644 --- a/apps/lend/src/components/DetailsUser/components/DetailsUserLoanAlertSoftLiquidation.tsx +++ b/apps/lend/src/components/DetailsUser/components/DetailsUserLoanAlertSoftLiquidation.tsx @@ -8,7 +8,8 @@ import AlertBox from '@/ui/AlertBox' import Box from '@/ui/Box' import ExternalLink from '@/ui/Link/ExternalLink' -const DetailsUserLoanAlertSoftLiquidation = ({ borrowed_token, collateral_token, userActiveKey }: PageContentProps) => { +const DetailsUserLoanAlertSoftLiquidation = ({ market, userActiveKey }: PageContentProps) => { + const {borrowed_token, collateral_token} = market ?? {} const userLoanDetails = useStore((state) => state.user.loansDetailsMapper[userActiveKey]) // TODO handle error diff --git a/apps/lend/src/components/DetailsUser/components/DetailsUserSupply.tsx b/apps/lend/src/components/DetailsUser/components/DetailsUserSupply.tsx index b1fc86fd8..6bb58de89 100644 --- a/apps/lend/src/components/DetailsUser/components/DetailsUserSupply.tsx +++ b/apps/lend/src/components/DetailsUser/components/DetailsUserSupply.tsx @@ -14,7 +14,7 @@ import DetailsUserSupplyStakedUnstaked from '@/components/DetailsUser/components import ListInfoItem, { ListInfoItems, ListInfoItemsWrapper } from '@/ui/ListInfo' const DetailsUserSupply = (pageProps: PageContentProps) => { - const { rChainId, rOwmId, api, userActiveKey, owmDataCachedOrApi, titleMapper } = pageProps + const { rChainId, rOwmId, api, userActiveKey, market, titleMapper } = pageProps const userBalancesResp = useStore((state) => state.user.marketsBalancesMapper[userActiveKey]) @@ -28,7 +28,7 @@ const DetailsUserSupply = (pageProps: PageContentProps) => { rChainId, rOwmId, isBold: true, - owmDataCachedOrApi, + market, userActiveKey, size: 'md' as const, } @@ -50,7 +50,7 @@ const DetailsUserSupply = (pageProps: PageContentProps) => { ) : foundVaultShares ? ( - + {/* stats */} diff --git a/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfo.tsx b/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfo.tsx index e6dc133c6..8ed575120 100644 --- a/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfo.tsx +++ b/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfo.tsx @@ -1,5 +1,5 @@ import type { LiqRangeSliderIdx } from '@/store/types' -import type { DetailInfoCompProps, DetailInfoCompAdditionalProps } from '@/components/PageLoanCreate/types' +import type { DetailInfoCompAdditionalProps, DetailInfoCompProps } from '@/components/PageLoanCreate/types' import React, { useMemo } from 'react' @@ -10,11 +10,9 @@ import DetailInfoNonLeverage from '@/components/PageLoanCreate/LoanFormCreate/co import DetailInfoLeverage from '@/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage' const DetailInfoComp = ({ isLeverage, ...props }: PageContentProps & DetailInfoCompProps & { isLeverage: boolean }) => { - const { api, owmData, steps, updateFormValues } = props + const { api, market, steps, updateFormValues } = props const { signerAddress } = api ?? {} - const { owm } = owmData ?? {} - const activeKeyLiqRange = useStore((state) => state.loanCreate.activeKeyLiqRange) const formValues = useStore((state) => state.loanCreate.formValues) const isEditLiqRange = useStore((state) => state.loanCreate.isEditLiqRange) @@ -26,12 +24,12 @@ const DetailInfoComp = ({ isLeverage, ...props }: PageContentProps & DetailInfoC const selectedLiqRange = useMemo(() => { if (formValues.n && liqRanges) { return liqRanges[formValues.n] - } else if (owm) { - return { n: owm.defaultBands } as LiqRangeSliderIdx + } else if (market) { + return { n: market.defaultBands } as LiqRangeSliderIdx } else { return undefined } - }, [formValues.n, liqRanges, owm]) + }, [formValues.n, liqRanges, market]) const handleLiqRangesEdit = () => { const showEditLiqRange = !isEditLiqRange diff --git a/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx b/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx index 80b54c3c6..be0d3c43f 100644 --- a/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx +++ b/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx @@ -27,10 +27,8 @@ const DetailInfoLeverage = ({ api, healthMode, isLoaded, - owm, + market, steps, - borrowed_token, - collateral_token, userActiveKey, handleSelLiqRange, selectedLiqRange, @@ -49,7 +47,7 @@ const DetailInfoLeverage = ({ const maxSlippage = useStore((state) => state.maxSlippage) const { signerAddress } = api ?? {} - const { minBands, maxBands } = owm ?? {} + const { minBands, maxBands, borrowed_token, collateral_token } = market ?? {} const { expectedCollateral, routes } = detailInfo ?? {} const { userBorrowed, debt } = formValues const { symbol: collateralSymbol = '' } = collateral_token ?? {} diff --git a/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoNonLeverage.tsx b/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoNonLeverage.tsx index 35f46b715..c3d5747b6 100644 --- a/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoNonLeverage.tsx +++ b/apps/lend/src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoNonLeverage.tsx @@ -17,11 +17,9 @@ const DetailInfoNonLeverage = ({ rChainId, rOwmId, api, - borrowed_token, - collateral_token, healthMode, isLoaded, - owm, + market, steps, userActiveKey, handleSelLiqRange, @@ -39,6 +37,7 @@ const DetailInfoNonLeverage = ({ const liqRanges = useStore((state) => state.loanCreate.liqRanges[activeKeyLiqRange]) const { signerAddress } = api ?? {} + const { borrowed_token, collateral_token } = market ?? {} const loading = !isLoaded || typeof detailInfo === 'undefined' @@ -60,8 +59,8 @@ const DetailInfoNonLeverage = ({ - + {isAdvanceMode && ( { - const { rChainId, rOwmId, isLoaded, api, owmData, userActiveKey, borrowed_token, collateral_token } = pageProps + const { rChainId, rOwmId, isLoaded, api, market, userActiveKey } = pageProps const isSubscribed = useRef(false) const params = useParams() const navigate = useNavigate() @@ -70,15 +70,15 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i const [txInfoBar, setTxInfoBar] = useState(null) const { signerAddress } = api ?? {} - const { owm } = owmData ?? {} const { expectedCollateral } = detailInfoLeverage ?? {} + const { borrowed_token, collateral_token } = market ?? {} const updateFormValues = useCallback( (updatedFormValues: Partial, isFullReset?: boolean, shouldRefetch?: boolean) => { setConfirmWarning(DEFAULT_CONFIRM_WARNING) setFormValues( isLoaded ? api : null, - owmData, + market, isFullReset ? DEFAULT_FORM_VALUES : updatedFormValues, maxSlippage, isLeverage, @@ -87,7 +87,7 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i if (isFullReset) setHealthMode(DEFAULT_HEALTH_MODE) }, - [setFormValues, isLoaded, api, owmData, maxSlippage, isLeverage] + [setFormValues, isLoaded, api, market, maxSlippage, isLeverage] ) const handleClickCreate = useCallback( @@ -144,8 +144,7 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i { - const tokensMessage = getStepTokensStr(formValues, market.owm).symbolList + const tokensMessage = getStepTokensStr(formValues, market).symbolList const notifyMessage = t`Please approve spending your ${tokensMessage}.` const notify = notifyNotification(notifyMessage, 'pending') @@ -271,11 +270,11 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i // steps useEffect(() => { - if (isLoaded && api && owmData) { + if (isLoaded && api && market) { let updatedSteps = getSteps( activeKey, api, - owmData, + market, healthMode, confirmedWarning, formEstGas, @@ -301,7 +300,7 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i isLeverage, maxRecv, maxSlippage, - owmData?.owm?.id, + market?.id, signerAddress, userBalances, userDetails?.state, @@ -369,7 +368,7 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i maxRecv={maxRecv} handleInpChange={(debt) => updateFormValues({ debt })} handleMaxClick={async () => { - const debt = await refetchMaxRecv(owmData, isLeverage) + const debt = await refetchMaxRecv(market, isLeverage) updateFormValues({ debt }) }} /> @@ -379,7 +378,7 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i {...pageProps} healthMode={healthMode} isLeverage={isLeverage} - owm={owmData?.owm ?? null} + market={market!} steps={steps} setHealthMode={setHealthMode} updateFormValues={updateFormValues} @@ -430,8 +429,8 @@ const LoanCreate = ({ isLeverage = false, ...pageProps }: PageContentProps & { i /> )} {steps && } - {formStatus.isComplete && owm && ( - + {formStatus.isComplete && market && ( + Manage loan )} diff --git a/apps/lend/src/components/PageLoanCreate/types.ts b/apps/lend/src/components/PageLoanCreate/types.ts index fa1aee630..a56bc872a 100644 --- a/apps/lend/src/components/PageLoanCreate/types.ts +++ b/apps/lend/src/components/PageLoanCreate/types.ts @@ -31,7 +31,7 @@ export type FormEstGas = { export type DetailInfoCompProps = { healthMode: HealthMode - owm: OneWayMarketTemplate | null + market: OneWayMarketTemplate | null steps: Step[] setHealthMode: React.Dispatch> updateFormValues: (updatedFormValues: FormValues) => void diff --git a/apps/lend/src/components/PageLoanManage/index.tsx b/apps/lend/src/components/PageLoanManage/index.tsx index 39ad5bb63..94b861e13 100644 --- a/apps/lend/src/components/PageLoanManage/index.tsx +++ b/apps/lend/src/components/PageLoanManage/index.tsx @@ -17,7 +17,7 @@ import LoanCollateralAdd from '@/components/PageLoanManage/LoanCollateralAdd' import LoanCollateralRemove from '@/components/PageLoanManage/LoanCollateralRemove' const ManageLoan = (pageProps: PageContentProps) => { - const { rOwmId, rFormType, userActiveKey, owmDataCachedOrApi, rChainId } = pageProps + const { rOwmId, rFormType, userActiveKey, market, rChainId } = pageProps const params = useParams() const navigate = useNavigate() const tabsRef = useRef(null) @@ -32,12 +32,12 @@ const ManageLoan = (pageProps: PageContentProps) => { { label: t`Collateral`, key: 'collateral' }, ] - if (owmDataCachedOrApi?.hasLeverage) { + if (market?.leverage?.hasLeverage()) { forms.push({ label: t`Leverage`, key: 'leverage' }) } return forms - }, [owmDataCachedOrApi?.hasLeverage]) + }, [market?.leverage]) const TABS_LOAN: { label: string; formType: LoanFormType }[] = [ { label: t`Borrow more`, formType: 'loan-increase' }, diff --git a/apps/lend/src/components/PageMarketList/components/MarketListNoResult.tsx b/apps/lend/src/components/PageMarketList/components/MarketListNoResult.tsx index a3f2051e6..a914fffcd 100644 --- a/apps/lend/src/components/PageMarketList/components/MarketListNoResult.tsx +++ b/apps/lend/src/components/PageMarketList/components/MarketListNoResult.tsx @@ -12,17 +12,19 @@ import AlertBox from '@/ui/AlertBox' import Box from '@/ui/Box' import Button from '@/ui/Button' import ExternalLink from 'ui/src/Link/ExternalLink' +import { useChainId, useOneWayMarketMapping } from '@/entities/chain' const MarketListNoResult = ({ searchParams, signerAddress, updatePath, }: Pick & { signerAddress: string | undefined }) => { - const owmDatasError = useStore((state) => state.markets.error) + const chainId = useChainId()?.data! + const marketMappingError = useOneWayMarketMapping(chainId)?.error return ( - {owmDatasError ? ( + {marketMappingError ? ( {t`Unable to retrieve markets`} diff --git a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRow.tsx b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRow.tsx index 812ac36a3..fd8514150 100644 --- a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRow.tsx +++ b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRow.tsx @@ -32,7 +32,7 @@ const TableRowContent = ({ rChainId, api, owmId, - owmDataCachedOrApi, + market, filterTypeKey, loanExists, showBorrowSignerCell, @@ -52,7 +52,7 @@ const TableRowContent = ({ rChainId, rOwmId: owmId, owmId, - owmDataCachedOrApi, + market, userActiveKey, filterTypeKey, isBold: false, diff --git a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx index 4b2336a36..badf57e23 100644 --- a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx +++ b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx @@ -9,9 +9,10 @@ import useStore from '@/store/useStore' import TableRow from '@/components/PageMarketList/components/TableRowViewContentTable/TableRow' import TableRowMobile from '@/components/PageMarketList/components/TableRowViewContentTable/TableRowMobile' +import { useOneWayMarket } from '@/entities/chain' const TableRowContainer = ( - props: Omit + props: Omit ) => { const { rChainId, api, owmId, filterTypeKey } = props @@ -21,14 +22,10 @@ const TableRowContainer = ( const isMdUp = useStore((state) => state.layout.isMdUp) const loansExistsMapper = useStore((state) => state.user.loansExistsMapper) const marketsBalancesMapper = useStore((state) => state.user.marketsBalancesMapper) - const owmDatasCachedMapper = useStore((state) => state.storeCache.owmDatasMapper[rChainId]) - const owmDatasMapper = useStore((state) => state.markets.owmDatasMapper[rChainId]) const setMarketsStateByKey = useStore((state) => state.markets.setStateByKey) - const owmDataCached = owmDatasCachedMapper?.[owmId] - const owmData = owmDatasMapper?.[owmId] - const owmDataCachedOrApi = owmData ?? owmDataCached - const userActiveKey = helpers.getUserActiveKey(api, owmDataCachedOrApi) + const market = useOneWayMarket(rChainId, owmId)?.data! + const userActiveKey = helpers.getUserActiveKey(api, market) const loanExists = loansExistsMapper[userActiveKey]?.loanExists ?? false const handleCellClick = (target?: EventTarget) => { @@ -54,7 +51,7 @@ const TableRowContainer = ( const tableRowProps: TableRowProps = { ...props, - owmDataCachedOrApi, + market, loanExists, userActiveKey, handleCellClick, diff --git a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowMobile.tsx b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowMobile.tsx index 3fe05045d..4c51681a7 100644 --- a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowMobile.tsx +++ b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowMobile.tsx @@ -39,7 +39,7 @@ const TableRowContent = ({ rChainId, api, owmId, - owmDataCachedOrApi, + market, filterTypeKey, loanExists, userActiveKey, @@ -51,7 +51,7 @@ const TableRowContent = ({ const [showDetail, setShowDetail] = useState('') const { signerAddress } = api ?? {} - const { borrowed_token } = owmDataCachedOrApi?.owm ?? {} + const { borrowed_token } = market ?? {} const isHideDetail = showDetail === owmId const showMyVaultCell = !!signerAddress && typeof userVaultShares !== 'undefined' && +userVaultShares > 0 @@ -60,7 +60,7 @@ const TableRowContent = ({ rChainId, rOwmId: owmId, owmId, - owmDataCachedOrApi, + market, userActiveKey, filterTypeKey, isBold: false, diff --git a/apps/lend/src/components/PageMarketList/index.tsx b/apps/lend/src/components/PageMarketList/index.tsx index 826ee8a00..3208932da 100644 --- a/apps/lend/src/components/PageMarketList/index.tsx +++ b/apps/lend/src/components/PageMarketList/index.tsx @@ -25,7 +25,6 @@ const MarketList = (pageProps: PageMarketList) => { const loansExistsMapper = useStore((state) => state.user.loansExistsMapper) const userMarketsBalances = useStore((state) => state.user.marketsBalancesMapper) const results = useStore((state) => state.marketList.result) - const resultCached = useStore((state) => state.storeCache.marketListResult[activeKey]) const setFormValues = useStore((state) => state.marketList.setFormValues) const { initCampaignRewards, initiated } = useStore((state) => state.campaigns) @@ -64,7 +63,7 @@ const MarketList = (pageProps: PageMarketList) => { } const parsedResult = - results[activeKey] ?? resultCached ?? (activeKey.charAt(0) === prevActiveKey.charAt(0) && results[prevActiveKey]) + results[activeKey] ?? (activeKey.charAt(0) === prevActiveKey.charAt(0) && results[prevActiveKey]) const updateFormValues = useCallback( (shouldRefetch?: boolean) => { diff --git a/apps/lend/src/components/PageMarketList/utils.ts b/apps/lend/src/components/PageMarketList/utils.ts index c2071c520..18447a9ad 100644 --- a/apps/lend/src/components/PageMarketList/utils.ts +++ b/apps/lend/src/components/PageMarketList/utils.ts @@ -53,11 +53,11 @@ export function _searchByTokensAddresses(parsedSearchText: string, searchText: s )) } -export function _getMarketList(owmDatas: OneWayMarketTemplate[]) { +export function _getMarketList(markets: OneWayMarketTemplate[]) { let marketListMapper: MarketListMapper = {} let marketListMapperCache: { [tokenAddress: string]: { symbol: string; address: string } } = {} - owmDatas.forEach(({ id, collateral_token, borrowed_token }) => { + markets.forEach(({ id, collateral_token, borrowed_token }) => { const { address: cAddress, symbol: cSymbol } = collateral_token const { address: bAddress, symbol: bSymbol } = borrowed_token @@ -72,7 +72,7 @@ export function _getMarketList(owmDatas: OneWayMarketTemplate[]) { }) // filter crvusd - const crvUsdAddress = owmDatas.map((m) => m.borrowed_token).find(({ symbol }) => symbol.toLowerCase() === 'crvusd')?.address + const crvUsdAddress = markets.map((m) => m.borrowed_token).find(({ symbol }) => symbol.toLowerCase() === 'crvusd')?.address if (crvUsdAddress) { delete marketListMapper[crvUsdAddress] delete marketListMapperCache[crvUsdAddress] diff --git a/apps/lend/src/components/SharedCellData/CellToken.tsx b/apps/lend/src/components/SharedCellData/CellToken.tsx index bb296fd1d..d75d8a78c 100644 --- a/apps/lend/src/components/SharedCellData/CellToken.tsx +++ b/apps/lend/src/components/SharedCellData/CellToken.tsx @@ -20,7 +20,7 @@ const CellToken = ({ hideIcon?: boolean rChainId: ChainId isVisible?: boolean - market: OneWayMarketTemplate + market?: OneWayMarketTemplate showLeverageIcon?: boolean type: 'collateral' | 'borrowed' module: 'borrow' | 'supply' diff --git a/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx b/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx index 43cc88d45..c5f54f8cc 100644 --- a/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx +++ b/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx @@ -5,19 +5,20 @@ import { formatNumber } from '@/ui/utils' import useStore from '@/store/useStore' import TextCaption from '@/ui/TextCaption' +import { useOneWayMarket } from '@/entities/chain' const CellTotalCollateralValue = ({ rChainId, rOwmId }: { rChainId: ChainId; rOwmId: string }) => { + const market = useOneWayMarket(rChainId, rOwmId)?.data const isAdvanceMode = useStore((state) => state.isAdvanceMode) - const owmData = useStore((state) => state.markets.owmDatasMapper[rChainId]?.[rOwmId]) const totalCollateralValue = useStore((state) => state.markets.totalCollateralValuesMapper[rChainId]?.[rOwmId]) const fetchTotalCollateralValue = useStore((state) => state.markets.fetchTotalCollateralValue) const { total = null, tooltipContent = [], error } = totalCollateralValue ?? {} useEffect(() => { - if (owmData) fetchTotalCollateralValue(rChainId, owmData) + if (market) fetchTotalCollateralValue(rChainId, market) // eslint-disable-next-line react-hooks/exhaustive-deps - }, [rChainId, owmData]) + }, [rChainId, market]) return ( <> diff --git a/apps/lend/src/store/createLoanBorrowMoreSlice.ts b/apps/lend/src/store/createLoanBorrowMoreSlice.ts index 8f7a5a9c0..eaac64ce4 100644 --- a/apps/lend/src/store/createLoanBorrowMoreSlice.ts +++ b/apps/lend/src/store/createLoanBorrowMoreSlice.ts @@ -69,7 +69,7 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor [sliceKey]: { ...DEFAULT_STATE, - fetchMaxRecv: async (activeKeyMax, api, owmData, isLeverage) => { + fetchMaxRecv: async (activeKeyMax, api, market, isLeverage) => { const { maxRecv, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api const { userCollateral, userBorrowed } = formValues @@ -80,11 +80,11 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor if (typeof updatedMaxRecv === 'undefined') { if (isLeverage) { - const resp = await loanBorrowMore.maxRecvLeverage(owmData, activeKeyMax, userCollateral, userBorrowed) + const resp = await loanBorrowMore.maxRecvLeverage(market, activeKeyMax, userCollateral, userBorrowed) updatedMaxRecv = resp.maxRecv?.maxDebt ?? '' sliceState.setStateByActiveKey('maxRecv', resp.activeKey, updatedMaxRecv) } else { - const resp = await loanBorrowMore.maxRecv(owmData, activeKeyMax, userCollateral) + const resp = await loanBorrowMore.maxRecv(market, activeKeyMax, userCollateral) updatedMaxRecv = resp.maxRecv sliceState.setStateByActiveKey('maxRecv', resp.activeKey, updatedMaxRecv) } @@ -94,12 +94,12 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor const debtError = isTooMuch(formValues.debt, updatedMaxRecv) ? 'too-much' : formValues.debtError sliceState.setStateByKey('formValues', { ...formValues, debtError }) }, - refetchMaxRecv: async (owmData, isLeverage) => { + refetchMaxRecv: async (market, isLeverage) => { const { api } = get() const { activeKeyMax, formValues, ...sliceState } = get()[sliceKey] const { userCollateral, userBorrowed } = formValues - if (!owmData || !api) return '' + if (!market || !api) return '' const { signerAddress } = api @@ -109,17 +109,17 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor sliceState.setStateByActiveKey('maxRecv', activeKeyMax, '') if (isLeverage) { - const resp = await loanBorrowMore.maxRecvLeverage(owmData, activeKeyMax, userCollateral, userBorrowed) + const resp = await loanBorrowMore.maxRecvLeverage(market, activeKeyMax, userCollateral, userBorrowed) const maxDebt = resp.maxRecv?.maxDebt ?? '' sliceState.setStateByActiveKey('maxRecv', resp.activeKey, maxDebt) return maxDebt } else { - const resp = await loanBorrowMore.maxRecv(owmData, activeKeyMax, userCollateral) + const resp = await loanBorrowMore.maxRecv(market, activeKeyMax, userCollateral) sliceState.setStateByActiveKey('maxRecv', resp.activeKey, resp.maxRecv) return resp.maxRecv } }, - fetchDetailInfo: async (activeKey, api, owmData, maxSlippage, isLeverage) => { + fetchDetailInfo: async (activeKey, api, market, maxSlippage, isLeverage) => { const { detailInfo, detailInfoLeverage, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api const { userCollateral, userBorrowed, debt } = formValues @@ -138,7 +138,7 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor const resp = await loanBorrowMore.detailInfoLeverage( activeKey, api, - owmData, + market, userCollateral, userBorrowed, debt, @@ -146,11 +146,11 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor ) sliceState.setStateByActiveKey('detailInfoLeverage', resp.activeKey, { ...resp.resp, error: resp.error }) } else { - const resp = await loanBorrowMore.detailInfo(activeKey, api, owmData, userCollateral, debt) + const resp = await loanBorrowMore.detailInfo(activeKey, api, market, userCollateral, debt) sliceState.setStateByActiveKey('detailInfo', resp.activeKey, { ...resp.resp, error: resp.error }) } }, - fetchEstGasApproval: async (activeKey, api, owmData, maxSlippage, isLeverage) => { + fetchEstGasApproval: async (activeKey, api, market, maxSlippage, isLeverage) => { const { gas } = get() const { formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api @@ -163,7 +163,7 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor await gas.fetchGasInfo(api) const resp = await loanBorrowMore.estGasApproval( activeKey, - owmData, + market, userCollateral, userBorrowed, debt, @@ -232,7 +232,7 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor }, // steps - fetchStepApprove: async (activeKey, api, owmData, formValues, maxSlippage, isLeverage) => { + fetchStepApprove: async (activeKey, api, market, formValues, maxSlippage, isLeverage) => { const { gas, wallet } = get() const sliceState = get()[sliceKey] const provider = wallet.getProvider(sliceKey) @@ -248,7 +248,7 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor const { error, ...resp } = await loanBorrowMore.approve( activeKey, provider, - owmData, + market, userCollateral, userBorrowed, isLeverage @@ -262,7 +262,7 @@ const createLoanBorrowMore = (_: SetState, get: GetState): LoanBor isApprovedCompleted: !error, stepError: error, }) - if (!error) sliceState.fetchEstGasApproval(activeKey, api, owmData, maxSlippage, isLeverage) + if (!error) sliceState.fetchEstGasApproval(activeKey, api, market, maxSlippage, isLeverage) return { ...resp, error } } }, diff --git a/apps/lend/src/store/createLoanCollateralAddSlice.ts b/apps/lend/src/store/createLoanCollateralAddSlice.ts index 363a299d3..a3db0beda 100644 --- a/apps/lend/src/store/createLoanCollateralAddSlice.ts +++ b/apps/lend/src/store/createLoanCollateralAddSlice.ts @@ -66,17 +66,17 @@ const createLoanCollateralAdd = (_: SetState, get: GetState): Loan [sliceKey]: { ...DEFAULT_STATE, - fetchDetailInfo: async (activeKey, api, owmData) => { + fetchDetailInfo: async (activeKey, api, market) => { const { formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api const { collateral } = formValues if (!signerAddress || +collateral <= 0) return - const resp = await loanCollateralAdd.detailInfo(activeKey, api, owmData, collateral) + const resp = await loanCollateralAdd.detailInfo(activeKey, api, market, collateral) sliceState.setStateByActiveKey('detailInfo', resp.activeKey, resp.resp) }, - fetchEstGasApproval: async (activeKey, api, owmData) => { + fetchEstGasApproval: async (activeKey, api, market) => { const { gas } = get() const { formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api @@ -86,7 +86,7 @@ const createLoanCollateralAdd = (_: SetState, get: GetState): Loan sliceState.setStateByKey('formEstGas', { [activeKey]: { ...DEFAULT_FORM_EST_GAS, loading: true } }) await gas.fetchGasInfo(api) - const resp = await loanCollateralAdd.estGasApproval(activeKey, owmData, collateral) + const resp = await loanCollateralAdd.estGasApproval(activeKey, market, collateral) sliceState.setStateByKey('formEstGas', { [resp.activeKey]: { estimatedGas: resp.estimatedGas, loading: false } }) // update formStatus @@ -123,7 +123,7 @@ const createLoanCollateralAdd = (_: SetState, get: GetState): Loan }, // step - fetchStepApprove: async (activeKey, api, owmData, formValues) => { + fetchStepApprove: async (activeKey, api, market, formValues) => { const { gas, wallet } = get() const sliceState = get()[sliceKey] const provider = wallet.getProvider(sliceKey) @@ -135,7 +135,7 @@ const createLoanCollateralAdd = (_: SetState, get: GetState): Loan // api calls await gas.fetchGasInfo(api) - const { error, ...resp } = await loanCollateralAdd.approve(activeKey, provider, owmData, formValues.collateral) + const { error, ...resp } = await loanCollateralAdd.approve(activeKey, provider, market, formValues.collateral) if (resp.activeKey === get()[sliceKey].activeKey) { // update formStatus @@ -145,7 +145,7 @@ const createLoanCollateralAdd = (_: SetState, get: GetState): Loan isApproved: !error, isInProgress: !error, }) - if (!error) sliceState.fetchEstGasApproval(activeKey, api, owmData) + if (!error) sliceState.fetchEstGasApproval(activeKey, api, market) return { ...resp, error } } }, diff --git a/apps/lend/src/store/createLoanCollateralRemoveSlice.ts b/apps/lend/src/store/createLoanCollateralRemoveSlice.ts index a29125ff0..3bd27d007 100644 --- a/apps/lend/src/store/createLoanCollateralRemoveSlice.ts +++ b/apps/lend/src/store/createLoanCollateralRemoveSlice.ts @@ -68,13 +68,13 @@ const createLoanCollateralRemove = (_: SetState, get: GetState): L [sliceKey]: { ...DEFAULT_STATE, - fetchMaxRemovable: async (api, owmData) => { + fetchMaxRemovable: async (api, market) => { const { formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api if (!signerAddress) return - const resp = await loanCollateralRemove.maxRemovable(owmData) + const resp = await loanCollateralRemove.maxRemovable(market) if (resp.error) sliceState.setStateByKey('formStatus', { ...formStatus, error: resp.error }) sliceState.setStateByKey('maxRemovable', resp.maxRemovable) @@ -82,17 +82,17 @@ const createLoanCollateralRemove = (_: SetState, get: GetState): L const collateralError = isTooMuch(formValues.collateral, resp.maxRemovable) ? 'too-much-max' : '' sliceState.setStateByKey('formValues', { ...formValues, collateralError }) }, - fetchDetailInfo: async (activeKey, api, owmData) => { + fetchDetailInfo: async (activeKey, api, market) => { const { formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api const { collateral, collateralError } = formValues if (!signerAddress || +collateral <= 0 || collateralError) return - const resp = await loanCollateralRemove.detailInfo(activeKey, api, owmData, collateral) + const resp = await loanCollateralRemove.detailInfo(activeKey, api, market, collateral) sliceState.setStateByActiveKey('detailInfo', resp.activeKey, resp.resp) }, - fetchEstGas: async (activeKey, api, owmData) => { + fetchEstGas: async (activeKey, api, market) => { const { gas } = get() const { formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api @@ -102,7 +102,7 @@ const createLoanCollateralRemove = (_: SetState, get: GetState): L sliceState.setStateByKey('formEstGas', { [activeKey]: { ...DEFAULT_FORM_EST_GAS, loading: true } }) await gas.fetchGasInfo(api) - const resp = await loanCollateralRemove.estGas(activeKey, owmData, collateral) + const resp = await loanCollateralRemove.estGas(activeKey, market, collateral) sliceState.setStateByKey('formEstGas', { [resp.activeKey]: { estimatedGas: resp.estimatedGas, loading: false } }) // update formStatus diff --git a/apps/lend/src/store/createLoanCreateSlice.ts b/apps/lend/src/store/createLoanCreateSlice.ts index 510660139..53103dec2 100644 --- a/apps/lend/src/store/createLoanCreateSlice.ts +++ b/apps/lend/src/store/createLoanCreateSlice.ts @@ -83,16 +83,16 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat [sliceKey]: { ...DEFAULT_STATE, - fetchMaxLeverage: async (owmData) => { + fetchMaxLeverage: async (market) => { const { formValues, ...sliceState } = get()[sliceKey] const { n } = formValues if (n === null) return - const resp = await loanCreate.maxLeverage(owmData, n) + const resp = await loanCreate.maxLeverage(market, n) sliceState.setStateByActiveKey('maxLeverage', n.toString(), resp.maxLeverage) }, - fetchMaxRecv: async (activeKey, api, owmData, isLeverage) => { + fetchMaxRecv: async (activeKey, api, market, isLeverage) => { const { maxRecv, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api const { userCollateral, userBorrowed, n } = formValues @@ -103,7 +103,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat if (n === null || !haveValues) return if (typeof updatedMaxRecv === 'undefined') { - const resp = await loanCreate.maxRecv(activeKey, owmData, userCollateral, userBorrowed, n, isLeverage) + const resp = await loanCreate.maxRecv(activeKey, market, userCollateral, userBorrowed, n, isLeverage) updatedMaxRecv = resp.maxRecv sliceState.setStateByActiveKey('maxRecv', resp.activeKey, resp.maxRecv) } @@ -114,18 +114,18 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat sliceState.setStateByKey('formValues', { ...formValues, debtError }) } }, - refetchMaxRecv: async (owmData, isLeverage) => { + refetchMaxRecv: async (market, isLeverage) => { const { activeKeyMax, formValues, ...sliceState } = get()[sliceKey] const { userCollateral, userBorrowed, n } = formValues - if (n === null || typeof owmData === 'undefined') return '' + if (n === null || typeof market === 'undefined') return '' sliceState.setStateByActiveKey('maxRecv', activeKeyMax, '') - const { maxRecv } = await loanCreate.maxRecv(activeKeyMax, owmData, userCollateral, userBorrowed, n, isLeverage) + const { maxRecv } = await loanCreate.maxRecv(activeKeyMax, market, userCollateral, userBorrowed, n, isLeverage) sliceState.setStateByActiveKey('maxRecv', activeKeyMax, maxRecv) return maxRecv }, - fetchDetailInfo: async (activeKey, api, owmData, maxSlippage, isLeverage) => { + fetchDetailInfo: async (activeKey, api, market, maxSlippage, isLeverage) => { const { detailInfo, detailInfoLeverage, formStatus, formValues, ...sliceState } = get()[sliceKey] const { userCollateral, userBorrowed, debt, n } = formValues const { haveValues, haveDebt } = _parseValue(formValues) @@ -142,7 +142,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat if (isLeverage) { const resp = await loanCreate.detailInfoLeverage( activeKey, - owmData, + market, userCollateral, userBorrowed, debt, @@ -152,12 +152,12 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat sliceState.setStateByActiveKey('detailInfoLeverage', resp.activeKey, { ...resp.resp, error: resp.error }) if (resp.error) sliceState.setStateByKey('formStatus', { ...formStatus, error: resp.error }) } else { - const resp = await loanCreate.detailInfo(activeKey, owmData, userCollateral, debt, n) + const resp = await loanCreate.detailInfo(activeKey, market, userCollateral, debt, n) sliceState.setStateByActiveKey('detailInfo', resp.activeKey, { ...resp.resp, error: resp.error }) if (resp.error) sliceState.setStateByKey('formStatus', { ...formStatus, error: resp.error }) } }, - fetchLiqRanges: async (activeKeyLiqRange, api, owmData, isLeverage) => { + fetchLiqRanges: async (activeKeyLiqRange, api, market, isLeverage) => { const { detailInfoLeverage, formValues, ...sliceState } = get()[sliceKey] const { userCollateral, userBorrowed, debt } = formValues const { totalCollateral } = detailInfoLeverage[activeKeyLiqRange]?.expectedCollateral ?? {} @@ -167,7 +167,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat const resp = await loanCreate.liqRanges( activeKeyLiqRange, - owmData, + market, totalCollateral, userCollateral, userBorrowed, @@ -177,7 +177,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat sliceState.setStateByKey('liqRanges', { [activeKeyLiqRange]: resp.liqRanges }) sliceState.setStateByKey('liqRangesMapper', { [activeKeyLiqRange]: resp.liqRangesMapper }) }, - fetchEstGasApproval: async (activeKey, api, owmData, maxSlippage, isLeverage) => { + fetchEstGasApproval: async (activeKey, api, market, maxSlippage, isLeverage) => { const { gas } = get() const { formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api @@ -190,7 +190,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat await gas.fetchGasInfo(api) const resp = await loanCreate.estGasApproval( activeKey, - owmData, + market, userCollateral, userBorrowed, debt, @@ -256,7 +256,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat }, // steps - fetchStepApprove: async (activeKey, api, owmData, maxSlippage, formValues, isLeverage) => { + fetchStepApprove: async (activeKey, api, market, maxSlippage, formValues, isLeverage) => { const { gas, wallet } = get() const { formStatus, ...sliceState } = get()[sliceKey] const provider = wallet.getProvider(sliceKey) @@ -272,7 +272,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat const { error, ...resp } = await loanCreate.approve( activeKey, provider, - owmData, + market, userCollateral, userBorrowed, isLeverage @@ -286,7 +286,7 @@ const createLoanCreate = (set: SetState, get: GetState): LoanCreat isApprovedCompleted: !error, stepError: error, }) - if (!error) sliceState.fetchEstGasApproval(activeKey, api, owmData, maxSlippage, isLeverage) + if (!error) sliceState.fetchEstGasApproval(activeKey, api, market, maxSlippage, isLeverage) return { ...resp, error } } }, diff --git a/apps/lend/src/store/createLoanRepaySlice.ts b/apps/lend/src/store/createLoanRepaySlice.ts index 465684475..7c81a0ee7 100644 --- a/apps/lend/src/store/createLoanRepaySlice.ts +++ b/apps/lend/src/store/createLoanRepaySlice.ts @@ -62,7 +62,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR [sliceKey]: { ...DEFAULT_STATE, - fetchDetailInfo: async (activeKey, api, owmData, maxSlippage, userState) => { + fetchDetailInfo: async (activeKey, api, market, maxSlippage, userState) => { const { detailInfo, detailInfoLeverage, formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api const { isFullRepay, userBorrowed, userCollateral, stateCollateral } = formValues @@ -83,7 +83,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR const resp = await loanRepay.detailInfoLeverage( activeKey, api, - owmData, + market, stateCollateral, userCollateral, userBorrowed, @@ -98,7 +98,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR respError = resp.error } } else { - const resp = await loanRepay.detailInfo(activeKey, api, owmData, userBorrowed, isFullRepay, userState.debt) + const resp = await loanRepay.detailInfo(activeKey, api, market, userBorrowed, isFullRepay, userState.debt) sliceState.setStateByActiveKey('detailInfo', resp.activeKey, { ...resp.resp, error: resp.error }) respError = resp.error } @@ -108,7 +108,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR sliceState.setStateByKey('formStatus', { ...formStatus, error: respError }) } }, - fetchEstGasApproval: async (activeKey, api, owmData, maxSlippage) => { + fetchEstGasApproval: async (activeKey, api, market, maxSlippage) => { const { gas } = get() const { formStatus, formValues, ...sliceState } = get()[sliceKey] const { signerAddress } = api @@ -122,7 +122,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR await gas.fetchGasInfo(api) const resp = await loanRepay.estGasApproval( activeKey, - owmData, + market, stateCollateral, userCollateral, userBorrowed, @@ -190,7 +190,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR }, // steps - fetchStepApprove: async (activeKey, api, owmData, formValues, maxSlippage) => { + fetchStepApprove: async (activeKey, api, market, formValues, maxSlippage) => { const { gas, wallet } = get() const sliceState = get()[sliceKey] const provider = wallet.getProvider(sliceKey) @@ -207,7 +207,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR const { error, ...resp } = await loanRepay.approve( activeKey, provider, - owmData, + market, stateCollateral, userCollateral, userBorrowed, @@ -223,7 +223,7 @@ const createLoanRepaySlice = (set: SetState, get: GetState): LoanR isApprovedCompleted: !error, stepError: error, }) - if (!error) sliceState.fetchEstGasApproval(activeKey, api, owmData, maxSlippage) + if (!error) sliceState.fetchEstGasApproval(activeKey, api, market, maxSlippage) return { ...resp, error } } }, diff --git a/apps/lend/src/store/createLoanSelfLiquidationSlice.ts b/apps/lend/src/store/createLoanSelfLiquidationSlice.ts index 0c34abddf..5a4f2f805 100644 --- a/apps/lend/src/store/createLoanSelfLiquidationSlice.ts +++ b/apps/lend/src/store/createLoanSelfLiquidationSlice.ts @@ -105,7 +105,7 @@ const createLoanSelfLiquidationSlice = (set: SetState, get: GetState { + fetchEstGasApproval: async (api, market, maxSlippage) => { const { gas } = get() const { formStatus, ...sliceState } = get()[sliceKey] const { signerAddress } = api @@ -115,7 +115,7 @@ const createLoanSelfLiquidationSlice = (set: SetState, get: GetState, get: GetState { + fetchStepApprove: async (api, market, maxSlippage) => { const { gas, wallet } = get() const { formStatus, ...sliceState } = get()[sliceKey] const provider = wallet.getProvider(sliceKey) @@ -139,7 +139,7 @@ const createLoanSelfLiquidationSlice = (set: SetState, get: GetState, get: GetState, get: GetState): Mark } return results.results }, - sortByUserData: (api, sortKey, owmData) => { + sortByUserData: (api, sortKey, market) => { const { user } = get() - const userActiveKey = helpers.getUserActiveKey(api, owmData) + const userActiveKey = helpers.getUserActiveKey(api, market) if (sortKey === 'myHealth') { return Number(user.loansHealthsMapper[userActiveKey]?.healthNotFull ?? 0) @@ -168,7 +168,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark } else if (sortKey === 'totalCollateralValue') { return orderBy(markets, (market) => +(totalCollateralValuesMapper[market.id]?.total ?? '0'), [order]) } else if (sortKey.startsWith('my')) { - return orderBy(markets, (owmData) => sliceState.sortByUserData(api, sortKey, owmData), [order]) + return orderBy(markets, (market) => sliceState.sortByUserData(api, sortKey, market), [order]) } return markets diff --git a/apps/lend/src/store/createMarketsSlice.ts b/apps/lend/src/store/createMarketsSlice.ts index 67edd2277..e9b674241 100644 --- a/apps/lend/src/store/createMarketsSlice.ts +++ b/apps/lend/src/store/createMarketsSlice.ts @@ -29,7 +29,7 @@ const sliceKey = 'markets' export type MarketsSlice = { [sliceKey]: SliceState & { // grouped - fetchDatas(key: string, api: Api, owmDatas: OneWayMarketTemplate[], shouldRefetch?: boolean): Promise + fetchDatas(key: string, api: Api, markets: OneWayMarketTemplate[], shouldRefetch?: boolean): Promise // individual fetchAll(api: Api, OneWayMarketTemplate: OneWayMarketTemplate, shouldRefetch?: boolean): Promise @@ -63,7 +63,7 @@ const DEFAULT_STATE: SliceState = { const createMarketsSlice = (set: SetState, get: GetState): MarketsSlice => ({ [sliceKey]: { ...DEFAULT_STATE, - fetchDatas: async (key, api, owmDatas, shouldRefetch) => { + fetchDatas: async (key, api, markets, shouldRefetch) => { const { ...sliceState } = get()[sliceKey] const { chainId } = api @@ -85,14 +85,14 @@ const createMarketsSlice = (set: SetState, get: GetState): Markets // stored const k = key as keyof typeof fnMapper const storedMapper = get()[sliceKey][k][chainId] ?? {} - const missing = owmDatas.filter(({ id }) => typeof storedMapper[id] === 'undefined') + const missing = markets.filter(({ id }) => typeof storedMapper[id] === 'undefined') if (missing.length === 0 && !shouldRefetch) return const resp = k === 'totalCollateralValuesMapper' - ? await fnMapper[k](api, shouldRefetch ? owmDatas : missing) - : await fnMapper[k](shouldRefetch ? owmDatas : missing) + ? await fnMapper[k](api, shouldRefetch ? markets : missing) + : await fnMapper[k](shouldRefetch ? markets : missing) const cMapper = { ...storedMapper } Object.keys(resp).forEach((owmId) => { cMapper[owmId] = resp[owmId] diff --git a/apps/lend/src/store/createUserSlice.ts b/apps/lend/src/store/createUserSlice.ts index 80aed2cc5..6adbceda0 100644 --- a/apps/lend/src/store/createUserSlice.ts +++ b/apps/lend/src/store/createUserSlice.ts @@ -30,11 +30,11 @@ export type UserSlice = { fetchUsersLoansExists(api: Api, markets: OneWayMarketTemplate[], shouldRefetch?: boolean): Promise // individual - fetchUserLoanExists(api: Api, owmData: OneWayMarketTemplate, shouldRefetch?: boolean): Promise - fetchUserLoanDetails(api: Api, owmData: OneWayMarketTemplate, shouldRefetch?: boolean): Promise - fetchUserMarketBalances(api: Api, owmData: OneWayMarketTemplate, shouldRefetch?: boolean): Promise - fetchUserLoanState(api: Api, owmData: OneWayMarketTemplate, shouldRefetch?: boolean): Promise - fetchAll(api: Api, owmData: OneWayMarketTemplate, shouldRefetch?: boolean): Promise<{ userLoanDetailsResp: UserLoanDetails | null; userLoanBalancesResp: UserMarketBalances; }> + fetchUserLoanExists(api: Api, market: OneWayMarketTemplate, shouldRefetch?: boolean): Promise + fetchUserLoanDetails(api: Api, market: OneWayMarketTemplate, shouldRefetch?: boolean): Promise + fetchUserMarketBalances(api: Api, market: OneWayMarketTemplate, shouldRefetch?: boolean): Promise + fetchUserLoanState(api: Api, market: OneWayMarketTemplate, shouldRefetch?: boolean): Promise + fetchAll(api: Api, market: OneWayMarketTemplate, shouldRefetch?: boolean): Promise<{ userLoanDetailsResp: UserLoanDetails | null; userLoanBalancesResp: UserMarketBalances; }> // helpers setStateByActiveKey(key: StateKey, activeKey: string, value: T): void @@ -69,8 +69,8 @@ const createUserSlice = (set: SetState, get: GetState): UserSlice // stored const k = key as keyof typeof fnMapper const storedMapper = get()[sliceKey][k] ?? {} - const missing = markets.filter((owmData) => { - const userActiveKey = helpers.getUserActiveKey(api, owmData) + const missing = markets.filter((market) => { + const userActiveKey = helpers.getUserActiveKey(api, market) return typeof storedMapper[userActiveKey] === 'undefined' }) @@ -99,8 +99,8 @@ const createUserSlice = (set: SetState, get: GetState): UserSlice const loansExistsMapper = get()[sliceKey].loansExistsMapper ?? {} const storedMapper = get()[sliceKey][k] ?? {} - const missing = markets.filter((owmData) => { - const userActiveKey = helpers.getUserActiveKey(api, owmData) + const missing = markets.filter((market) => { + const userActiveKey = helpers.getUserActiveKey(api, market) const { loanExists } = loansExistsMapper[userActiveKey] ?? {} return loanExists && typeof storedMapper[userActiveKey] === 'undefined' }) @@ -111,8 +111,8 @@ const createUserSlice = (set: SetState, get: GetState): UserSlice // get only markets with loans if (shouldRefetch) { - parsedOwmDatas = markets.filter((owmData) => { - const userActiveKey = helpers.getUserActiveKey(api, owmData) + parsedOwmDatas = markets.filter((market) => { + const userActiveKey = helpers.getUserActiveKey(api, market) return loansExistsMapper[userActiveKey]?.loanExists }) } @@ -130,8 +130,8 @@ const createUserSlice = (set: SetState, get: GetState): UserSlice fetchUsersLoansExists: async (api, markets, shouldRefetch) => { const storedLoanExistsMapper = get()[sliceKey].loansExistsMapper - const missing = markets.filter((owmData) => { - const userActiveKey = helpers.getUserActiveKey(api, owmData) + const missing = markets.filter((market) => { + const userActiveKey = helpers.getUserActiveKey(api, market) return typeof storedLoanExistsMapper[userActiveKey] === 'undefined' }) @@ -147,34 +147,34 @@ const createUserSlice = (set: SetState, get: GetState): UserSlice }, // individual - fetchUserLoanExists: async (api, owmData, shouldRefetch) => { - await get()[sliceKey].fetchUsersLoansExists(api, [owmData], shouldRefetch) - const userActiveKey = helpers.getUserActiveKey(api, owmData) + fetchUserLoanExists: async (api, market, shouldRefetch) => { + await get()[sliceKey].fetchUsersLoansExists(api, [market], shouldRefetch) + const userActiveKey = helpers.getUserActiveKey(api, market) return get()[sliceKey].loansExistsMapper[userActiveKey] }, - fetchUserLoanDetails: async (api, owmData, shouldRefetch) => { + fetchUserLoanDetails: async (api, market, shouldRefetch) => { const key = 'loansDetailsMapper' - await get()[sliceKey].fetchDatas(key, api, [owmData], shouldRefetch) - const userActiveKey = helpers.getUserActiveKey(api, owmData) + await get()[sliceKey].fetchDatas(key, api, [market], shouldRefetch) + const userActiveKey = helpers.getUserActiveKey(api, market) return get()[sliceKey][key][userActiveKey] }, - fetchUserLoanState: async (api, owmData, shouldRefetch) => { + fetchUserLoanState: async (api, market, shouldRefetch) => { const key = 'loansStatesMapper' - await get()[sliceKey].fetchLoanDatas(key, api, [owmData], shouldRefetch) - const userActiveKey = helpers.getUserActiveKey(api, owmData) + await get()[sliceKey].fetchLoanDatas(key, api, [market], shouldRefetch) + const userActiveKey = helpers.getUserActiveKey(api, market) return get()[sliceKey][key][userActiveKey] }, - fetchUserMarketBalances: async (api, owmData, shouldRefetch) => { + fetchUserMarketBalances: async (api, market, shouldRefetch) => { const key = 'marketsBalancesMapper' - await get()[sliceKey].fetchDatas(key, api, [owmData], shouldRefetch) - const userActiveKey = helpers.getUserActiveKey(api, owmData) + await get()[sliceKey].fetchDatas(key, api, [market], shouldRefetch) + const userActiveKey = helpers.getUserActiveKey(api, market) return get()[sliceKey][key][userActiveKey] }, - fetchAll: async (api, owmData, shouldRefetch) => { - const userActiveKey = helpers.getUserActiveKey(api, owmData) + fetchAll: async (api, market, shouldRefetch) => { + const userActiveKey = helpers.getUserActiveKey(api, market) const keys = ['loansDetailsMapper', 'marketsBalancesMapper'] as const - await Promise.all(keys.map((key) => get()[sliceKey].fetchLoanDatas(key, api, [owmData], shouldRefetch))) + await Promise.all(keys.map((key) => get()[sliceKey].fetchLoanDatas(key, api, [market], shouldRefetch))) return { userLoanDetailsResp: get()[sliceKey].loansDetailsMapper[userActiveKey], userLoanBalancesResp: get()[sliceKey].marketsBalancesMapper[userActiveKey], From 2038e574ed72505d7cce919d1de03fab7024d713 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 8 Oct 2024 14:53:14 +0200 Subject: [PATCH 024/137] refactor: get rid of `assertTokenParams` --- apps/lend/src/entities/token/api/token-rates.ts | 7 ++++--- apps/lend/src/entities/token/lib/validation.ts | 7 ++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/lend/src/entities/token/api/token-rates.ts b/apps/lend/src/entities/token/api/token-rates.ts index 85c81d2ba..4e9a5412b 100644 --- a/apps/lend/src/entities/token/api/token-rates.ts +++ b/apps/lend/src/entities/token/api/token-rates.ts @@ -1,12 +1,13 @@ import { QueryFunction } from '@tanstack/react-query' import { logQuery } from '@/shared/lib/logging' -import { assertTokenParams } from '@/entities/token/lib/validation' +import { assertTokenValidity } from '@/entities/token/lib/validation' import useStore from '@/store/useStore' import { TokenQueryKeyType } from '@/entities/token' export const queryTokenUsdRate: QueryFunction> = async ({ queryKey }) => { logQuery(queryKey) - const { tokenAddress } = assertTokenParams(queryKey) + const [, chainId, , tokenAddress] = queryKey + const _valid = assertTokenValidity({ chainId, tokenAddress }) const { api } = useStore.getState() - return await api!.getUsdRate(tokenAddress) + return await api!.getUsdRate(_valid.tokenAddress) } diff --git a/apps/lend/src/entities/token/lib/validation.ts b/apps/lend/src/entities/token/lib/validation.ts index c6dd43ea7..5d2101589 100644 --- a/apps/lend/src/entities/token/lib/validation.ts +++ b/apps/lend/src/entities/token/lib/validation.ts @@ -1,5 +1,5 @@ -import { CombinedTokenParams, TokenQueryKeyType } from '@/entities/token' -import { assertValidity, checkValidity } from '@/shared/lib/validation' +import { CombinedTokenParams } from '@/entities/token' +import { assertValidity, checkValidity, ValidatedData } from '@/shared/lib/validation' import { tokenValidationSuite } from '@/entities/token/model/validation' export const assertTokenValidity = (data: T, fields?: Extract[]) => @@ -7,6 +7,3 @@ export const assertTokenValidity = (data: T, fiel export const checkTokenValidity = (data: T, fields?: Extract[]) => checkValidity(tokenValidationSuite, data, fields) - -export const assertTokenParams = ([, chainId, , tokenAddress]: T) => - assertTokenValidity({ chainId, tokenAddress }) From 4b69aae9eff2531738c5206dd0b8608064777b69 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 8 Oct 2024 15:04:25 +0200 Subject: [PATCH 025/137] refactor: create generic `createGetQueryData` --- .../lend/src/entities/token/lib/query-data.ts | 7 +++---- .../src/shared/lib/queries/factory.ts | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/apps/lend/src/entities/token/lib/query-data.ts b/apps/lend/src/entities/token/lib/query-data.ts index cb2fcc913..09b21f8a0 100644 --- a/apps/lend/src/entities/token/lib/query-data.ts +++ b/apps/lend/src/entities/token/lib/query-data.ts @@ -1,6 +1,5 @@ import { tokenKeys } from '../model' -import { queryClient } from '@/shared/api/query-client' -import { TokenKey } from '@/entities/token' +import { createGetQueryData } from '@/shared/lib/queries' -export const getTokenQueryData = (key: TokenKey, keyData: Parameters[0]) => - queryClient.getQueryData(tokenKeys[key](keyData)) + +export const getTokenQueryData = createGetQueryData(tokenKeys) diff --git a/packages/curve-lib/src/shared/lib/queries/factory.ts b/packages/curve-lib/src/shared/lib/queries/factory.ts index 4960990f1..0f186fbe7 100644 --- a/packages/curve-lib/src/shared/lib/queries/factory.ts +++ b/packages/curve-lib/src/shared/lib/queries/factory.ts @@ -1,11 +1,16 @@ -import { useQuery, QueryKey } from '@tanstack/react-query' import type { UseQueryOptions } from '@tanstack/react-query' +import { QueryKey, useQuery } from '@tanstack/react-query' +import { queryClient } from '@/shared/api/query-client' -export function createQueryHook( +export const createQueryHook = ( getQueryOptions: (params: TParams, condition?: boolean) => UseQueryOptions, -) { - return (params: TParams, condition?: boolean) => { - const options = getQueryOptions(params, condition) - return useQuery(options) - } +) => (params: TParams, condition?: boolean) => { + const options = getQueryOptions(params, condition) + return useQuery(options) } + +export const createGetQueryData = any>>( + keys: KeysObject +) => + (key: Key, keyData: Parameters[0]) => + queryClient.getQueryData(keys[key](keyData)) From 3a501d81519007281e35729ecc916db797555552 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 11 Oct 2024 17:37:31 +0200 Subject: [PATCH 026/137] fix: load markets --- .../src/components/PageMarketList/index.tsx | 6 +++-- .../src/entities/chain/api/markets-api.ts | 4 ++-- apps/lend/src/entities/chain/lib/chain-tvl.ts | 4 ++-- .../lend/src/entities/chain/lib/data-hooks.ts | 3 ++- .../lend/src/entities/chain/lib/query-data.ts | 2 +- .../src/entities/chain/lib/query-hooks.ts | 2 +- .../lend/src/entities/chain/lib/validation.ts | 4 ++-- .../src/entities/chain/model/query-keys.ts | 2 +- .../src/entities/chain/model/query-options.ts | 7 +++--- .../src/entities/chain/model/validation.ts | 6 +++-- apps/lend/src/store/createAppSlice.ts | 1 + apps/lend/src/store/createMarketListSlice.ts | 23 +++++++------------ .../src/shared/lib/queries/factory.ts | 2 +- 13 files changed, 33 insertions(+), 33 deletions(-) diff --git a/apps/lend/src/components/PageMarketList/index.tsx b/apps/lend/src/components/PageMarketList/index.tsx index 3208932da..e5637c632 100644 --- a/apps/lend/src/components/PageMarketList/index.tsx +++ b/apps/lend/src/components/PageMarketList/index.tsx @@ -13,11 +13,13 @@ import MarketListNoResult from '@/components/PageMarketList/components/MarketLis import MarketListItemContent from '@/components/PageMarketList/components/MarketListItemContent' import TableSettings from '@/components/PageMarketList/components/TableSettings/TableSettings' import usePageVisibleInterval from '@/ui/hooks/usePageVisibleInterval' +import { useOneWayMarketMapping } from '@/entities/chain' const MarketList = (pageProps: PageMarketList) => { const { rChainId, isLoaded, searchParams, api, updatePath } = pageProps const activeKey = _getActiveKey(rChainId, searchParams) + const {data: marketMapping} = useOneWayMarketMapping(rChainId) const prevActiveKey = useStore((state) => state.marketList.activeKey) const initialLoaded = useStore((state) => state.marketList.initialLoaded) const formStatus = useStore((state) => state.marketList.formStatus) @@ -67,9 +69,9 @@ const MarketList = (pageProps: PageMarketList) => { const updateFormValues = useCallback( (shouldRefetch?: boolean) => { - setFormValues(rChainId, isLoaded ? api : null, shouldRefetch) + setFormValues(rChainId, isLoaded ? api : null, marketMapping, shouldRefetch) }, - [isLoaded, rChainId, api, setFormValues] + [setFormValues, rChainId, isLoaded, api, marketMapping] ) useEffect(() => { diff --git a/apps/lend/src/entities/chain/api/markets-api.ts b/apps/lend/src/entities/chain/api/markets-api.ts index dc4b9d4fe..3cf84a567 100644 --- a/apps/lend/src/entities/chain/api/markets-api.ts +++ b/apps/lend/src/entities/chain/api/markets-api.ts @@ -1,8 +1,8 @@ import { QueryFunction } from '@tanstack/react-query' import { logQuery } from '@/shared/lib/logging' -import { assertChainValidity } from '@/entities/chain' +import { assertChainValidity } from '../lib/validation' import useStore from '@/store/useStore' -import { ChainQueryKeyType } from '@/entities/chain/model' +import { ChainQueryKeyType } from '../model' export const queryOneWayMarketNames: QueryFunction< string[], diff --git a/apps/lend/src/entities/chain/lib/chain-tvl.ts b/apps/lend/src/entities/chain/lib/chain-tvl.ts index c08994b43..60617198e 100644 --- a/apps/lend/src/entities/chain/lib/chain-tvl.ts +++ b/apps/lend/src/entities/chain/lib/chain-tvl.ts @@ -2,8 +2,8 @@ import { FETCHING, PartialQueryResult, READY } from '@/shared/lib/queries' import useStore from '@/store/useStore' import { useMemo } from 'react' import { useTokenUsdRates } from '@/entities/token/lib' -import { calculateChainTvl } from '@/entities/chain/model' -import { useOneWayMarketMapping } from '@/entities/chain' +import { calculateChainTvl } from '../model' +import { useOneWayMarketMapping } from './data-hooks' export const useTvl = (chainId: ChainId): PartialQueryResult => { const marketMapping = useOneWayMarketMapping(chainId).data diff --git a/apps/lend/src/entities/chain/lib/data-hooks.ts b/apps/lend/src/entities/chain/lib/data-hooks.ts index c0312e17a..e1d165d08 100644 --- a/apps/lend/src/entities/chain/lib/data-hooks.ts +++ b/apps/lend/src/entities/chain/lib/data-hooks.ts @@ -1,7 +1,8 @@ -import { useApi, useOneWayMarketNames } from '@/entities/chain' +import { useOneWayMarketNames } from './query-hooks' import networks from '@/networks' import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' import { useMemo } from 'react' +import { useApi } from './chain-info' export const useOneWayMarketMapping = (chainId: ChainId) => { const { data: marketNames, ...rest } = useOneWayMarketNames({ chainId }) diff --git a/apps/lend/src/entities/chain/lib/query-data.ts b/apps/lend/src/entities/chain/lib/query-data.ts index ce2f95577..962f86ab4 100644 --- a/apps/lend/src/entities/chain/lib/query-data.ts +++ b/apps/lend/src/entities/chain/lib/query-data.ts @@ -1,5 +1,5 @@ import { queryClient } from '@/shared/api/query-client' -import { ChainKey, chainKeys } from '@/entities/chain/model' +import { ChainKey, chainKeys } from '../model/query-keys' export const getChainQueryData = (key: ChainKey, keyData: Parameters[0]) => queryClient.getQueryData(chainKeys[key](keyData)) diff --git a/apps/lend/src/entities/chain/lib/query-hooks.ts b/apps/lend/src/entities/chain/lib/query-hooks.ts index 6896505fb..fdd746611 100644 --- a/apps/lend/src/entities/chain/lib/query-hooks.ts +++ b/apps/lend/src/entities/chain/lib/query-hooks.ts @@ -1,4 +1,4 @@ import { createQueryHook } from '@/shared/lib/queries' -import { getOneWayMarketNames } from '@/entities/chain/model' +import { getOneWayMarketNames } from '../model/query-options' export const useOneWayMarketNames = createQueryHook(getOneWayMarketNames); diff --git a/apps/lend/src/entities/chain/lib/validation.ts b/apps/lend/src/entities/chain/lib/validation.ts index 4dcd9f98a..b6611094e 100644 --- a/apps/lend/src/entities/chain/lib/validation.ts +++ b/apps/lend/src/entities/chain/lib/validation.ts @@ -1,5 +1,5 @@ -import { CombinedChainParams } from '@/entities/chain' -import { chainValidationSuite } from '@/entities/chain/model' +import { CombinedChainParams } from '../types' +import { chainValidationSuite } from '../model/validation' import { assertValidity, checkValidity } from '@/shared/lib/validation' export const assertChainValidity = (data: T, fields?: Extract[]) => diff --git a/apps/lend/src/entities/chain/model/query-keys.ts b/apps/lend/src/entities/chain/model/query-keys.ts index c7308b57c..f1a1a5651 100644 --- a/apps/lend/src/entities/chain/model/query-keys.ts +++ b/apps/lend/src/entities/chain/model/query-keys.ts @@ -1,4 +1,4 @@ -import type { ChainQueryParams } from '@/entities/chain/types' +import type { ChainQueryParams } from '../types' import type { ExtractQueryKeyType } from '@/shared/types/api' export const chainKeys = { diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts index 4dc3b6684..dcbf960d9 100644 --- a/apps/lend/src/entities/chain/model/query-options.ts +++ b/apps/lend/src/entities/chain/model/query-options.ts @@ -1,8 +1,9 @@ import { queryOptions } from '@tanstack/react-query' import { REFRESH_INTERVAL } from '@/constants' -import { ChainQueryParams, checkChainValidity } from '@/entities/chain' -import { queryOneWayMarketNames } from '@/entities/chain/api/markets-api' -import { chainKeys } from '@/entities/chain/model/query-keys' +import { checkChainValidity } from '../lib/validation' +import { queryOneWayMarketNames } from '../api/markets-api' +import { chainKeys } from './query-keys' +import { ChainQueryParams } from '../types' export const getOneWayMarketNames = (params: ChainQueryParams) => queryOptions({ diff --git a/apps/lend/src/entities/chain/model/validation.ts b/apps/lend/src/entities/chain/model/validation.ts index 20c396d65..f3065168b 100644 --- a/apps/lend/src/entities/chain/model/validation.ts +++ b/apps/lend/src/entities/chain/model/validation.ts @@ -1,4 +1,4 @@ -import type { ChainQueryParams } from '@/entities/chain/types' +import type { ChainQueryParams } from '../types' import { createValidationSuite } from '@/shared/lib/validation' import { enforce, group, test } from 'vest' import useStore from '@/store/useStore' @@ -7,7 +7,9 @@ export const chainValidationGroup = ({ chainId }: ChainQueryParams) => group('chainValidation', () => { test('chainId', () => { enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId() - enforce(useStore.getState().api?.chainId).message('Chain ID should be loaded').equals(chainId) + const { api, isLoadingApi } = useStore.getState() + enforce(isLoadingApi).message('API should be loaded').equals(chainId) + enforce(api?.chainId).message('Chain ID should be loaded').equals(chainId) }) }) diff --git a/apps/lend/src/store/createAppSlice.ts b/apps/lend/src/store/createAppSlice.ts index 4b2707dcb..a7c2cab40 100644 --- a/apps/lend/src/store/createAppSlice.ts +++ b/apps/lend/src/store/createAppSlice.ts @@ -105,6 +105,7 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => state.user.resetState() } + await api.oneWayfactory.fetchMarkets(); // update network settings from api state.updateGlobalStoreByKey('api', api) state.updateGlobalStoreByKey('isLoadingCurve', false) diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index 5aad0b4e9..670bc169e 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -30,7 +30,6 @@ type StateKey = keyof typeof DEFAULT_STATE type SliceState = { initialLoaded: boolean activeKey: string - marketListMapper: { [chainId: string]: MarketListMapper } tableRowsSettings: { [tokenAddress: string]: TableSettings } formStatus: FormStatus searchParams: SearchParams @@ -51,9 +50,9 @@ export type MarketListSlice = { filterLeverageMarkets(markets: OneWayMarketTemplate[]): OneWayMarketTemplate[] sortByUserData(api: Api, sortKey: TitleKey, market: OneWayMarketTemplate): number sortFn(api: Api, sortKey: TitleKey, order: Order, markets: OneWayMarketTemplate[]): OneWayMarketTemplate[] - sortByCollateral(api: Api, markets: OneWayMarketTemplate[]): { result: MarketListItemResult[], tableRowsSettings: { [tokenAddress:string]: TableSettings } } + sortByCollateral(api: Api, markets: OneWayMarketTemplate[], marketMapping: IDict): { result: MarketListItemResult[], tableRowsSettings: { [tokenAddress:string]: TableSettings } } sortByAll(api: Api, markets: OneWayMarketTemplate[], sortBy: TitleKey, sortByOrder: Order): { result: MarketListItemResult[], tableRowsSettings: { [tokenAddress:string]: TableSettings } } - setFormValues(rChainId: ChainId, api: Api | null, shouldRefetch?: boolean): Promise + setFormValues(rChainId: ChainId, api: Api | null, marketMapping?: IDict, shouldRefetch?: boolean): Promise // helpers setStateByActiveKey(key: StateKey, activeKey: string, value: T): void @@ -66,7 +65,6 @@ export type MarketListSlice = { const DEFAULT_STATE: SliceState = { initialLoaded: false, activeKey: '', - marketListMapper: {}, tableRowsSettings: {}, formStatus: DEFAULT_FORM_STATUS, searchParams: { @@ -190,11 +188,9 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark filterLeverageMarkets: (markets) => { return markets.filter((m) => m.leverage.hasLeverage()) }, - sortByCollateral: (api, markets) => { + sortByCollateral: (api, markets, marketMapping) => { let { searchParams, tableRowsSettings, ...sliceState } = get()[sliceKey] - const { chainId } = api - const marketMapping = getChainQueryData>('markets', { chainId })! const parsedTableRowsSettings: { [tokenAddress: string]: TableSettings } = {} const { marketListMapper } = _getMarketList(markets) @@ -222,7 +218,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark return { result: marketsResult, tableRowsSettings: parsedTableRowsSettings } }, sortByAll: (api, markets, sortBy, sortByOrder) => { - const { marketListMapper, searchParams, ...sliceState } = get()[sliceKey] + const { searchParams, ...sliceState } = get()[sliceKey] const marketResult = sliceState.sortFn(api, sortBy, sortByOrder, markets).map((d) => d.id) @@ -231,18 +227,16 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark tableRowsSettings: { all: { isNotSortable: false, sortBy, sortByOrder } }, } }, - setFormValues: async (rChainId, api, shouldRefetch) => { + setFormValues: async (rChainId, api, marketMapping, shouldRefetch) => { const { markets, user } = get() let { activeKey: prevActiveKey, initialLoaded, - marketListMapper, searchParams, tableRowsSettings, result, ...sliceState } = get()[sliceKey] - const storedMarketListMapper = marketListMapper[rChainId] // update activeKey, formStatus const activeKey = _getActiveKey(rChainId, searchParams) @@ -274,14 +268,13 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark // allow UI to update paint await sleep(100) - const marketMapping = getChainQueryData>('markets', { chainId: rChainId })! - if (!api || !marketMapping || !storedMarketListMapper) return + if (!api || !marketMapping) return const { signerAddress } = api const { filterKey, filterTypeKey, hideSmallMarkets, searchText, sortBy, sortByOrder } = searchParams // get market list for table - let cMarkets = _getOwmDatasFromMarketList(storedMarketListMapper, marketMapping) + let cMarkets = Object.values(marketMapping) if (signerAddress) { if (filterTypeKey === 'borrow') { @@ -352,7 +345,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const sorted = sortBy ? sliceState.sortByAll(api, cMarkets, sortBy, sortByOrder) - : sliceState.sortByCollateral(api, cMarkets) + : sliceState.sortByCollateral(api, cMarkets, marketMapping) // set result sliceState.setStateByKeys({ diff --git a/packages/curve-lib/src/shared/lib/queries/factory.ts b/packages/curve-lib/src/shared/lib/queries/factory.ts index 0f186fbe7..6dbceda88 100644 --- a/packages/curve-lib/src/shared/lib/queries/factory.ts +++ b/packages/curve-lib/src/shared/lib/queries/factory.ts @@ -9,7 +9,7 @@ export const createQueryHook = ( return useQuery(options) } -export const createGetQueryData = any>>( +export const createGetQueryData = any[]>>( keys: KeysObject ) => (key: Key, keyData: Parameters[0]) => From b6327360c6d88e7f7b715977011f48ce10e28470 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 14 Oct 2024 12:48:38 +0200 Subject: [PATCH 027/137] Lint --- packages/curve-lib/src/shared/api/cache.ts | 2 +- packages/curve-lib/src/shared/lib/queries/combine.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/curve-lib/src/shared/api/cache.ts b/packages/curve-lib/src/shared/api/cache.ts index 4f646fa1b..5c232d599 100644 --- a/packages/curve-lib/src/shared/api/cache.ts +++ b/packages/curve-lib/src/shared/api/cache.ts @@ -1,5 +1,5 @@ -import { logError, logMutation, logSuccess } from '@/shared/lib/logging' import { type Mutation, MutationCache, QueryCache } from '@tanstack/react-query' +import { logError, logMutation, logSuccess } from '@/shared/lib/logging' export const queryCache = new QueryCache({ onError: (error: Error, query) => { diff --git a/packages/curve-lib/src/shared/lib/queries/combine.ts b/packages/curve-lib/src/shared/lib/queries/combine.ts index 59e39c1fa..52b277c22 100644 --- a/packages/curve-lib/src/shared/lib/queries/combine.ts +++ b/packages/curve-lib/src/shared/lib/queries/combine.ts @@ -1,4 +1,5 @@ import { useQueries, UseQueryResult } from '@tanstack/react-query' +import { useCallback } from 'react' import { CombinedQueriesResult, CombinedQueryMappingResult, @@ -6,7 +7,6 @@ import { QueryOptionsArray, QueryResultsArray, } from './types' -import { useCallback } from 'react' /** Combines the metadata of multiple queries into a single object. */ const combineQueriesMeta = ( From 4c8954db1eea31561ef8aac03c90e5a1b68bcf51 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 14 Oct 2024 13:08:04 +0200 Subject: [PATCH 028/137] self-review --- .../components/DetailsUserLoan.tsx | 2 +- .../lend/src/entities/chain/lib/query-data.ts | 5 - apps/lend/src/store/createAppSlice.ts | 3 +- apps/lend/src/store/createMarketListSlice.ts | 1 - apps/loan/src/locales/en/messages.po | 700 ++---- apps/loan/src/locales/pseudo/messages.po | 688 ++---- apps/loan/src/locales/zh-Hans/messages.po | 688 ++---- apps/loan/src/locales/zh-Hant/messages.po | 688 ++---- apps/main/src/locales/en/messages.po | 1939 ++++++----------- apps/main/src/locales/pseudo/messages.po | 1892 ++++++---------- apps/main/src/locales/zh-Hans/messages.po | 1916 ++++++---------- apps/main/src/locales/zh-Hant/messages.po | 1918 ++++++---------- .../src/shared/lib/queries/factory.ts | 2 +- 13 files changed, 3230 insertions(+), 7212 deletions(-) delete mode 100644 apps/lend/src/entities/chain/lib/query-data.ts diff --git a/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx b/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx index cf82f6721..5cc93d628 100644 --- a/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx +++ b/apps/lend/src/components/DetailsUser/components/DetailsUserLoan.tsx @@ -83,7 +83,7 @@ const DetailsUserLoan = (pageProps: PageContentProps) => { - + {/* stats */} diff --git a/apps/lend/src/entities/chain/lib/query-data.ts b/apps/lend/src/entities/chain/lib/query-data.ts deleted file mode 100644 index 962f86ab4..000000000 --- a/apps/lend/src/entities/chain/lib/query-data.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { queryClient } from '@/shared/api/query-client' -import { ChainKey, chainKeys } from '../model/query-keys' - -export const getChainQueryData = (key: ChainKey, keyData: Parameters[0]) => - queryClient.getQueryData(chainKeys[key](keyData)) diff --git a/apps/lend/src/store/createAppSlice.ts b/apps/lend/src/store/createAppSlice.ts index a7c2cab40..ae64353b9 100644 --- a/apps/lend/src/store/createAppSlice.ts +++ b/apps/lend/src/store/createAppSlice.ts @@ -105,10 +105,11 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => state.user.resetState() } - await api.oneWayfactory.fetchMarkets(); // update network settings from api state.updateGlobalStoreByKey('api', api) state.updateGlobalStoreByKey('isLoadingCurve', false) + + await api.oneWayfactory.fetchMarkets(); state.updateGlobalStoreByKey('isLoadingApi', false) if (!prevApi || isNetworkSwitched) { diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index 670bc169e..a5071f12f 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -22,7 +22,6 @@ import networks from '@/networks' import { getTokenQueryData } from '@/entities/token' import { IDict } from '@curvefi/lending-api/lib/interfaces' import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' -import { getChainQueryData } from '@/entities/chain/lib/query-data' type StateKey = keyof typeof DEFAULT_STATE diff --git a/apps/loan/src/locales/en/messages.po b/apps/loan/src/locales/en/messages.po index bab14f73f..2ad312c28 100644 --- a/apps/loan/src/locales/en/messages.po +++ b/apps/loan/src/locales/en/messages.po @@ -17,14 +17,14 @@ msgstr "" msgid "(Soft liquidation)" msgstr "(Soft liquidation)" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "{0}" msgstr "{0}" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:286 #: src/components/PageLoanManage/CollateralIncrease/index.tsx:242 #: src/components/PageLoanManage/LoanDecrease/index.tsx:228 -#: src/components/PageLoanManage/LoanIncrease/index.tsx:299 +#: src/components/PageLoanManage/LoanIncrease/index.tsx:301 msgid "{0} Avail." msgstr "{0} Avail." @@ -45,51 +45,19 @@ msgstr "{0} Avail. ${userStablecoinBalance}" msgid "{0} borrow amount" msgstr "{0} borrow amount" -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "{rCollateralId}" msgstr "{rCollateralId}" -#: src/components/LoanInfoUser/components/UserInfoLoss.tsx:62 -msgid "*current balance minus losses" -msgstr "*current balance minus losses" - -#: src/hooks/useTitleMapper.tsx:54 +#: src/components/LoanInfoUser/index.tsx:237 msgid "% lost" msgstr "% lost" -#: src/components/PageDisclaimer/Page.tsx:317 -msgid "<0>Anonymity: The degree of anonymity provided by blockchain technology can complicate the tracing of funds and the identification of parties in transactions." -msgstr "<0>Anonymity: The degree of anonymity provided by blockchain technology can complicate the tracing of funds and the identification of parties in transactions." - -#: src/components/PageDisclaimer/Page.tsx:331 -msgid "<0>Cybersecurity Incidents: The digital nature of crypto assets makes them a target for hackers, malicious actors, and other cybersecurity threats. Failures, hacks, exploits, protocol errors, and unforeseen vulnerabilities can compromise the security of assets, resulting in theft, loss, or unauthorized access." -msgstr "<0>Cybersecurity Incidents: The digital nature of crypto assets makes them a target for hackers, malicious actors, and other cybersecurity threats. Failures, hacks, exploits, protocol errors, and unforeseen vulnerabilities can compromise the security of assets, resulting in theft, loss, or unauthorized access." - -#: src/components/PageDisclaimer/Page.tsx:310 -msgid "<0>Irreversibility of Transactions: Once executed, transactions in crypto assets cannot be reversed. Errors or accidental transactions cannot be easily rectified, potentially leading to permanent loss of assets." -msgstr "<0>Irreversibility of Transactions: Once executed, transactions in crypto assets cannot be reversed. Errors or accidental transactions cannot be easily rectified, potentially leading to permanent loss of assets." - -#: src/components/PageDisclaimer/Page.tsx:339 -msgid "<0>Operational Challenges: The process of recording and settling transactions on a blockchain depends on the network's stability and performance. Disruptions, high transaction volumes, or network congestion can delay settlement times, affecting the liquidity and availability of assets." -msgstr "<0>Operational Challenges: The process of recording and settling transactions on a blockchain depends on the network's stability and performance. Disruptions, high transaction volumes, or network congestion can delay settlement times, affecting the liquidity and availability of assets." - -#: src/components/PageDisclaimer/Page.tsx:323 -msgid "<0>Software Dependencies: Crypto asset operations rely heavily on the flawless functioning of complex software, including wallets, smart contracts, and blockchain networks. Any defects, bugs, or vulnerabilities in software can impair access to or use of crypto assets, leading to potential losses." -msgstr "<0>Software Dependencies: Crypto asset operations rely heavily on the flawless functioning of complex software, including wallets, smart contracts, and blockchain networks. Any defects, bugs, or vulnerabilities in software can impair access to or use of crypto assets, leading to potential losses." - #: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:21 msgid "A" msgstr "A" -#: src/components/PageDisclaimer/Page.tsx:354 -msgid "Access Control" -msgstr "Access Control" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 -msgid "Action" -msgstr "Action" - -#: src/components/PageLoanManage/index.tsx:54 +#: src/components/PageLoanManage/index.tsx:50 msgid "Add" msgstr "Add" @@ -105,13 +73,11 @@ msgstr "Add Collateral" msgid "Adjust N:" msgstr "Adjust N:" -#: src/components/AdvancedSettings.tsx:134 +#: src/components/AdvancedSettings.tsx:130 msgid "Advanced Settings" msgstr "Advanced Settings" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:57 -#: src/components/LoanInfoLlamma/index.tsx:50 +#: src/components/LoanInfoLlamma/index.tsx:94 msgid "AMM" msgstr "AMM" @@ -127,30 +93,22 @@ msgstr "Amount must be <= {0}" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Approve Spending" msgstr "Approve Spending" -#: src/layout/Header.tsx:193 -msgid "Apps" -msgstr "Apps" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Asc" msgstr "Asc" -#: src/layout/Footer.tsx:109 +#: src/layout/Footer.tsx:86 msgid "Audits" msgstr "Audits" -#: src/hooks/useTitleMapper.tsx:20 -msgid "Available" -msgstr "Available" - #: src/components/PageMarketList/index.tsx:73 -#~ msgid "Available to borrow" -#~ msgstr "Available to borrow" +msgid "Available to borrow" +msgstr "Available to borrow" #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:37 msgid "band" @@ -161,16 +119,16 @@ msgstr "band" msgid "Band {n}" msgstr "Band {n}" -#: src/hooks/useTitleMapper.tsx:41 +#: src/components/LoanInfoUser/index.tsx:208 msgid "Band range" msgstr "Band range" -#: src/components/DetailInfoLiqRange.tsx:137 +#: src/components/DetailInfoLiqRange.tsx:136 msgid "Band range:" msgstr "Band range:" -#: src/components/LoanInfoLlamma/components/DetailsBandsChart.tsx:73 -#: src/components/LoanInfoUser/components/ChartUserBands.tsx:80 +#: src/components/LoanInfoLlamma/index.tsx:86 +#: src/components/LoanInfoUser/index.tsx:260 msgid "Bands" msgstr "Bands" @@ -187,11 +145,10 @@ msgstr "Be careful, if the collateral price dips, you would need to repay the en #~ msgstr "BETA" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:12 msgid "Borrow" msgstr "Borrow" -#: src/components/PageLoanManage/index.tsx:48 +#: src/components/PageLoanManage/index.tsx:44 msgid "Borrow more" msgstr "Borrow more" @@ -199,8 +156,10 @@ msgstr "Borrow more" msgid "Borrow more anyway" msgstr "Borrow more anyway" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:46 -#: src/hooks/useTitleMapper.tsx:16 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:48 +#: src/components/LoanInfoUser/index.tsx:196 +#: src/components/LoanInfoUser/index.tsx:215 +#: src/components/PageMarketList/index.tsx:66 msgid "Borrow rate" msgstr "Borrow rate" @@ -209,27 +168,18 @@ msgid "Borrow rate:" msgstr "Borrow rate:" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:21 msgid "Borrowed" msgstr "Borrowed" -#: src/components/PageDisclaimer/Page.tsx:96 -msgid "Borrowers in the crvUSD ecosystem are subject to specific risks associated with the liquidation process. It is crucial to understand that if the User’s collateral is placed into soft-liquidation mode, they are prohibited from withdrawing the collateral or augmenting their position with additional collateral. Entering soft-liquidation mode locks the collateral, removing the option to withdraw or add to it. In case market conditions suggest a strategic adjustment to the User’s position, they may face exacerbated risk due to such restrictions." -msgstr "Borrowers in the crvUSD ecosystem are subject to specific risks associated with the liquidation process. It is crucial to understand that if the User’s collateral is placed into soft-liquidation mode, they are prohibited from withdrawing the collateral or augmenting their position with additional collateral. Entering soft-liquidation mode locks the collateral, removing the option to withdraw or add to it. In case market conditions suggest a strategic adjustment to the User’s position, they may face exacerbated risk due to such restrictions." - #: src/domain/components/DetailInfoHealth.tsx:180 #~ msgid "Borrowing {0} will put you close to soft liquidation." #~ msgstr "Borrowing {0} will put you close to soft liquidation." -#: src/components/DetailInfoHealth.tsx:194 +#: src/components/DetailInfoHealth.tsx:184 msgid "Borrowing {formattedAmount} will put you close to soft liquidation." msgstr "Borrowing {formattedAmount} will put you close to soft liquidation." -#: src/layout/Footer.tsx:100 -msgid "Branding" -msgstr "Branding" - -#: src/layout/Footer.tsx:115 +#: src/layout/Footer.tsx:92 msgid "Bug Bounty" msgstr "Bug Bounty" @@ -241,28 +191,20 @@ msgstr "Bug Bounty" msgid "Cancel" msgstr "Cancel" -#: src/hooks/useTitleMapper.tsx:22 +#: src/components/PageMarketList/index.tsx:72 msgid "Cap" msgstr "Cap" -#: src/components/ChartOhlcWrapper/index.tsx:252 -#: src/components/ChartOhlcWrapper/index.tsx:279 -#: src/components/ChartOhlcWrapper/index.tsx:308 -msgid "Chart" -msgstr "Chart" - -#: src/components/DetailInfoHealth.tsx:206 +#: src/components/DetailInfoHealth.tsx:196 msgid "Close to liquidation range!" msgstr "Close to liquidation range!" -#: src/layout/Footer.tsx:37 -#: src/layout/Footer.tsx:55 +#: src/layout/Footer.tsx:32 +#: src/layout/Footer.tsx:50 msgid "CN" msgstr "CN" -#: src/components/PageLoanManage/index.tsx:36 -#: src/hooks/useTitleMapper.tsx:11 -#: src/hooks/useTitleMapper.tsx:46 +#: src/components/PageLoanManage/index.tsx:38 msgid "Collateral" msgstr "Collateral" @@ -278,19 +220,11 @@ msgstr "collateral median price" msgid "Collateral Removed" msgstr "Collateral Removed" -#: src/hooks/useTitleMapper.tsx:23 -msgid "Collateral value" -msgstr "Collateral value" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:41 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:39 msgid "Collateral:" msgstr "Collateral:" -#: src/components/PageDisclaimer/Page.tsx:79 -msgid "Collateralized debt positions are managed passively through arbitrage opportunities: if the collateral's price decreases, the system automatically sells off collateral to arbitrageurs in a ‘soft-liquidation mode’. If the collateral's price increases, the system recovers the collateral. This algorithm is designed to dynamically adjust the collateral backing each crvUSD in real-time, responding to fluctuating market conditions. While this approach is intended to mitigate the severity of traditional liquidations—a process where collateral becomes insufficient, leading to irreversible sales at potentially undervalued prices—it does not eliminate the inherent risk of collateral volatility. Additional information can be found on <0>LLAMMA Overview." -msgstr "Collateralized debt positions are managed passively through arbitrage opportunities: if the collateral's price decreases, the system automatically sells off collateral to arbitrageurs in a ‘soft-liquidation mode’. If the collateral's price increases, the system recovers the collateral. This algorithm is designed to dynamically adjust the collateral backing each crvUSD in real-time, responding to fluctuating market conditions. While this approach is intended to mitigate the severity of traditional liquidations—a process where collateral becomes insufficient, leading to irreversible sales at potentially undervalued prices—it does not eliminate the inherent risk of collateral volatility. Additional information can be found on <0>LLAMMA Overview." - -#: src/layout/Header.tsx:194 +#: src/layout/HeaderMobile.tsx:140 msgid "Community" msgstr "Community" @@ -300,51 +234,31 @@ msgstr "Community" msgid "Confirm warning to proceed." msgstr "Confirm warning to proceed." -#: src/components/PageLoanCreate/Page.tsx:225 -#: src/components/PageLoanManage/Page.tsx:228 -msgid "Connect" -msgstr "Connect" - #: src/domain/layout/index.tsx:68 #~ msgid "Connect wallet" #~ msgstr "Connect wallet" -#: src/components/LoanFormConnect.tsx:30 +#: src/components/ConnectWallet.tsx:51 +#: src/components/LoanFormConnect.tsx:25 msgid "Connect Wallet" msgstr "Connect Wallet" -#: src/components/PageLoanCreate/Page.tsx:224 -#: src/components/PageLoanManage/Page.tsx:227 -msgid "Connect your wallet to view market" -msgstr "Connect your wallet to view market" - -#: src/components/PageLoanCreate/Page.tsx:226 -#: src/components/PageLoanManage/Page.tsx:229 -msgid "Connecting" -msgstr "Connecting" - -#: src/components/LoanInfoLlamma/index.tsx:46 -#: src/layout/Footer.tsx:112 +#: src/components/LoanInfoLlamma/index.tsx:93 +#: src/layout/Footer.tsx:89 msgid "Contracts" msgstr "Contracts" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:64 -#: src/components/LoanInfoLlamma/index.tsx:56 +#: src/components/LoanInfoLlamma/index.tsx:98 msgid "Controller" msgstr "Controller" -#: src/components/PageDisclaimer/Page.tsx:351 -msgid "Counterparty Risks" -msgstr "Counterparty Risks" - -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "Create" msgstr "Create" -#: src/components/PageLoanCreate/index.tsx:26 +#: src/components/PageLoanCreate/index.tsx:30 #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:174 -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Create Loan" msgstr "Create Loan" @@ -352,184 +266,78 @@ msgstr "Create Loan" msgid "Creating a leverage loan means you will not receive any crvUSD to your address and will instead assume a significantly larger debt position." msgstr "Creating a leverage loan means you will not receive any crvUSD to your address and will instead assume a significantly larger debt position." -#: src/layout/Footer.tsx:72 -msgid "Crvhub" -msgstr "Crvhub" - #: src/layout/HeaderMobile.tsx:189 #: src/layout/HeaderSecondary.tsx:49 -#~ msgid "crvUSD" -#~ msgstr "crvUSD" - -#: src/components/PageDisclaimer/Page.tsx:288 -msgid "crvUSD and its underlying infrastructure are in an early stage of development, are inherently experimental, and carry a significant degree of risk. Engagement with crvUSD during this phase should be approached with the understanding that it may lead to partial or complete loss of funds. Users considering minting, redeeming, or utilizing crvUSD should be prepared for the possibility of encountering technical issues, bugs, or vulnerabilities that could impact the value of crvUSD or the safety of allocated crypto assets." -msgstr "crvUSD and its underlying infrastructure are in an early stage of development, are inherently experimental, and carry a significant degree of risk. Engagement with crvUSD during this phase should be approached with the understanding that it may lead to partial or complete loss of funds. Users considering minting, redeeming, or utilizing crvUSD should be prepared for the possibility of encountering technical issues, bugs, or vulnerabilities that could impact the value of crvUSD or the safety of allocated crypto assets." - -#: src/components/PageDisclaimer/Page.tsx:67 -msgid "crvUSD Design Risks" -msgstr "crvUSD Design Risks" - -#: src/components/PageDisclaimer/Page.tsx:376 -msgid "crvUSD functions in a decentralized way, with its issuance and operational mechanics governed exclusively by smart contracts, without reliance on any intermediaries. While the adjustment of stablecoin critical parameters is subject to Curve DAO approvals, Users must understand that Curve DAO does not act as a broker, agent, advisor, or in any fiduciary capacity towards crvUSD users. Consequently, Curve DAO bears no obligation to ensure that the use of crvUSD aligns with each one’s financial objectives, strategies, or risk tolerance levels." -msgstr "crvUSD functions in a decentralized way, with its issuance and operational mechanics governed exclusively by smart contracts, without reliance on any intermediaries. While the adjustment of stablecoin critical parameters is subject to Curve DAO approvals, Users must understand that Curve DAO does not act as a broker, agent, advisor, or in any fiduciary capacity towards crvUSD users. Consequently, Curve DAO bears no obligation to ensure that the use of crvUSD aligns with each one’s financial objectives, strategies, or risk tolerance levels." - -#: src/components/PageDisclaimer/Page.tsx:69 -msgid "crvUSD has unique design features that Users should fully understand before interacting with the protocol." -msgstr "crvUSD has unique design features that Users should fully understand before interacting with the protocol." - -#: src/components/PageDisclaimer/Page.tsx:406 -msgid "crvUSD is not recognized as a legal tender by any government authority, central bank, or legal jurisdiction. Users should be aware that the lack of legal tender status means that no statutory, governmental, or corporate entity is obligated to accept the stablecoin as payment for goods, services, debts, or other obligations. The regulatory environment around crypto assets and stablecoins remains fluid and subject to change across jurisdictions. This poses a risk that the legal status of the stablecoin could be altered, potentially affecting its use, transfer, holding, and value." -msgstr "crvUSD is not recognized as a legal tender by any government authority, central bank, or legal jurisdiction. Users should be aware that the lack of legal tender status means that no statutory, governmental, or corporate entity is obligated to accept the stablecoin as payment for goods, services, debts, or other obligations. The regulatory environment around crypto assets and stablecoins remains fluid and subject to change across jurisdictions. This poses a risk that the legal status of the stablecoin could be altered, potentially affecting its use, transfer, holding, and value." - -#: src/components/PageDisclaimer/Page.tsx:154 -msgid "crvUSD makes use of Pegkeepers, contracts authorized to deposit and withdraw crvUSD from a whitelisted Curve crvUSD stableswap pool up to a predefined debt cap. These contracts reference a subset of whitelisted stablecoins as a proxy for the intended USD price. Instability affecting any counterparty Pegkeeper assets (e.g. USDT, USDC), which are also used to aggregate a USD price for crvUSD, may cause the Pegkeeper to deposit all of its crvUSD into the pool in an attempt to rebalance. This creates a dependency on the Pegkeeper counterparty assets that determines the stability of the crvUSD peg. An upgraded PegkeeperV2 design promises to alleviate this risk." -msgstr "crvUSD makes use of Pegkeepers, contracts authorized to deposit and withdraw crvUSD from a whitelisted Curve crvUSD stableswap pool up to a predefined debt cap. These contracts reference a subset of whitelisted stablecoins as a proxy for the intended USD price. Instability affecting any counterparty Pegkeeper assets (e.g. USDT, USDC), which are also used to aggregate a USD price for crvUSD, may cause the Pegkeeper to deposit all of its crvUSD into the pool in an attempt to rebalance. This creates a dependency on the Pegkeeper counterparty assets that determines the stability of the crvUSD peg. An upgraded PegkeeperV2 design promises to alleviate this risk." - -#: src/components/PageDisclaimer/Page.tsx:356 -msgid "crvUSD markets (Controller smart contracts) are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and minters always retain full control and responsibility over their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." -msgstr "crvUSD markets (Controller smart contracts) are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and minters always retain full control and responsibility over their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." +msgid "crvUSD" +msgstr "crvUSD" #: src/layout/Header.tsx:78 #: src/layout/HeaderMobile.tsx:135 -#~ msgid "crvUSD Pools" -#~ msgstr "crvUSD Pools" - -#: src/components/PageDisclaimer/Page.tsx:224 -msgid "crvUSD relies on liquidity concentrated within particular Pegkeeper pools, which serve a dual purpose as both a source of liquidity and price feeds for crvUSD oracles. If the incentives for depositing crvUSD into these pools are insufficient, the liquidity shortfalls can result in missed liquidations or deflationary price spirals (cascading liquidations). This phenomenon occurs when initial liquidations fail to be executed effectively, leading to a domino effect of further liquidations and potentially rapid, significant decreases in asset prices." -msgstr "crvUSD relies on liquidity concentrated within particular Pegkeeper pools, which serve a dual purpose as both a source of liquidity and price feeds for crvUSD oracles. If the incentives for depositing crvUSD into these pools are insufficient, the liquidity shortfalls can result in missed liquidations or deflationary price spirals (cascading liquidations). This phenomenon occurs when initial liquidations fail to be executed effectively, leading to a domino effect of further liquidations and potentially rapid, significant decreases in asset prices." - -#: src/components/PageDisclaimer/Page.tsx:267 -msgid "crvUSD relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. Users need to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "crvUSD relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. Users need to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." - -#: src/components/PageDisclaimer/Page.tsx:61 -msgid "crvUSD smart contract Audits" -msgstr "crvUSD smart contract Audits" +msgid "crvUSD Pools" +msgstr "crvUSD Pools" #: src/layout/HeaderMobile.tsx:180 #: src/layout/HeaderSecondary.tsx:41 -#~ msgid "crvUSD Total Supply" -#~ msgstr "crvUSD Total Supply" +msgid "crvUSD Total Supply" +msgstr "crvUSD Total Supply" -#: src/components/PageDisclaimer/Page.tsx:57 -msgid "crvUSD Whitepaper" -msgstr "crvUSD Whitepaper" - -#: src/hooks/useTitleMapper.tsx:48 +#: src/components/LoanInfoUser/index.tsx:225 msgid "Current balance (est.) / Deposited" msgstr "Current balance (est.) / Deposited" -#: src/components/PageDisclaimer/Page.tsx:132 -msgid "Curve incorporates specialized on-chain Exponential Moving Average (EMA) oracles built into stabelswap-ng, tricrypto-ng, and twocrypto-ng Curve pool implementations. crvUSD markets derive price information from a select number of high TVL Curve pools. By utilizing the EMA smoothing methodology, oracles mitigate the impact of transient price fluctuations, aiming to reduce unnecessary losses caused by short-term market volatility or attempts to manipulate the oracle. Despite the manipulation-resistant design specification, Curve pool oracles may exhibit price distortions in certain scenarios that have the potential to result in missed or excessive liquidations. This may be a result of liquidity and volume migration to alternate venues that increase the risk of oracle manipulation. A detailed explanation of the aforementioned terms can be found in the <0>crvUSD Oracle documentation." -msgstr "Curve incorporates specialized on-chain Exponential Moving Average (EMA) oracles built into stabelswap-ng, tricrypto-ng, and twocrypto-ng Curve pool implementations. crvUSD markets derive price information from a select number of high TVL Curve pools. By utilizing the EMA smoothing methodology, oracles mitigate the impact of transient price fluctuations, aiming to reduce unnecessary losses caused by short-term market volatility or attempts to manipulate the oracle. Despite the manipulation-resistant design specification, Curve pool oracles may exhibit price distortions in certain scenarios that have the potential to result in missed or excessive liquidations. This may be a result of liquidity and volume migration to alternate venues that increase the risk of oracle manipulation. A detailed explanation of the aforementioned terms can be found in the <0>crvUSD Oracle documentation." - -#: src/layout/Footer.tsx:69 +#: src/layout/Footer.tsx:64 msgid "Curve Monitor" msgstr "Curve Monitor" -#: src/components/PageDisclaimer/Page.tsx:130 -msgid "Curve Pool EMA Oracles" -msgstr "Curve Pool EMA Oracles" - -#: src/components/PageDisclaimer/Page.tsx:276 -msgid "Curve smart contracts have undergone multiple audits by reputable firms, including MixBytes and ChainSecurity, to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "Curve smart contracts have undergone multiple audits by reputable firms, including MixBytes and ChainSecurity, to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." - -#: src/components/PageDisclaimer/Page.tsx:47 -msgid "Curve stablecoin infrastructure enables users to mint crvUSD using a selection of crypto-tokenized collaterals (adding new ones is subject to DAO approval). Interacting with crvUSD doesn't come without risks. Before minting or taking exposure of crvUSD, it is best to research and understand the risks involved." -msgstr "Curve stablecoin infrastructure enables users to mint crvUSD using a selection of crypto-tokenized collaterals (adding new ones is subject to DAO approval). Interacting with crvUSD doesn't come without risks. Before minting or taking exposure of crvUSD, it is best to research and understand the risks involved." - -#: src/components/AdvancedSettings.tsx:189 +#: src/components/AdvancedSettings.tsx:185 msgid "Custom" msgstr "Custom" -#: src/layout/Header.tsx:97 -msgid "Daily volume" -msgstr "Daily volume" - -#: src/components/LoanInfoUser/components/UserInfoDebt.tsx:25 #: src/components/PageLoanManage/LoanDecrease/index.tsx:258 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:308 -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:40 msgid "Debt" msgstr "Debt" -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:41 -msgid "Debt Ceiling" -msgstr "Debt Ceiling" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:40 -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:44 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:43 msgid "Debt:" msgstr "Debt:" -#: src/components/PageLoanManage/index.tsx:37 +#: src/components/PageLoanManage/index.tsx:39 msgid "Deleverage" msgstr "Deleverage" -#: src/components/PageDisclaimer/Page.tsx:249 -msgid "Depegging Risk" -msgstr "Depegging Risk" - -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:31 -msgid "Deposit" -msgstr "Deposit" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Desc" msgstr "Desc" -#: src/components/PageDisclaimer/Page.tsx:388 -msgid "Developer Dependency" -msgstr "Developer Dependency" - -#: src/layout/Footer.tsx:97 +#: src/layout/Footer.tsx:103 msgid "Developer Docs" msgstr "Developer Docs" -#: src/components/PageMarketList/index.tsx:152 +#: src/components/PageMarketList/index.tsx:165 msgid "Didn't find what you're looking for?" msgstr "Didn't find what you're looking for?" -#: src/components/AdvancedSettings.tsx:139 +#: src/components/AdvancedSettings.tsx:135 msgid "Discard" msgstr "Discard" -#: src/components/PageDisclaimer/Page.tsx:435 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." - -#: src/layout/Footer.tsx:47 +#: src/layout/Footer.tsx:42 msgid "Discord" msgstr "Discord" -#: src/layout/Footer.tsx:43 +#: src/layout/Footer.tsx:38 msgid "Dodo" msgstr "Dodo" -#: src/layout/Footer.tsx:66 +#: src/layout/Footer.tsx:61 msgid "Dune Analytics" msgstr "Dune Analytics" -#: src/components/PageDisclaimer/Page.tsx:167 -msgid "Dynamic Interest Rates" -msgstr "Dynamic Interest Rates" - -#: src/components/PageDisclaimer/Page.tsx:302 -msgid "Engaging with crypto assets involves exposure to a range of technological risks inherent to the use of new and evolving technologies. Users must be aware of key risk factors (as outlined below) and consider their implications for crypto asset transactions." -msgstr "Engaging with crypto assets involves exposure to a range of technological risks inherent to the use of new and evolving technologies. Users must be aware of key risk factors (as outlined below) and consider their implications for crypto asset transactions." - #: src/components/Page404/Page.tsx:11 -#~ msgid "Error 404" -#~ msgstr "Error 404" - -#: src/components/PageDisclaimer/Page.tsx:186 -msgid "Essentially, the borrow rate increases when the price of crvUSD goes lower and/or the proportion of Pegkeeper debt to total debt reduces. This process is intended to dynamically regulate market behavior such that it reinforces the crvUSD peg. Changes to the Monetary Policy are authorized only by the Curve DAO. A <0>crvUSD rate tool by 0xReviews allows Users to visualize the influence of these factors on the borrowing rate." -msgstr "Essentially, the borrow rate increases when the price of crvUSD goes lower and/or the proportion of Pegkeeper debt to total debt reduces. This process is intended to dynamically regulate market behavior such that it reinforces the crvUSD peg. Changes to the Monetary Policy are authorized only by the Curve DAO. A <0>crvUSD rate tool by 0xReviews allows Users to visualize the influence of these factors on the borrowing rate." - -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:69 -msgid "Est. update profit:" -msgstr "Est. update profit:" +msgid "Error 404" +msgstr "Error 404" #: src/components/DetailInfoEstimateGas.tsx:61 msgid "Estimated TX cost" @@ -539,75 +347,46 @@ msgstr "Estimated TX cost" msgid "Estimated TX cost:" msgstr "Estimated TX cost:" -#: src/components/ChartOhlcWrapper/index.tsx:291 -#: src/components/PageLoanCreate/Page.tsx:182 -#: src/components/PageLoanManage/Page.tsx:166 -msgid "Expand chart" -msgstr "Expand chart" - #: src/layout/Footer.tsx:95 -#~ msgid "FAQ" -#~ msgstr "FAQ" +msgid "FAQ" +msgstr "FAQ" -#: src/components/PageDisclaimer/Page.tsx:300 -msgid "General Blockchain Technology Risks" -msgstr "General Blockchain Technology Risks" - -#: src/layout/Footer.tsx:94 +#: src/layout/Footer.tsx:114 msgid "Github" msgstr "Github" -#: src/components/DetailInfoHealth.tsx:121 -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:34 -#: src/hooks/useTitleMapper.tsx:30 -msgid "Hard liquidation is triggered when health is 0 or below." -msgstr "Hard liquidation is triggered when health is 0 or below." - #: src/components/LoanInfoUser/index.tsx:185 -#~ msgid "Health" -#~ msgstr "Health" - -#: src/hooks/useTitleMapper.tsx:39 -msgid "Health %" -msgstr "Health %" - -#: src/hooks/useTitleMapper.tsx:25 -msgid "Health status" -msgstr "Health status" +msgid "Health" +msgstr "Health" -#: src/components/DetailInfoHealth.tsx:115 +#: src/components/DetailInfoHealth.tsx:113 msgid "Health:" msgstr "Health:" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 msgid "High price impact:" msgstr "High price impact:" -#: src/components/PageDisclaimer/Page.tsx:119 -msgid "If the health of the loan falls to zero, the position is subject to hard liquidation, which is an irreversible process resulting in the loss of the collateral with no possibility of recovery or de-liquidation. This scenario underscores the critical need for risk management when using leverage. Leverage and collateral management should be approached with caution, reflecting a balanced assessment of potential gains against the risk of significant financial loss." -msgstr "If the health of the loan falls to zero, the position is subject to hard liquidation, which is an irreversible process resulting in the loss of the collateral with no possibility of recovery or de-liquidation. This scenario underscores the critical need for risk management when using leverage. Leverage and collateral management should be approached with caution, reflecting a balanced assessment of potential gains against the risk of significant financial loss." - #: src/domain/components/DetailInfoHealth.tsx:182 #~ msgid "Increasing your borrowed amount by {0} will put you close to soft liquidation." #~ msgstr "Increasing your borrowed amount by {0} will put you close to soft liquidation." -#: src/components/DetailInfoHealth.tsx:196 +#: src/components/DetailInfoHealth.tsx:186 msgid "Increasing your borrowed amount by {formattedAmount} will put you close to soft liquidation." msgstr "Increasing your borrowed amount by {formattedAmount} will put you close to soft liquidation." -#: src/components/PageIntegrations/Page.tsx:37 -#: src/layout/Footer.tsx:103 -#: src/layout/Header.tsx:74 -#: src/layout/Header.tsx:80 +#: src/components/PageIntegrations/Page.tsx:38 +#: src/layout/Footer.tsx:99 +#: src/layout/Header.tsx:42 msgid "Integrations" msgstr "Integrations" -#: src/components/PageMarketList/index.tsx:154 +#: src/components/PageMarketList/index.tsx:167 msgid "Join the Telegram" msgstr "Join the Telegram" -#: src/components/PageLoanCreate/index.tsx:27 +#: src/components/PageLoanCreate/index.tsx:31 msgid "Leverage" msgstr "Leverage" @@ -620,15 +399,16 @@ msgstr "Leverage:" #~ msgstr "Liquidation price range is the range of prices at which your collateral will get liquidated over time. Soft liquidation begins when the oracle price of your collateral hits the top of the range. Hard liquidation occurs when the oracle price drops to the bottom of the range, and your collateral is converted entirely to stablecoins." #: src/components/ChartLiquidationRange/index.tsx:92 -#: src/hooks/useTitleMapper.tsx:40 +#: src/components/LoanInfoUser/index.tsx:164 +#: src/components/LoanInfoUser/index.tsx:205 msgid "Liquidation range" msgstr "Liquidation range" -#: src/components/LoanInfoUser/index.tsx:72 +#: src/components/LoanInfoUser/index.tsx:266 msgid "Liquidation Range" msgstr "Liquidation Range" -#: src/components/DetailInfoLiqRange.tsx:101 +#: src/components/DetailInfoLiqRange.tsx:100 msgid "Liquidation range:" msgstr "Liquidation range:" @@ -636,10 +416,6 @@ msgstr "Liquidation range:" msgid "Liquidation range{0}" msgstr "Liquidation range{0}" -#: src/components/PageDisclaimer/Page.tsx:214 -msgid "Liquidity Risk" -msgstr "Liquidity Risk" - #: src/domain/layout/Footer.tsx:62 #~ msgid "Llama Airforce" #~ msgstr "Llama Airforce" @@ -648,23 +424,19 @@ msgstr "Liquidity Risk" msgid "LLAMMA {collateralName} Avail." msgstr "LLAMMA {collateralName} Avail." -#: src/components/ChartOhlcWrapper/index.tsx:286 -msgid "LLAMMA Activity" -msgstr "LLAMMA Activity" - -#: src/hooks/useTitleMapper.tsx:58 +#: src/components/LoanInfoUser/index.tsx:281 msgid "LLAMMA Balances" msgstr "LLAMMA Balances" -#: src/components/PageLoanManage/Page.tsx:72 +#: src/components/PageLoanManage/Page.tsx:58 msgid "LLAMMA Details" msgstr "LLAMMA Details" -#: src/components/LoanFormConnect.tsx:34 +#: src/components/LoanFormConnect.tsx:29 msgid "Loading" msgstr "Loading" -#: src/components/PageLoanManage/index.tsx:35 +#: src/components/PageLoanManage/index.tsx:37 msgid "Loan" msgstr "Loan" @@ -672,7 +444,7 @@ msgstr "Loan" msgid "Loan Created" msgstr "Loan Created" -#: src/components/LoanInfoLlamma/index.tsx:67 +#: src/components/LoanInfoLlamma/index.tsx:109 msgid "Loan parameters" msgstr "Loan parameters" @@ -684,26 +456,21 @@ msgstr "Loan Parameters" msgid "Loan to Value ratio:" msgstr "Loan to Value ratio:" -#: src/hooks/useTitleMapper.tsx:52 +#: src/components/LoanInfoUser/index.tsx:233 msgid "Loss amount" msgstr "Loss amount" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "Manage" msgstr "Manage" -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Manage Loan" msgstr "Manage Loan" -#: src/components/PageDisclaimer/Page.tsx:212 -msgid "Market Risks" -msgstr "Market Risks" - -#: src/components/PageMarketList/Page.tsx:34 -#: src/hooks/useTitleMapper.tsx:10 -#: src/layout/Header.tsx:72 -#: src/layout/Header.tsx:79 +#: src/components/PageMarketList/index.tsx:60 +#: src/components/PageMarketList/Page.tsx:33 +#: src/layout/Header.tsx:40 msgid "Markets" msgstr "Markets" @@ -711,78 +478,54 @@ msgstr "Markets" msgid "Max borrow amount" msgstr "Max borrow amount" -#: src/components/AdvancedSettings.tsx:159 +#: src/components/AdvancedSettings.tsx:155 msgid "Max Slippage" msgstr "Max Slippage" -#: src/components/AdvancedSettings.tsx:161 +#: src/components/AdvancedSettings.tsx:157 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "Maximum difference between expected price of the trade, versus the price when the trade is executed." -#: src/components/AdvancedSettings.tsx:116 +#: src/components/AdvancedSettings.tsx:115 msgid "Min. slippage is 0.01%" msgstr "Min. slippage is 0.01%" #: src/layout/HeaderMobile.tsx:164 -#~ msgid "Mode" -#~ msgstr "Mode" +msgid "Mode" +msgstr "Mode" -#: src/components/LoanInfoLlamma/index.tsx:61 +#: src/components/LoanInfoLlamma/index.tsx:103 msgid "Monetary Policy" msgstr "Monetary Policy" -#: src/hooks/useTitleMapper.tsx:13 +#: src/components/PageMarketList/index.tsx:62 msgid "My debt" msgstr "My debt" -#: src/hooks/useTitleMapper.tsx:14 +#: src/components/PageMarketList/index.tsx:61 msgid "My health" msgstr "My health" -#: src/components/DetailInfoN.tsx:13 +#: src/components/DetailInfoN.tsx:10 msgid "N:" msgstr "N:" -#: src/layout/Footer.tsx:118 +#: src/layout/Footer.tsx:106 msgid "News" msgstr "News" -#: src/components/PageMarketList/index.tsx:159 +#: src/components/PageMarketList/index.tsx:172 msgid "No collateral found for \"{0}\". Feel free to search other tabs, or" msgstr "No collateral found for \"{0}\". Feel free to search other tabs, or" -#: src/components/PageMarketList/index.tsx:166 +#: src/components/PageMarketList/index.tsx:179 msgid "No collateral found in this category" msgstr "No collateral found in this category" -#: src/components/PageDisclaimer/Page.tsx:374 -msgid "No Control" -msgstr "No Control" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:87 -msgid "No controller data found." -msgstr "No controller data found." - -#: src/components/PageDisclaimer/Page.tsx:236 -msgid "No Guarantee of Price Stability" -msgstr "No Guarantee of Price Stability" - #: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "No integration apps found with for {0} {1}{2}" -#: src/components/PageDisclaimer/Page.tsx:417 -msgid "No Investment and Legal Advice" -msgstr "No Investment and Legal Advice" - -#: src/components/PageDisclaimer/Page.tsx:286 -msgid "No Loss Prevention" -msgstr "No Loss Prevention" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:80 -msgid "No trades data found." -msgstr "No trades data found." - #: src/components/LoanFormAlertError.tsx:45 msgid "Not eligible for liquidation" msgstr "Not eligible for liquidation" @@ -793,13 +536,13 @@ msgstr "Note: maDAI, maUSDC and maUSDT are LP tokens from the Morpho protocol, a #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "off" -#~ msgstr "off" +msgid "off" +msgstr "off" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "on" -#~ msgstr "on" +msgid "on" +msgstr "on" #: src/components/AlertFormWarning.tsx:30 msgid "Once the loan is paid off, you will no longer be able to manage this loan." @@ -820,30 +563,14 @@ msgstr "Oracle" msgid "Oracle price" msgstr "Oracle price" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:35 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:36 msgid "Oracle Price" msgstr "Oracle Price" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:37 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:35 msgid "Partial repayment LLAMMA changes:" msgstr "Partial repayment LLAMMA changes:" -#: src/components/PagePegKeepers/Page.tsx:33 -msgid "Peg Keepers" -msgstr "Peg Keepers" - -#: src/components/PageDisclaimer/Page.tsx:152 -msgid "Pegkeepers" -msgstr "Pegkeepers" - -#: src/components/PagePegKeepers/Page.tsx:30 -msgid "PegKeepers" -msgstr "PegKeepers" - -#: src/components/PageMarketList/components/TableStats.tsx:14 -msgid "PegKeepers Debt" -msgstr "PegKeepers Debt" - #: src/components/PageLoanManage/LoanDecrease/index.tsx:111 msgid "Please approve a repayment of {debt} {0}." msgstr "Please approve a repayment of {debt} {0}." @@ -858,7 +585,7 @@ msgstr "Please approve full repay." #: src/components/PageLoanManage/CollateralIncrease/index.tsx:142 #: src/components/PageLoanManage/LoanIncrease/index.tsx:162 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:103 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:99 msgid "Please approve spending of {0}" msgstr "Please approve spending of {0}" @@ -874,7 +601,7 @@ msgstr "Please approve spending your {0}." msgid "Please approve spending your {item1Name}." msgstr "Please approve spending your {item1Name}." -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:117 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:113 msgid "Please confirm {stablecoinName} self-liquidation at max {maxSlippage}% slippage." msgstr "Please confirm {stablecoinName} self-liquidation at max {maxSlippage}% slippage." @@ -902,10 +629,6 @@ msgstr "Please confirm removal of {0} {1}" msgid "Please confirm swapping {swapAmount} {item1Name} at max {maxSlippage} slippage." msgstr "Please confirm swapping {swapAmount} {item1Name} at max {maxSlippage} slippage." -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:39 -msgid "Please confirm update {poolName} pool" -msgstr "Please confirm update {poolName} pool" - #: src/domain/layout/index.tsx:66 #~ msgid "Please connect wallet to view loan details" #~ msgstr "Please connect wallet to view loan details" @@ -914,34 +637,21 @@ msgstr "Please confirm update {poolName} pool" #~ msgid "Please switch your wallet's network to <0>{0}to use Curve on <1>{1}." #~ msgstr "Please switch your wallet's network to <0>{0}to use Curve on <1>{1}." -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 #: src/components/PageLoanManage/LoanSwap/index.tsx:296 msgid "Price impact:" msgstr "Price impact:" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:75 -msgid "Profit is denominated in {poolName} LP Tokens" -msgstr "Profit is denominated in {poolName} LP Tokens" - -#: src/hooks/useTitleMapper.tsx:42 +#: src/components/LoanInfoUser/index.tsx:211 msgid "Range %" msgstr "Range %" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:44 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:227 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:43 msgid "Receive:" msgstr "Receive:" -#: src/components/PageDisclaimer/Page.tsx:402 -msgid "Regulatory Risks" -msgstr "Regulatory Risks" - -#: src/components/PageDisclaimer/Page.tsx:404 -msgid "Regulatory Uncertainty" -msgstr "Regulatory Uncertainty" - -#: src/components/PageLoanManage/index.tsx:55 +#: src/components/PageLoanManage/index.tsx:51 msgid "Remove" msgstr "Remove" @@ -953,7 +663,7 @@ msgstr "Remove Collateral" #~ msgid "Removing {0} collateral, will put you close to soft liquidation." #~ msgstr "Removing {0} collateral, will put you close to soft liquidation." -#: src/components/DetailInfoHealth.tsx:192 +#: src/components/DetailInfoHealth.tsx:182 msgid "Removing {formattedAmount} collateral, will put you close to soft liquidation." msgstr "Removing {formattedAmount} collateral, will put you close to soft liquidation." @@ -962,7 +672,7 @@ msgstr "Removing {formattedAmount} collateral, will put you close to soft liquid msgid "Repaid" msgstr "Repaid" -#: src/components/PageLoanManage/index.tsx:49 +#: src/components/PageLoanManage/index.tsx:45 #: src/components/PageLoanManage/LoanDecrease/index.tsx:172 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:155 msgid "Repay" @@ -972,64 +682,47 @@ msgstr "Repay" msgid "Repay anyway" msgstr "Repay anyway" -#: src/components/PageLoanManage/LoanDecrease/index.tsx:273 +#: src/components/PageLoanManage/LoanDecrease/index.tsx:268 msgid "Repay in full and close loan" msgstr "Repay in full and close loan" -#: src/layout/Footer.tsx:91 -#: src/layout/Header.tsx:195 +#: src/layout/Footer.tsx:109 +#: src/layout/HeaderMobile.tsx:152 msgid "Resources" msgstr "Resources" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:57 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:56 msgid "Return to wallet:" msgstr "Return to wallet:" -#: src/components/PageDisclaimer/Page.tsx:41 -#: src/components/PageDisclaimer/Page.tsx:44 -#: src/layout/Header.tsx:73 -#: src/layout/Header.tsx:81 +#: src/components/PageDisclaimer/Page.tsx:28 +#: src/components/PageDisclaimer/Page.tsx:30 +#: src/layout/Header.tsx:41 msgid "Risk Disclaimer" msgstr "Risk Disclaimer" -#: src/components/AdvancedSettings.tsx:151 +#: src/components/AdvancedSettings.tsx:147 msgid "Save" msgstr "Save" -#: src/components/PageLoanManage/index.tsx:50 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/index.tsx:46 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidate" msgstr "Self-liquidate" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidated" msgstr "Self-liquidated" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:207 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:203 msgid "Self-liquidation amount" msgstr "Self-liquidation amount" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:226 -msgid "Self-liquidation amount:" -msgstr "Self-liquidation amount:" - -#: src/components/PageDisclaimer/Page.tsx:181 -msgid "several variables set by the Monetary Policy admin" -msgstr "several variables set by the Monetary Policy admin" - -#: src/components/DetailInfoSlippageTolerance.tsx:16 +#: src/components/DetailInfoSlippageTolerance.tsx:14 msgid "Slippage tolerance:" msgstr "Slippage tolerance:" -#: src/components/PageDisclaimer/Page.tsx:265 -msgid "Smart Contract Risk" -msgstr "Smart Contract Risk" - -#: src/components/PageDisclaimer/Page.tsx:77 -msgid "Soft-Liquidation and Hard-Liquidation" -msgstr "Soft-Liquidation and Hard-Liquidation" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:68 +#: src/components/PageMarketList/components/DialogSortContent.tsx:65 msgid "Sort By" msgstr "Sort By" @@ -1037,20 +730,19 @@ msgstr "Sort By" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Spending Approved" msgstr "Spending Approved" #: src/components/LoanInfoUser/index.tsx:178 -#~ msgid "Status" -#~ msgstr "Status" +msgid "Status" +msgstr "Status" #: src/components/DetailInfoEstimateGas.tsx:62 msgid "Step {0} of {1}" msgstr "Step {0} of {1}" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 #: src/components/PageLoanManage/LoanSwap/index.tsx:176 msgid "Swap" msgstr "Swap" @@ -1063,107 +755,54 @@ msgstr "Swap" msgid "Swapped" msgstr "Swapped" -#: src/components/PageDisclaimer/Page.tsx:263 -msgid "Technology Risk" -msgstr "Technology Risk" - -#: src/layout/Footer.tsx:33 +#: src/layout/Footer.tsx:28 msgid "Telegram" msgstr "Telegram" -#: src/components/PageDisclaimer/Page.tsx:251 -msgid "The blockchain ecosystem has witnessed instances where stablecoins experienced significant and prolonged periods of depegging from their intended value. Despite the innovative measures designed to uphold price stability, crvUSD is not exempt from the risk of depegging. Market volatility, shifts in regulatory landscapes, sudden and substantial changes in the value of collateral assets, or unforeseen technical issues can precipitate a departure from its pegged value." -msgstr "The blockchain ecosystem has witnessed instances where stablecoins experienced significant and prolonged periods of depegging from their intended value. Despite the innovative measures designed to uphold price stability, crvUSD is not exempt from the risk of depegging. Market volatility, shifts in regulatory landscapes, sudden and substantial changes in the value of collateral assets, or unforeseen technical issues can precipitate a departure from its pegged value." - -#: src/hooks/useTitleMapper.tsx:17 +#: src/components/PageMarketList/index.tsx:67 msgid "The borrow rate changes with supply and demand for crvUSD, reflected in the price and total debt versus PegKeeper debt. Rates increase to encourage debt reduction, and decrease to encourage borrowing." msgstr "The borrow rate changes with supply and demand for crvUSD, reflected in the price and total debt versus PegKeeper debt. Rates increase to encourage debt reduction, and decrease to encourage borrowing." -#: src/components/PageDisclaimer/Page.tsx:169 -msgid "The borrowing rate is algorithmically determined based on several factors, including" -msgstr "The borrowing rate is algorithmically determined based on several factors, including" - -#: src/components/PageDisclaimer/Page.tsx:175 -msgid "the crvUSD price as reported by an on-chain price aggregator contract," -msgstr "the crvUSD price as reported by an on-chain price aggregator contract," - -#: src/components/PageDisclaimer/Page.tsx:364 -msgid "The crvUSD protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including deploying new crvUSD markets, setting implementation contracts, and setting parameters that influence market behavior." -msgstr "The crvUSD protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including deploying new crvUSD markets, setting implementation contracts, and setting parameters that influence market behavior." - -#: src/components/PageDisclaimer/Page.tsx:419 -msgid "The data and communications made available on the crvUSD platform, including but not limited to its front-end interfaces, are intended purely for informational purposes and should not under any circumstances be interpreted as constituting investment, financial, trading, legal, or any form of professional advice. The content provided through the crvUSD front-end interface(s) is designed to support users' understanding of the stablecoin, the protocol, and its functionalities, not to guide or influence decision-making regarding investments or financial strategies. Users must be aware that they are the only entity capable of adequately assessing whether an action taken aligns with their financial objectives and circumstances." -msgstr "The data and communications made available on the crvUSD platform, including but not limited to its front-end interfaces, are intended purely for informational purposes and should not under any circumstances be interpreted as constituting investment, financial, trading, legal, or any form of professional advice. The content provided through the crvUSD front-end interface(s) is designed to support users' understanding of the stablecoin, the protocol, and its functionalities, not to guide or influence decision-making regarding investments or financial strategies. Users must be aware that they are the only entity capable of adequately assessing whether an action taken aligns with their financial objectives and circumstances." - -#: src/components/PageIntegrations/Page.tsx:42 +#: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." -#: src/components/DetailInfoHealth.tsx:119 -#: src/hooks/useTitleMapper.tsx:28 +#: src/components/DetailInfoHealth.tsx:116 msgid "The loan metric indicates the current health of your position." msgstr "The loan metric indicates the current health of your position." -#: src/components/PageDisclaimer/Page.tsx:390 -msgid "The ongoing development, maintenance, and scalability of the crvUSD protocol is dependent on developers' contributions. While numerous developers are currently engaged in the project, there is no assurance that this level of contribution will persist indefinitely. The future involvement of developers is subject to change due to a variety of factors that could influence their capacity or willingness to contribute." -msgstr "The ongoing development, maintenance, and scalability of the crvUSD protocol is dependent on developers' contributions. While numerous developers are currently engaged in the project, there is no assurance that this level of contribution will persist indefinitely. The future involvement of developers is subject to change due to a variety of factors that could influence their capacity or willingness to contribute." - -#: src/components/DetailInfoLiqRange.tsx:95 +#: src/components/DetailInfoLiqRange.tsx:94 msgid "The range of prices where collateral is managed by the market-maker. Collateral begins to be sold off when its price enters your liquidation range (\"soft liquidation\"). If the market-maker cannot keep the position sufficiently collateralized, an externally triggered \"hard\" liquidation may take place." msgstr "The range of prices where collateral is managed by the market-maker. Collateral begins to be sold off when its price enters your liquidation range (\"soft liquidation\"). If the market-maker cannot keep the position sufficiently collateralized, an externally triggered \"hard\" liquidation may take place." -#: src/components/PageDisclaimer/Page.tsx:178 -msgid "the ratio of Pegkeeper debt to total outstanding debt," -msgstr "the ratio of Pegkeeper debt to total outstanding debt," - #: src/hooks/useTokenAlert.tsx:34 msgid "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown. This is out of our control, but we will do everything in our power to make sure the peg of Ren assets is maintained." msgstr "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown. This is out of our control, but we will do everything in our power to make sure the peg of Ren assets is maintained." -#: src/components/PageDisclaimer/Page.tsx:238 -msgid "The value of the crypto assets used as collateral for crvUSD is subject to high levels of volatility and unpredictability. The pricing of these assets may be extremely speculative and prone to rapid fluctuations. Such market characteristics can impact the stability of crvUSD’s value. While the LLAMMA algorithm aims to adjust collateral levels to support crvUSD’s value, there is no guarantee that these adjustments will always preserve stability, especially during periods of extreme market volatility." -msgstr "The value of the crypto assets used as collateral for crvUSD is subject to high levels of volatility and unpredictability. The pricing of these assets may be extremely speculative and prone to rapid fluctuations. Such market characteristics can impact the stability of crvUSD’s value. While the LLAMMA algorithm aims to adjust collateral levels to support crvUSD’s value, there is no guarantee that these adjustments will always preserve stability, especially during periods of extreme market volatility." - -#: src/components/PageDisclaimer/Page.tsx:199 -msgid "There may be assumptions in the Monetary Policy design that, in some circumstances, cause interest rates to produce undesired outcomes, and which may cause a sub-optimal experience for borrowers. In general, interest rates on borrowing may change dramatically in response to changing market circumstances, and may not reflect a borrower's expectations when they had opened their position." -msgstr "There may be assumptions in the Monetary Policy design that, in some circumstances, cause interest rates to produce undesired outcomes, and which may cause a sub-optimal experience for borrowers. In general, interest rates on borrowing may change dramatically in response to changing market circumstances, and may not reflect a borrower's expectations when they had opened their position." - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:102 -msgid "There was an error fetching the pool activity data." -msgstr "There was an error fetching the pool activity data." - -#: src/hooks/useTitleMapper.tsx:55 +#: src/components/LoanInfoUser/index.tsx:238 msgid "This metric measures the loss in collateral value caused by LLAMMA's soft liquidation process, which is activated when the oracle price falls within a user’s liquidation range." msgstr "This metric measures the loss in collateral value caused by LLAMMA's soft liquidation process, which is activated when the oracle price falls within a user’s liquidation range." -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:74 -msgid "Time" -msgstr "Time" - #: src/domain/components/loan-collateral-list/index.tsx:56 #~ msgid "Total borrowed" #~ msgstr "Total borrowed" #: src/components/PageMarketList/index.tsx:74 -#~ msgid "Total collateral value" -#~ msgstr "Total collateral value" +msgid "Total collateral value" +msgstr "Total collateral value" #: src/components/PageMarketList/index.tsx:71 -#~ msgid "Total debt" -#~ msgstr "Total debt" +msgid "Total debt" +msgstr "Total debt" #: src/components/LoanInfoUser/index.tsx:296 -#~ msgid "Total debt:" -#~ msgstr "Total debt:" +msgid "Total debt:" +msgstr "Total debt:" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:146 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:138 msgid "Total position collateral:" msgstr "Total position collateral:" -#: src/layout/Header.tsx:98 -msgid "Total Supply" -msgstr "Total Supply" - #: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoTradeRoutes.tsx:42 msgid "Trade routed through:" msgstr "Trade routed through:" @@ -1178,7 +817,6 @@ msgid "Transaction complete" msgstr "Transaction complete" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:126 -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:45 msgid "Transaction complete." msgstr "Transaction complete." @@ -1190,11 +828,11 @@ msgstr "Transaction complete. This loan is paid-off and will no longer be manage msgid "Transaction complete. This loan is payoff and will no longer be manageable." msgstr "Transaction complete. This loan is payoff and will no longer be manageable." -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:125 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:121 msgid "Transaction complete. This loan will no longer exist. Click <0>here to go back to collateral list." msgstr "Transaction complete. This loan will no longer exist. Click <0>here to go back to collateral list." -#: src/layout/Footer.tsx:30 +#: src/layout/Footer.tsx:25 msgid "Twitter" msgstr "Twitter" @@ -1242,7 +880,7 @@ msgid "Unable to get total supply" msgstr "Unable to get total supply" #: src/components/DetailInfoEstimateGas.tsx:78 -#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:47 +#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:26 msgid "Unable to get USD rate" msgstr "Unable to get USD rate" @@ -1263,33 +901,17 @@ msgstr "Unable to self liquidate" msgid "Unable to swap" msgstr "Unable to swap" -#: src/components/PageDisclaimer/Page.tsx:216 -msgid "Users should be aware that ample crvUSD liquidity on exchange is necessary for facilitating liquidations. Circumstances leading to a reduction in the available crvUSD liquidity for liquidators are plausible. Such scenarios can significantly impact the proper functioning of the stablecoin market, particularly concerning the process of liquidation." -msgstr "Users should be aware that ample crvUSD liquidity on exchange is necessary for facilitating liquidations. Circumstances leading to a reduction in the available crvUSD liquidity for liquidators are plausible. Such scenarios can significantly impact the proper functioning of the stablecoin market, particularly concerning the process of liquidation." - -#: src/components/PageDisclaimer/Page.tsx:107 -msgid "Users should be cautious about collateral management, as a sharp decline in the price of the collateral within a brief period can escalate losses, further deteriorating the health of the loan. Respectively, an increase in the collateral's value while in soft-liquidation can also cause “de-liquidation losses” - a situation where an appreciating market price for the collateral may negatively impact the loan’s health. During periods of high volatility and/or high Ethereum gas prices, arbitrage may be less efficient, causing losses incurred from soft liquidation to be exacerbated." -msgstr "Users should be cautious about collateral management, as a sharp decline in the price of the collateral within a brief period can escalate losses, further deteriorating the health of the loan. Respectively, an increase in the collateral's value while in soft-liquidation can also cause “de-liquidation losses” - a situation where an appreciating market price for the collateral may negatively impact the loan’s health. During periods of high volatility and/or high Ethereum gas prices, arbitrage may be less efficient, causing losses incurred from soft liquidation to be exacerbated." - -#: src/components/PageMarketList/index.tsx:161 +#: src/components/PageMarketList/index.tsx:174 msgid "view all collateral." msgstr "view all collateral." -#: src/components/PageMarketList/components/TableCellMarketsTotalDebt.tsx:31 -msgid "View details" -msgstr "View details" - -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:45 -msgid "View:" -msgstr "View:" - #: src/layout/HeaderMobile.tsx:136 -#~ msgid "Visit Curve.fi" -#~ msgstr "Visit Curve.fi" +msgid "Visit Curve.fi" +msgstr "Visit Curve.fi" #: src/components/LoanInfoUser/index.tsx:307 -#~ msgid "Wallet Balances" -#~ msgstr "Wallet Balances" +msgid "Wallet Balances" +msgstr "Wallet Balances" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:362 msgid "WARNING: The corresponding deleverage button is also not yet available." @@ -1307,18 +929,14 @@ msgstr "Warning!" msgid "Warning! Exchange rate is too low!" msgstr "Warning! Exchange rate is too low!" -#: src/layout/Footer.tsx:106 +#: src/layout/Footer.tsx:83 msgid "Whitepaper" msgstr "Whitepaper" -#: src/layout/Footer.tsx:62 +#: src/layout/Footer.tsx:57 msgid "Wiki CN" msgstr "Wiki CN" -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:54 -msgid "Withdrawal" -msgstr "Withdrawal" - #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:29 msgid "x-axis display" msgstr "x-axis display" @@ -1327,7 +945,7 @@ msgstr "x-axis display" #~ msgid "You are in soft-liquidation mode. The amount currently at risk is {0} {1}. In this mode, you cannot withdraw collateral or add more to your position. To exit self-liquidation mode you can repay or self-liquidate." #~ msgstr "You are in soft-liquidation mode. The amount currently at risk is {0} {1}. In this mode, you cannot withdraw collateral or add more to your position. To exit self-liquidation mode you can repay or self-liquidate." -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:32 +#: src/components/LoanInfoUser/index.tsx:174 msgid "You are in soft-liquidation mode. The amount currently at risk is {softLiquidationAmountText}. In this mode, you cannot partially withdraw or add more collateral to your position. To reduce the risk of hard liquidation, you can repay or, to exit soft liquidation, you can close (self-liquidate)." msgstr "You are in soft-liquidation mode. The amount currently at risk is {softLiquidationAmountText}. In this mode, you cannot partially withdraw or add more collateral to your position. To reduce the risk of hard liquidation, you can repay or, to exit soft liquidation, you can close (self-liquidate)." @@ -1335,7 +953,7 @@ msgstr "You are in soft-liquidation mode. The amount currently at risk is {softL msgid "You are not in liquidation mode." msgstr "You are not in liquidation mode." -#: src/components/DetailInfoHealth.tsx:188 +#: src/components/DetailInfoHealth.tsx:178 msgid "You are still close to soft liquidation." msgstr "You are still close to soft liquidation." @@ -1359,15 +977,15 @@ msgstr "You have a balance in this pool" msgid "You have a high price impact {priceImpact}%!" msgstr "You have a high price impact {priceImpact}%!" -#: src/components/PageLoanManage/Page.tsx:73 -#: src/components/PageLoanManage/Page.tsx:75 +#: src/components/PageLoanManage/Page.tsx:57 +#: src/components/PageLoanManage/Page.tsx:60 msgid "Your Loan Details" msgstr "Your Loan Details" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:38 msgid "Your loan will be paid off" msgstr "Your loan will be paid off" -#: src/layout/Footer.tsx:50 +#: src/layout/Footer.tsx:45 msgid "YouTube" msgstr "YouTube" diff --git a/apps/loan/src/locales/pseudo/messages.po b/apps/loan/src/locales/pseudo/messages.po index 05a6ce990..622d1f5b3 100644 --- a/apps/loan/src/locales/pseudo/messages.po +++ b/apps/loan/src/locales/pseudo/messages.po @@ -17,14 +17,14 @@ msgstr "" msgid "(Soft liquidation)" msgstr "" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "{0}" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:286 #: src/components/PageLoanManage/CollateralIncrease/index.tsx:242 #: src/components/PageLoanManage/LoanDecrease/index.tsx:228 -#: src/components/PageLoanManage/LoanIncrease/index.tsx:299 +#: src/components/PageLoanManage/LoanIncrease/index.tsx:301 msgid "{0} Avail." msgstr "" @@ -45,51 +45,19 @@ msgstr "" msgid "{0} borrow amount" msgstr "" -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "{rCollateralId}" msgstr "" -#: src/components/LoanInfoUser/components/UserInfoLoss.tsx:62 -msgid "*current balance minus losses" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:54 +#: src/components/LoanInfoUser/index.tsx:237 msgid "% lost" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:317 -msgid "<0>Anonymity: The degree of anonymity provided by blockchain technology can complicate the tracing of funds and the identification of parties in transactions." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:331 -msgid "<0>Cybersecurity Incidents: The digital nature of crypto assets makes them a target for hackers, malicious actors, and other cybersecurity threats. Failures, hacks, exploits, protocol errors, and unforeseen vulnerabilities can compromise the security of assets, resulting in theft, loss, or unauthorized access." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:310 -msgid "<0>Irreversibility of Transactions: Once executed, transactions in crypto assets cannot be reversed. Errors or accidental transactions cannot be easily rectified, potentially leading to permanent loss of assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:339 -msgid "<0>Operational Challenges: The process of recording and settling transactions on a blockchain depends on the network's stability and performance. Disruptions, high transaction volumes, or network congestion can delay settlement times, affecting the liquidity and availability of assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:323 -msgid "<0>Software Dependencies: Crypto asset operations rely heavily on the flawless functioning of complex software, including wallets, smart contracts, and blockchain networks. Any defects, bugs, or vulnerabilities in software can impair access to or use of crypto assets, leading to potential losses." -msgstr "" - #: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:21 msgid "A" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:354 -msgid "Access Control" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 -msgid "Action" -msgstr "" - -#: src/components/PageLoanManage/index.tsx:54 +#: src/components/PageLoanManage/index.tsx:50 msgid "Add" msgstr "" @@ -105,13 +73,11 @@ msgstr "" msgid "Adjust N:" msgstr "" -#: src/components/AdvancedSettings.tsx:134 +#: src/components/AdvancedSettings.tsx:130 msgid "Advanced Settings" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:57 -#: src/components/LoanInfoLlamma/index.tsx:50 +#: src/components/LoanInfoLlamma/index.tsx:94 msgid "AMM" msgstr "" @@ -127,30 +93,22 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Approve Spending" msgstr "" -#: src/layout/Header.tsx:193 -msgid "Apps" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Asc" msgstr "" -#: src/layout/Footer.tsx:109 +#: src/layout/Footer.tsx:86 msgid "Audits" msgstr "" -#: src/hooks/useTitleMapper.tsx:20 -msgid "Available" -msgstr "" - #: src/components/PageMarketList/index.tsx:73 -#~ msgid "Available to borrow" -#~ msgstr "" +msgid "Available to borrow" +msgstr "" #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:37 msgid "band" @@ -161,16 +119,16 @@ msgstr "" msgid "Band {n}" msgstr "" -#: src/hooks/useTitleMapper.tsx:41 +#: src/components/LoanInfoUser/index.tsx:208 msgid "Band range" msgstr "" -#: src/components/DetailInfoLiqRange.tsx:137 +#: src/components/DetailInfoLiqRange.tsx:136 msgid "Band range:" msgstr "" -#: src/components/LoanInfoLlamma/components/DetailsBandsChart.tsx:73 -#: src/components/LoanInfoUser/components/ChartUserBands.tsx:80 +#: src/components/LoanInfoLlamma/index.tsx:86 +#: src/components/LoanInfoUser/index.tsx:260 msgid "Bands" msgstr "" @@ -187,11 +145,10 @@ msgstr "" #~ msgstr "" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:12 msgid "Borrow" msgstr "" -#: src/components/PageLoanManage/index.tsx:48 +#: src/components/PageLoanManage/index.tsx:44 msgid "Borrow more" msgstr "" @@ -199,8 +156,10 @@ msgstr "" msgid "Borrow more anyway" msgstr "" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:46 -#: src/hooks/useTitleMapper.tsx:16 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:48 +#: src/components/LoanInfoUser/index.tsx:196 +#: src/components/LoanInfoUser/index.tsx:215 +#: src/components/PageMarketList/index.tsx:66 msgid "Borrow rate" msgstr "" @@ -209,27 +168,18 @@ msgid "Borrow rate:" msgstr "" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:21 msgid "Borrowed" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:96 -msgid "Borrowers in the crvUSD ecosystem are subject to specific risks associated with the liquidation process. It is crucial to understand that if the User’s collateral is placed into soft-liquidation mode, they are prohibited from withdrawing the collateral or augmenting their position with additional collateral. Entering soft-liquidation mode locks the collateral, removing the option to withdraw or add to it. In case market conditions suggest a strategic adjustment to the User’s position, they may face exacerbated risk due to such restrictions." -msgstr "" - #: src/domain/components/DetailInfoHealth.tsx:180 #~ msgid "Borrowing {0} will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:194 +#: src/components/DetailInfoHealth.tsx:184 msgid "Borrowing {formattedAmount} will put you close to soft liquidation." msgstr "" -#: src/layout/Footer.tsx:100 -msgid "Branding" -msgstr "" - -#: src/layout/Footer.tsx:115 +#: src/layout/Footer.tsx:92 msgid "Bug Bounty" msgstr "" @@ -241,28 +191,20 @@ msgstr "" msgid "Cancel" msgstr "" -#: src/hooks/useTitleMapper.tsx:22 +#: src/components/PageMarketList/index.tsx:72 msgid "Cap" msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:252 -#: src/components/ChartOhlcWrapper/index.tsx:279 -#: src/components/ChartOhlcWrapper/index.tsx:308 -msgid "Chart" -msgstr "" - -#: src/components/DetailInfoHealth.tsx:206 +#: src/components/DetailInfoHealth.tsx:196 msgid "Close to liquidation range!" msgstr "" -#: src/layout/Footer.tsx:37 -#: src/layout/Footer.tsx:55 +#: src/layout/Footer.tsx:32 +#: src/layout/Footer.tsx:50 msgid "CN" msgstr "" -#: src/components/PageLoanManage/index.tsx:36 -#: src/hooks/useTitleMapper.tsx:11 -#: src/hooks/useTitleMapper.tsx:46 +#: src/components/PageLoanManage/index.tsx:38 msgid "Collateral" msgstr "" @@ -278,19 +220,11 @@ msgstr "" msgid "Collateral Removed" msgstr "" -#: src/hooks/useTitleMapper.tsx:23 -msgid "Collateral value" -msgstr "" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:41 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:39 msgid "Collateral:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:79 -msgid "Collateralized debt positions are managed passively through arbitrage opportunities: if the collateral's price decreases, the system automatically sells off collateral to arbitrageurs in a ‘soft-liquidation mode’. If the collateral's price increases, the system recovers the collateral. This algorithm is designed to dynamically adjust the collateral backing each crvUSD in real-time, responding to fluctuating market conditions. While this approach is intended to mitigate the severity of traditional liquidations—a process where collateral becomes insufficient, leading to irreversible sales at potentially undervalued prices—it does not eliminate the inherent risk of collateral volatility. Additional information can be found on <0>LLAMMA Overview." -msgstr "" - -#: src/layout/Header.tsx:194 +#: src/layout/HeaderMobile.tsx:140 msgid "Community" msgstr "" @@ -300,51 +234,31 @@ msgstr "" msgid "Confirm warning to proceed." msgstr "" -#: src/components/PageLoanCreate/Page.tsx:225 -#: src/components/PageLoanManage/Page.tsx:228 -msgid "Connect" -msgstr "" - #: src/domain/layout/index.tsx:68 #~ msgid "Connect wallet" #~ msgstr "" -#: src/components/LoanFormConnect.tsx:30 +#: src/components/ConnectWallet.tsx:51 +#: src/components/LoanFormConnect.tsx:25 msgid "Connect Wallet" msgstr "" -#: src/components/PageLoanCreate/Page.tsx:224 -#: src/components/PageLoanManage/Page.tsx:227 -msgid "Connect your wallet to view market" -msgstr "" - -#: src/components/PageLoanCreate/Page.tsx:226 -#: src/components/PageLoanManage/Page.tsx:229 -msgid "Connecting" -msgstr "" - -#: src/components/LoanInfoLlamma/index.tsx:46 -#: src/layout/Footer.tsx:112 +#: src/components/LoanInfoLlamma/index.tsx:93 +#: src/layout/Footer.tsx:89 msgid "Contracts" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:64 -#: src/components/LoanInfoLlamma/index.tsx:56 +#: src/components/LoanInfoLlamma/index.tsx:98 msgid "Controller" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:351 -msgid "Counterparty Risks" -msgstr "" - -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "Create" msgstr "" -#: src/components/PageLoanCreate/index.tsx:26 +#: src/components/PageLoanCreate/index.tsx:30 #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:174 -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Create Loan" msgstr "" @@ -352,183 +266,77 @@ msgstr "" msgid "Creating a leverage loan means you will not receive any crvUSD to your address and will instead assume a significantly larger debt position." msgstr "" -#: src/layout/Footer.tsx:72 -msgid "Crvhub" -msgstr "" - #: src/layout/HeaderMobile.tsx:189 #: src/layout/HeaderSecondary.tsx:49 -#~ msgid "crvUSD" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:288 -msgid "crvUSD and its underlying infrastructure are in an early stage of development, are inherently experimental, and carry a significant degree of risk. Engagement with crvUSD during this phase should be approached with the understanding that it may lead to partial or complete loss of funds. Users considering minting, redeeming, or utilizing crvUSD should be prepared for the possibility of encountering technical issues, bugs, or vulnerabilities that could impact the value of crvUSD or the safety of allocated crypto assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:67 -msgid "crvUSD Design Risks" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:376 -msgid "crvUSD functions in a decentralized way, with its issuance and operational mechanics governed exclusively by smart contracts, without reliance on any intermediaries. While the adjustment of stablecoin critical parameters is subject to Curve DAO approvals, Users must understand that Curve DAO does not act as a broker, agent, advisor, or in any fiduciary capacity towards crvUSD users. Consequently, Curve DAO bears no obligation to ensure that the use of crvUSD aligns with each one’s financial objectives, strategies, or risk tolerance levels." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:69 -msgid "crvUSD has unique design features that Users should fully understand before interacting with the protocol." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:406 -msgid "crvUSD is not recognized as a legal tender by any government authority, central bank, or legal jurisdiction. Users should be aware that the lack of legal tender status means that no statutory, governmental, or corporate entity is obligated to accept the stablecoin as payment for goods, services, debts, or other obligations. The regulatory environment around crypto assets and stablecoins remains fluid and subject to change across jurisdictions. This poses a risk that the legal status of the stablecoin could be altered, potentially affecting its use, transfer, holding, and value." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:154 -msgid "crvUSD makes use of Pegkeepers, contracts authorized to deposit and withdraw crvUSD from a whitelisted Curve crvUSD stableswap pool up to a predefined debt cap. These contracts reference a subset of whitelisted stablecoins as a proxy for the intended USD price. Instability affecting any counterparty Pegkeeper assets (e.g. USDT, USDC), which are also used to aggregate a USD price for crvUSD, may cause the Pegkeeper to deposit all of its crvUSD into the pool in an attempt to rebalance. This creates a dependency on the Pegkeeper counterparty assets that determines the stability of the crvUSD peg. An upgraded PegkeeperV2 design promises to alleviate this risk." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:356 -msgid "crvUSD markets (Controller smart contracts) are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and minters always retain full control and responsibility over their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." +msgid "crvUSD" msgstr "" #: src/layout/Header.tsx:78 #: src/layout/HeaderMobile.tsx:135 -#~ msgid "crvUSD Pools" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:224 -msgid "crvUSD relies on liquidity concentrated within particular Pegkeeper pools, which serve a dual purpose as both a source of liquidity and price feeds for crvUSD oracles. If the incentives for depositing crvUSD into these pools are insufficient, the liquidity shortfalls can result in missed liquidations or deflationary price spirals (cascading liquidations). This phenomenon occurs when initial liquidations fail to be executed effectively, leading to a domino effect of further liquidations and potentially rapid, significant decreases in asset prices." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:267 -msgid "crvUSD relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. Users need to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:61 -msgid "crvUSD smart contract Audits" +msgid "crvUSD Pools" msgstr "" #: src/layout/HeaderMobile.tsx:180 #: src/layout/HeaderSecondary.tsx:41 -#~ msgid "crvUSD Total Supply" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:57 -msgid "crvUSD Whitepaper" +msgid "crvUSD Total Supply" msgstr "" -#: src/hooks/useTitleMapper.tsx:48 +#: src/components/LoanInfoUser/index.tsx:225 msgid "Current balance (est.) / Deposited" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:132 -msgid "Curve incorporates specialized on-chain Exponential Moving Average (EMA) oracles built into stabelswap-ng, tricrypto-ng, and twocrypto-ng Curve pool implementations. crvUSD markets derive price information from a select number of high TVL Curve pools. By utilizing the EMA smoothing methodology, oracles mitigate the impact of transient price fluctuations, aiming to reduce unnecessary losses caused by short-term market volatility or attempts to manipulate the oracle. Despite the manipulation-resistant design specification, Curve pool oracles may exhibit price distortions in certain scenarios that have the potential to result in missed or excessive liquidations. This may be a result of liquidity and volume migration to alternate venues that increase the risk of oracle manipulation. A detailed explanation of the aforementioned terms can be found in the <0>crvUSD Oracle documentation." -msgstr "" - -#: src/layout/Footer.tsx:69 +#: src/layout/Footer.tsx:64 msgid "Curve Monitor" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:130 -msgid "Curve Pool EMA Oracles" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:276 -msgid "Curve smart contracts have undergone multiple audits by reputable firms, including MixBytes and ChainSecurity, to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:47 -msgid "Curve stablecoin infrastructure enables users to mint crvUSD using a selection of crypto-tokenized collaterals (adding new ones is subject to DAO approval). Interacting with crvUSD doesn't come without risks. Before minting or taking exposure of crvUSD, it is best to research and understand the risks involved." -msgstr "" - -#: src/components/AdvancedSettings.tsx:189 +#: src/components/AdvancedSettings.tsx:185 msgid "Custom" msgstr "" -#: src/layout/Header.tsx:97 -msgid "Daily volume" -msgstr "" - -#: src/components/LoanInfoUser/components/UserInfoDebt.tsx:25 #: src/components/PageLoanManage/LoanDecrease/index.tsx:258 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:308 -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:40 msgid "Debt" msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:41 -msgid "Debt Ceiling" -msgstr "" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:40 -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:44 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:43 msgid "Debt:" msgstr "" -#: src/components/PageLoanManage/index.tsx:37 +#: src/components/PageLoanManage/index.tsx:39 msgid "Deleverage" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:249 -msgid "Depegging Risk" -msgstr "" - -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:31 -msgid "Deposit" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Desc" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:388 -msgid "Developer Dependency" -msgstr "" - -#: src/layout/Footer.tsx:97 +#: src/layout/Footer.tsx:103 msgid "Developer Docs" msgstr "" -#: src/components/PageMarketList/index.tsx:152 +#: src/components/PageMarketList/index.tsx:165 msgid "Didn't find what you're looking for?" msgstr "" -#: src/components/AdvancedSettings.tsx:139 +#: src/components/AdvancedSettings.tsx:135 msgid "Discard" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:435 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "" - -#: src/layout/Footer.tsx:47 +#: src/layout/Footer.tsx:42 msgid "Discord" msgstr "" -#: src/layout/Footer.tsx:43 +#: src/layout/Footer.tsx:38 msgid "Dodo" msgstr "" -#: src/layout/Footer.tsx:66 +#: src/layout/Footer.tsx:61 msgid "Dune Analytics" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:167 -msgid "Dynamic Interest Rates" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:302 -msgid "Engaging with crypto assets involves exposure to a range of technological risks inherent to the use of new and evolving technologies. Users must be aware of key risk factors (as outlined below) and consider their implications for crypto asset transactions." -msgstr "" - #: src/components/Page404/Page.tsx:11 -#~ msgid "Error 404" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:186 -msgid "Essentially, the borrow rate increases when the price of crvUSD goes lower and/or the proportion of Pegkeeper debt to total debt reduces. This process is intended to dynamically regulate market behavior such that it reinforces the crvUSD peg. Changes to the Monetary Policy are authorized only by the Curve DAO. A <0>crvUSD rate tool by 0xReviews allows Users to visualize the influence of these factors on the borrowing rate." -msgstr "" - -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:69 -msgid "Est. update profit:" +msgid "Error 404" msgstr "" #: src/components/DetailInfoEstimateGas.tsx:61 @@ -539,75 +347,46 @@ msgstr "" msgid "Estimated TX cost:" msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:291 -#: src/components/PageLoanCreate/Page.tsx:182 -#: src/components/PageLoanManage/Page.tsx:166 -msgid "Expand chart" -msgstr "" - #: src/layout/Footer.tsx:95 -#~ msgid "FAQ" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:300 -msgid "General Blockchain Technology Risks" +msgid "FAQ" msgstr "" -#: src/layout/Footer.tsx:94 +#: src/layout/Footer.tsx:114 msgid "Github" msgstr "" -#: src/components/DetailInfoHealth.tsx:121 -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:34 -#: src/hooks/useTitleMapper.tsx:30 -msgid "Hard liquidation is triggered when health is 0 or below." -msgstr "" - #: src/components/LoanInfoUser/index.tsx:185 -#~ msgid "Health" -#~ msgstr "" - -#: src/hooks/useTitleMapper.tsx:39 -msgid "Health %" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:25 -msgid "Health status" +msgid "Health" msgstr "" -#: src/components/DetailInfoHealth.tsx:115 +#: src/components/DetailInfoHealth.tsx:113 msgid "Health:" msgstr "" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 msgid "High price impact:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:119 -msgid "If the health of the loan falls to zero, the position is subject to hard liquidation, which is an irreversible process resulting in the loss of the collateral with no possibility of recovery or de-liquidation. This scenario underscores the critical need for risk management when using leverage. Leverage and collateral management should be approached with caution, reflecting a balanced assessment of potential gains against the risk of significant financial loss." -msgstr "" - #: src/domain/components/DetailInfoHealth.tsx:182 #~ msgid "Increasing your borrowed amount by {0} will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:196 +#: src/components/DetailInfoHealth.tsx:186 msgid "Increasing your borrowed amount by {formattedAmount} will put you close to soft liquidation." msgstr "" -#: src/components/PageIntegrations/Page.tsx:37 -#: src/layout/Footer.tsx:103 -#: src/layout/Header.tsx:74 -#: src/layout/Header.tsx:80 +#: src/components/PageIntegrations/Page.tsx:38 +#: src/layout/Footer.tsx:99 +#: src/layout/Header.tsx:42 msgid "Integrations" msgstr "" -#: src/components/PageMarketList/index.tsx:154 +#: src/components/PageMarketList/index.tsx:167 msgid "Join the Telegram" msgstr "" -#: src/components/PageLoanCreate/index.tsx:27 +#: src/components/PageLoanCreate/index.tsx:31 msgid "Leverage" msgstr "" @@ -620,15 +399,16 @@ msgstr "" #~ msgstr "" #: src/components/ChartLiquidationRange/index.tsx:92 -#: src/hooks/useTitleMapper.tsx:40 +#: src/components/LoanInfoUser/index.tsx:164 +#: src/components/LoanInfoUser/index.tsx:205 msgid "Liquidation range" msgstr "" -#: src/components/LoanInfoUser/index.tsx:72 +#: src/components/LoanInfoUser/index.tsx:266 msgid "Liquidation Range" msgstr "" -#: src/components/DetailInfoLiqRange.tsx:101 +#: src/components/DetailInfoLiqRange.tsx:100 msgid "Liquidation range:" msgstr "" @@ -636,10 +416,6 @@ msgstr "" msgid "Liquidation range{0}" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:214 -msgid "Liquidity Risk" -msgstr "" - #: src/domain/layout/Footer.tsx:62 #~ msgid "Llama Airforce" #~ msgstr "" @@ -648,23 +424,19 @@ msgstr "" msgid "LLAMMA {collateralName} Avail." msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:286 -msgid "LLAMMA Activity" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:58 +#: src/components/LoanInfoUser/index.tsx:281 msgid "LLAMMA Balances" msgstr "" -#: src/components/PageLoanManage/Page.tsx:72 +#: src/components/PageLoanManage/Page.tsx:58 msgid "LLAMMA Details" msgstr "" -#: src/components/LoanFormConnect.tsx:34 +#: src/components/LoanFormConnect.tsx:29 msgid "Loading" msgstr "" -#: src/components/PageLoanManage/index.tsx:35 +#: src/components/PageLoanManage/index.tsx:37 msgid "Loan" msgstr "" @@ -672,7 +444,7 @@ msgstr "" msgid "Loan Created" msgstr "" -#: src/components/LoanInfoLlamma/index.tsx:67 +#: src/components/LoanInfoLlamma/index.tsx:109 msgid "Loan parameters" msgstr "" @@ -684,26 +456,21 @@ msgstr "" msgid "Loan to Value ratio:" msgstr "" -#: src/hooks/useTitleMapper.tsx:52 +#: src/components/LoanInfoUser/index.tsx:233 msgid "Loss amount" msgstr "" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "Manage" msgstr "" -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Manage Loan" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:212 -msgid "Market Risks" -msgstr "" - -#: src/components/PageMarketList/Page.tsx:34 -#: src/hooks/useTitleMapper.tsx:10 -#: src/layout/Header.tsx:72 -#: src/layout/Header.tsx:79 +#: src/components/PageMarketList/index.tsx:60 +#: src/components/PageMarketList/Page.tsx:33 +#: src/layout/Header.tsx:40 msgid "Markets" msgstr "" @@ -711,78 +478,54 @@ msgstr "" msgid "Max borrow amount" msgstr "" -#: src/components/AdvancedSettings.tsx:159 +#: src/components/AdvancedSettings.tsx:155 msgid "Max Slippage" msgstr "" -#: src/components/AdvancedSettings.tsx:161 +#: src/components/AdvancedSettings.tsx:157 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "" -#: src/components/AdvancedSettings.tsx:116 +#: src/components/AdvancedSettings.tsx:115 msgid "Min. slippage is 0.01%" msgstr "" #: src/layout/HeaderMobile.tsx:164 -#~ msgid "Mode" -#~ msgstr "" +msgid "Mode" +msgstr "" -#: src/components/LoanInfoLlamma/index.tsx:61 +#: src/components/LoanInfoLlamma/index.tsx:103 msgid "Monetary Policy" msgstr "" -#: src/hooks/useTitleMapper.tsx:13 +#: src/components/PageMarketList/index.tsx:62 msgid "My debt" msgstr "" -#: src/hooks/useTitleMapper.tsx:14 +#: src/components/PageMarketList/index.tsx:61 msgid "My health" msgstr "" -#: src/components/DetailInfoN.tsx:13 +#: src/components/DetailInfoN.tsx:10 msgid "N:" msgstr "" -#: src/layout/Footer.tsx:118 +#: src/layout/Footer.tsx:106 msgid "News" msgstr "" -#: src/components/PageMarketList/index.tsx:159 +#: src/components/PageMarketList/index.tsx:172 msgid "No collateral found for \"{0}\". Feel free to search other tabs, or" msgstr "" -#: src/components/PageMarketList/index.tsx:166 +#: src/components/PageMarketList/index.tsx:179 msgid "No collateral found in this category" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:374 -msgid "No Control" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:87 -msgid "No controller data found." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:236 -msgid "No Guarantee of Price Stability" -msgstr "" - #: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:417 -msgid "No Investment and Legal Advice" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:286 -msgid "No Loss Prevention" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:80 -msgid "No trades data found." -msgstr "" - #: src/components/LoanFormAlertError.tsx:45 msgid "Not eligible for liquidation" msgstr "" @@ -793,13 +536,13 @@ msgstr "" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "off" -#~ msgstr "" +msgid "off" +msgstr "" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "on" -#~ msgstr "" +msgid "on" +msgstr "" #: src/components/AlertFormWarning.tsx:30 msgid "Once the loan is paid off, you will no longer be able to manage this loan." @@ -820,30 +563,14 @@ msgstr "" msgid "Oracle price" msgstr "" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:35 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:36 msgid "Oracle Price" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:37 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:35 msgid "Partial repayment LLAMMA changes:" msgstr "" -#: src/components/PagePegKeepers/Page.tsx:33 -msgid "Peg Keepers" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:152 -msgid "Pegkeepers" -msgstr "" - -#: src/components/PagePegKeepers/Page.tsx:30 -msgid "PegKeepers" -msgstr "" - -#: src/components/PageMarketList/components/TableStats.tsx:14 -msgid "PegKeepers Debt" -msgstr "" - #: src/components/PageLoanManage/LoanDecrease/index.tsx:111 msgid "Please approve a repayment of {debt} {0}." msgstr "" @@ -858,7 +585,7 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:142 #: src/components/PageLoanManage/LoanIncrease/index.tsx:162 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:103 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:99 msgid "Please approve spending of {0}" msgstr "" @@ -874,7 +601,7 @@ msgstr "" msgid "Please approve spending your {item1Name}." msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:117 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:113 msgid "Please confirm {stablecoinName} self-liquidation at max {maxSlippage}% slippage." msgstr "" @@ -902,10 +629,6 @@ msgstr "" msgid "Please confirm swapping {swapAmount} {item1Name} at max {maxSlippage} slippage." msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:39 -msgid "Please confirm update {poolName} pool" -msgstr "" - #: src/domain/layout/index.tsx:66 #~ msgid "Please connect wallet to view loan details" #~ msgstr "" @@ -914,34 +637,21 @@ msgstr "" #~ msgid "Please switch your wallet's network to <0>{0}to use Curve on <1>{1}." #~ msgstr "" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 #: src/components/PageLoanManage/LoanSwap/index.tsx:296 msgid "Price impact:" msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:75 -msgid "Profit is denominated in {poolName} LP Tokens" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:42 +#: src/components/LoanInfoUser/index.tsx:211 msgid "Range %" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:44 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:227 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:43 msgid "Receive:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:402 -msgid "Regulatory Risks" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:404 -msgid "Regulatory Uncertainty" -msgstr "" - -#: src/components/PageLoanManage/index.tsx:55 +#: src/components/PageLoanManage/index.tsx:51 msgid "Remove" msgstr "" @@ -953,7 +663,7 @@ msgstr "" #~ msgid "Removing {0} collateral, will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:192 +#: src/components/DetailInfoHealth.tsx:182 msgid "Removing {formattedAmount} collateral, will put you close to soft liquidation." msgstr "" @@ -962,7 +672,7 @@ msgstr "" msgid "Repaid" msgstr "" -#: src/components/PageLoanManage/index.tsx:49 +#: src/components/PageLoanManage/index.tsx:45 #: src/components/PageLoanManage/LoanDecrease/index.tsx:172 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:155 msgid "Repay" @@ -972,64 +682,47 @@ msgstr "" msgid "Repay anyway" msgstr "" -#: src/components/PageLoanManage/LoanDecrease/index.tsx:273 +#: src/components/PageLoanManage/LoanDecrease/index.tsx:268 msgid "Repay in full and close loan" msgstr "" -#: src/layout/Footer.tsx:91 -#: src/layout/Header.tsx:195 +#: src/layout/Footer.tsx:109 +#: src/layout/HeaderMobile.tsx:152 msgid "Resources" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:57 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:56 msgid "Return to wallet:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:41 -#: src/components/PageDisclaimer/Page.tsx:44 -#: src/layout/Header.tsx:73 -#: src/layout/Header.tsx:81 +#: src/components/PageDisclaimer/Page.tsx:28 +#: src/components/PageDisclaimer/Page.tsx:30 +#: src/layout/Header.tsx:41 msgid "Risk Disclaimer" msgstr "" -#: src/components/AdvancedSettings.tsx:151 +#: src/components/AdvancedSettings.tsx:147 msgid "Save" msgstr "" -#: src/components/PageLoanManage/index.tsx:50 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/index.tsx:46 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidate" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidated" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:207 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:203 msgid "Self-liquidation amount" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:226 -msgid "Self-liquidation amount:" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:181 -msgid "several variables set by the Monetary Policy admin" -msgstr "" - -#: src/components/DetailInfoSlippageTolerance.tsx:16 +#: src/components/DetailInfoSlippageTolerance.tsx:14 msgid "Slippage tolerance:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:265 -msgid "Smart Contract Risk" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:77 -msgid "Soft-Liquidation and Hard-Liquidation" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:68 +#: src/components/PageMarketList/components/DialogSortContent.tsx:65 msgid "Sort By" msgstr "" @@ -1037,20 +730,19 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Spending Approved" msgstr "" #: src/components/LoanInfoUser/index.tsx:178 -#~ msgid "Status" -#~ msgstr "" +msgid "Status" +msgstr "" #: src/components/DetailInfoEstimateGas.tsx:62 msgid "Step {0} of {1}" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 #: src/components/PageLoanManage/LoanSwap/index.tsx:176 msgid "Swap" msgstr "" @@ -1063,105 +755,52 @@ msgstr "" msgid "Swapped" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:263 -msgid "Technology Risk" -msgstr "" - -#: src/layout/Footer.tsx:33 +#: src/layout/Footer.tsx:28 msgid "Telegram" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:251 -msgid "The blockchain ecosystem has witnessed instances where stablecoins experienced significant and prolonged periods of depegging from their intended value. Despite the innovative measures designed to uphold price stability, crvUSD is not exempt from the risk of depegging. Market volatility, shifts in regulatory landscapes, sudden and substantial changes in the value of collateral assets, or unforeseen technical issues can precipitate a departure from its pegged value." -msgstr "" - -#: src/hooks/useTitleMapper.tsx:17 +#: src/components/PageMarketList/index.tsx:67 msgid "The borrow rate changes with supply and demand for crvUSD, reflected in the price and total debt versus PegKeeper debt. Rates increase to encourage debt reduction, and decrease to encourage borrowing." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:169 -msgid "The borrowing rate is algorithmically determined based on several factors, including" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:175 -msgid "the crvUSD price as reported by an on-chain price aggregator contract," -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:364 -msgid "The crvUSD protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including deploying new crvUSD markets, setting implementation contracts, and setting parameters that influence market behavior." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:419 -msgid "The data and communications made available on the crvUSD platform, including but not limited to its front-end interfaces, are intended purely for informational purposes and should not under any circumstances be interpreted as constituting investment, financial, trading, legal, or any form of professional advice. The content provided through the crvUSD front-end interface(s) is designed to support users' understanding of the stablecoin, the protocol, and its functionalities, not to guide or influence decision-making regarding investments or financial strategies. Users must be aware that they are the only entity capable of adequately assessing whether an action taken aligns with their financial objectives and circumstances." -msgstr "" - -#: src/components/PageIntegrations/Page.tsx:42 +#: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "" -#: src/components/DetailInfoHealth.tsx:119 -#: src/hooks/useTitleMapper.tsx:28 +#: src/components/DetailInfoHealth.tsx:116 msgid "The loan metric indicates the current health of your position." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:390 -msgid "The ongoing development, maintenance, and scalability of the crvUSD protocol is dependent on developers' contributions. While numerous developers are currently engaged in the project, there is no assurance that this level of contribution will persist indefinitely. The future involvement of developers is subject to change due to a variety of factors that could influence their capacity or willingness to contribute." -msgstr "" - -#: src/components/DetailInfoLiqRange.tsx:95 +#: src/components/DetailInfoLiqRange.tsx:94 msgid "The range of prices where collateral is managed by the market-maker. Collateral begins to be sold off when its price enters your liquidation range (\"soft liquidation\"). If the market-maker cannot keep the position sufficiently collateralized, an externally triggered \"hard\" liquidation may take place." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:178 -msgid "the ratio of Pegkeeper debt to total outstanding debt," -msgstr "" - #: src/hooks/useTokenAlert.tsx:34 msgid "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown. This is out of our control, but we will do everything in our power to make sure the peg of Ren assets is maintained." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:238 -msgid "The value of the crypto assets used as collateral for crvUSD is subject to high levels of volatility and unpredictability. The pricing of these assets may be extremely speculative and prone to rapid fluctuations. Such market characteristics can impact the stability of crvUSD’s value. While the LLAMMA algorithm aims to adjust collateral levels to support crvUSD’s value, there is no guarantee that these adjustments will always preserve stability, especially during periods of extreme market volatility." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:199 -msgid "There may be assumptions in the Monetary Policy design that, in some circumstances, cause interest rates to produce undesired outcomes, and which may cause a sub-optimal experience for borrowers. In general, interest rates on borrowing may change dramatically in response to changing market circumstances, and may not reflect a borrower's expectations when they had opened their position." -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:102 -msgid "There was an error fetching the pool activity data." -msgstr "" - -#: src/hooks/useTitleMapper.tsx:55 +#: src/components/LoanInfoUser/index.tsx:238 msgid "This metric measures the loss in collateral value caused by LLAMMA's soft liquidation process, which is activated when the oracle price falls within a user’s liquidation range." msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:74 -msgid "Time" -msgstr "" - #: src/domain/components/loan-collateral-list/index.tsx:56 #~ msgid "Total borrowed" #~ msgstr "" #: src/components/PageMarketList/index.tsx:74 -#~ msgid "Total collateral value" -#~ msgstr "" +msgid "Total collateral value" +msgstr "" #: src/components/PageMarketList/index.tsx:71 -#~ msgid "Total debt" -#~ msgstr "" +msgid "Total debt" +msgstr "" #: src/components/LoanInfoUser/index.tsx:296 -#~ msgid "Total debt:" -#~ msgstr "" - -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:146 -msgid "Total position collateral:" +msgid "Total debt:" msgstr "" -#: src/layout/Header.tsx:98 -msgid "Total Supply" +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:138 +msgid "Total position collateral:" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoTradeRoutes.tsx:42 @@ -1178,7 +817,6 @@ msgid "Transaction complete" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:126 -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:45 msgid "Transaction complete." msgstr "" @@ -1190,11 +828,11 @@ msgstr "" msgid "Transaction complete. This loan is payoff and will no longer be manageable." msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:125 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:121 msgid "Transaction complete. This loan will no longer exist. Click <0>here to go back to collateral list." msgstr "" -#: src/layout/Footer.tsx:30 +#: src/layout/Footer.tsx:25 msgid "Twitter" msgstr "" @@ -1242,7 +880,7 @@ msgid "Unable to get total supply" msgstr "" #: src/components/DetailInfoEstimateGas.tsx:78 -#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:47 +#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:26 msgid "Unable to get USD rate" msgstr "" @@ -1263,33 +901,17 @@ msgstr "" msgid "Unable to swap" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:216 -msgid "Users should be aware that ample crvUSD liquidity on exchange is necessary for facilitating liquidations. Circumstances leading to a reduction in the available crvUSD liquidity for liquidators are plausible. Such scenarios can significantly impact the proper functioning of the stablecoin market, particularly concerning the process of liquidation." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:107 -msgid "Users should be cautious about collateral management, as a sharp decline in the price of the collateral within a brief period can escalate losses, further deteriorating the health of the loan. Respectively, an increase in the collateral's value while in soft-liquidation can also cause “de-liquidation losses” - a situation where an appreciating market price for the collateral may negatively impact the loan’s health. During periods of high volatility and/or high Ethereum gas prices, arbitrage may be less efficient, causing losses incurred from soft liquidation to be exacerbated." -msgstr "" - -#: src/components/PageMarketList/index.tsx:161 +#: src/components/PageMarketList/index.tsx:174 msgid "view all collateral." msgstr "" -#: src/components/PageMarketList/components/TableCellMarketsTotalDebt.tsx:31 -msgid "View details" -msgstr "" - -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:45 -msgid "View:" -msgstr "" - #: src/layout/HeaderMobile.tsx:136 -#~ msgid "Visit Curve.fi" -#~ msgstr "" +msgid "Visit Curve.fi" +msgstr "" #: src/components/LoanInfoUser/index.tsx:307 -#~ msgid "Wallet Balances" -#~ msgstr "" +msgid "Wallet Balances" +msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:362 msgid "WARNING: The corresponding deleverage button is also not yet available." @@ -1307,18 +929,14 @@ msgstr "" msgid "Warning! Exchange rate is too low!" msgstr "" -#: src/layout/Footer.tsx:106 +#: src/layout/Footer.tsx:83 msgid "Whitepaper" msgstr "" -#: src/layout/Footer.tsx:62 +#: src/layout/Footer.tsx:57 msgid "Wiki CN" msgstr "" -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:54 -msgid "Withdrawal" -msgstr "" - #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:29 msgid "x-axis display" msgstr "" @@ -1327,7 +945,7 @@ msgstr "" #~ msgid "You are in soft-liquidation mode. The amount currently at risk is {0} {1}. In this mode, you cannot withdraw collateral or add more to your position. To exit self-liquidation mode you can repay or self-liquidate." #~ msgstr "" -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:32 +#: src/components/LoanInfoUser/index.tsx:174 msgid "You are in soft-liquidation mode. The amount currently at risk is {softLiquidationAmountText}. In this mode, you cannot partially withdraw or add more collateral to your position. To reduce the risk of hard liquidation, you can repay or, to exit soft liquidation, you can close (self-liquidate)." msgstr "" @@ -1335,7 +953,7 @@ msgstr "" msgid "You are not in liquidation mode." msgstr "" -#: src/components/DetailInfoHealth.tsx:188 +#: src/components/DetailInfoHealth.tsx:178 msgid "You are still close to soft liquidation." msgstr "" @@ -1359,15 +977,15 @@ msgstr "" msgid "You have a high price impact {priceImpact}%!" msgstr "" -#: src/components/PageLoanManage/Page.tsx:73 -#: src/components/PageLoanManage/Page.tsx:75 +#: src/components/PageLoanManage/Page.tsx:57 +#: src/components/PageLoanManage/Page.tsx:60 msgid "Your Loan Details" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:38 msgid "Your loan will be paid off" msgstr "" -#: src/layout/Footer.tsx:50 +#: src/layout/Footer.tsx:45 msgid "YouTube" msgstr "" diff --git a/apps/loan/src/locales/zh-Hans/messages.po b/apps/loan/src/locales/zh-Hans/messages.po index 7ceb376fb..a6821bfcb 100644 --- a/apps/loan/src/locales/zh-Hans/messages.po +++ b/apps/loan/src/locales/zh-Hans/messages.po @@ -17,14 +17,14 @@ msgstr "" msgid "(Soft liquidation)" msgstr "" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "{0}" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:286 #: src/components/PageLoanManage/CollateralIncrease/index.tsx:242 #: src/components/PageLoanManage/LoanDecrease/index.tsx:228 -#: src/components/PageLoanManage/LoanIncrease/index.tsx:299 +#: src/components/PageLoanManage/LoanIncrease/index.tsx:301 msgid "{0} Avail." msgstr "" @@ -45,51 +45,19 @@ msgstr "" msgid "{0} borrow amount" msgstr "" -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "{rCollateralId}" msgstr "" -#: src/components/LoanInfoUser/components/UserInfoLoss.tsx:62 -msgid "*current balance minus losses" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:54 +#: src/components/LoanInfoUser/index.tsx:237 msgid "% lost" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:317 -msgid "<0>Anonymity: The degree of anonymity provided by blockchain technology can complicate the tracing of funds and the identification of parties in transactions." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:331 -msgid "<0>Cybersecurity Incidents: The digital nature of crypto assets makes them a target for hackers, malicious actors, and other cybersecurity threats. Failures, hacks, exploits, protocol errors, and unforeseen vulnerabilities can compromise the security of assets, resulting in theft, loss, or unauthorized access." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:310 -msgid "<0>Irreversibility of Transactions: Once executed, transactions in crypto assets cannot be reversed. Errors or accidental transactions cannot be easily rectified, potentially leading to permanent loss of assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:339 -msgid "<0>Operational Challenges: The process of recording and settling transactions on a blockchain depends on the network's stability and performance. Disruptions, high transaction volumes, or network congestion can delay settlement times, affecting the liquidity and availability of assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:323 -msgid "<0>Software Dependencies: Crypto asset operations rely heavily on the flawless functioning of complex software, including wallets, smart contracts, and blockchain networks. Any defects, bugs, or vulnerabilities in software can impair access to or use of crypto assets, leading to potential losses." -msgstr "" - #: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:21 msgid "A" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:354 -msgid "Access Control" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 -msgid "Action" -msgstr "" - -#: src/components/PageLoanManage/index.tsx:54 +#: src/components/PageLoanManage/index.tsx:50 msgid "Add" msgstr "" @@ -105,13 +73,11 @@ msgstr "" msgid "Adjust N:" msgstr "" -#: src/components/AdvancedSettings.tsx:134 +#: src/components/AdvancedSettings.tsx:130 msgid "Advanced Settings" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:57 -#: src/components/LoanInfoLlamma/index.tsx:50 +#: src/components/LoanInfoLlamma/index.tsx:94 msgid "AMM" msgstr "" @@ -127,30 +93,22 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Approve Spending" msgstr "" -#: src/layout/Header.tsx:193 -msgid "Apps" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Asc" msgstr "" -#: src/layout/Footer.tsx:109 +#: src/layout/Footer.tsx:86 msgid "Audits" msgstr "" -#: src/hooks/useTitleMapper.tsx:20 -msgid "Available" -msgstr "" - #: src/components/PageMarketList/index.tsx:73 -#~ msgid "Available to borrow" -#~ msgstr "" +msgid "Available to borrow" +msgstr "" #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:37 msgid "band" @@ -161,16 +119,16 @@ msgstr "" msgid "Band {n}" msgstr "" -#: src/hooks/useTitleMapper.tsx:41 +#: src/components/LoanInfoUser/index.tsx:208 msgid "Band range" msgstr "" -#: src/components/DetailInfoLiqRange.tsx:137 +#: src/components/DetailInfoLiqRange.tsx:136 msgid "Band range:" msgstr "" -#: src/components/LoanInfoLlamma/components/DetailsBandsChart.tsx:73 -#: src/components/LoanInfoUser/components/ChartUserBands.tsx:80 +#: src/components/LoanInfoLlamma/index.tsx:86 +#: src/components/LoanInfoUser/index.tsx:260 msgid "Bands" msgstr "" @@ -187,11 +145,10 @@ msgstr "" #~ msgstr "" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:12 msgid "Borrow" msgstr "" -#: src/components/PageLoanManage/index.tsx:48 +#: src/components/PageLoanManage/index.tsx:44 msgid "Borrow more" msgstr "" @@ -199,8 +156,10 @@ msgstr "" msgid "Borrow more anyway" msgstr "" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:46 -#: src/hooks/useTitleMapper.tsx:16 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:48 +#: src/components/LoanInfoUser/index.tsx:196 +#: src/components/LoanInfoUser/index.tsx:215 +#: src/components/PageMarketList/index.tsx:66 msgid "Borrow rate" msgstr "" @@ -209,27 +168,18 @@ msgid "Borrow rate:" msgstr "" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:21 msgid "Borrowed" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:96 -msgid "Borrowers in the crvUSD ecosystem are subject to specific risks associated with the liquidation process. It is crucial to understand that if the User’s collateral is placed into soft-liquidation mode, they are prohibited from withdrawing the collateral or augmenting their position with additional collateral. Entering soft-liquidation mode locks the collateral, removing the option to withdraw or add to it. In case market conditions suggest a strategic adjustment to the User’s position, they may face exacerbated risk due to such restrictions." -msgstr "" - #: src/domain/components/DetailInfoHealth.tsx:180 #~ msgid "Borrowing {0} will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:194 +#: src/components/DetailInfoHealth.tsx:184 msgid "Borrowing {formattedAmount} will put you close to soft liquidation." msgstr "" -#: src/layout/Footer.tsx:100 -msgid "Branding" -msgstr "" - -#: src/layout/Footer.tsx:115 +#: src/layout/Footer.tsx:92 msgid "Bug Bounty" msgstr "" @@ -241,28 +191,20 @@ msgstr "" msgid "Cancel" msgstr "" -#: src/hooks/useTitleMapper.tsx:22 +#: src/components/PageMarketList/index.tsx:72 msgid "Cap" msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:252 -#: src/components/ChartOhlcWrapper/index.tsx:279 -#: src/components/ChartOhlcWrapper/index.tsx:308 -msgid "Chart" -msgstr "" - -#: src/components/DetailInfoHealth.tsx:206 +#: src/components/DetailInfoHealth.tsx:196 msgid "Close to liquidation range!" msgstr "" -#: src/layout/Footer.tsx:37 -#: src/layout/Footer.tsx:55 +#: src/layout/Footer.tsx:32 +#: src/layout/Footer.tsx:50 msgid "CN" msgstr "" -#: src/components/PageLoanManage/index.tsx:36 -#: src/hooks/useTitleMapper.tsx:11 -#: src/hooks/useTitleMapper.tsx:46 +#: src/components/PageLoanManage/index.tsx:38 msgid "Collateral" msgstr "" @@ -278,19 +220,11 @@ msgstr "" msgid "Collateral Removed" msgstr "" -#: src/hooks/useTitleMapper.tsx:23 -msgid "Collateral value" -msgstr "" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:41 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:39 msgid "Collateral:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:79 -msgid "Collateralized debt positions are managed passively through arbitrage opportunities: if the collateral's price decreases, the system automatically sells off collateral to arbitrageurs in a ‘soft-liquidation mode’. If the collateral's price increases, the system recovers the collateral. This algorithm is designed to dynamically adjust the collateral backing each crvUSD in real-time, responding to fluctuating market conditions. While this approach is intended to mitigate the severity of traditional liquidations—a process where collateral becomes insufficient, leading to irreversible sales at potentially undervalued prices—it does not eliminate the inherent risk of collateral volatility. Additional information can be found on <0>LLAMMA Overview." -msgstr "" - -#: src/layout/Header.tsx:194 +#: src/layout/HeaderMobile.tsx:140 msgid "Community" msgstr "" @@ -300,51 +234,31 @@ msgstr "" msgid "Confirm warning to proceed." msgstr "" -#: src/components/PageLoanCreate/Page.tsx:225 -#: src/components/PageLoanManage/Page.tsx:228 -msgid "Connect" -msgstr "" - #: src/domain/layout/index.tsx:68 #~ msgid "Connect wallet" #~ msgstr "" -#: src/components/LoanFormConnect.tsx:30 +#: src/components/ConnectWallet.tsx:51 +#: src/components/LoanFormConnect.tsx:25 msgid "Connect Wallet" msgstr "" -#: src/components/PageLoanCreate/Page.tsx:224 -#: src/components/PageLoanManage/Page.tsx:227 -msgid "Connect your wallet to view market" -msgstr "" - -#: src/components/PageLoanCreate/Page.tsx:226 -#: src/components/PageLoanManage/Page.tsx:229 -msgid "Connecting" -msgstr "" - -#: src/components/LoanInfoLlamma/index.tsx:46 -#: src/layout/Footer.tsx:112 +#: src/components/LoanInfoLlamma/index.tsx:93 +#: src/layout/Footer.tsx:89 msgid "Contracts" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:64 -#: src/components/LoanInfoLlamma/index.tsx:56 +#: src/components/LoanInfoLlamma/index.tsx:98 msgid "Controller" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:351 -msgid "Counterparty Risks" -msgstr "" - -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "Create" msgstr "" -#: src/components/PageLoanCreate/index.tsx:26 +#: src/components/PageLoanCreate/index.tsx:30 #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:174 -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Create Loan" msgstr "" @@ -352,183 +266,77 @@ msgstr "" msgid "Creating a leverage loan means you will not receive any crvUSD to your address and will instead assume a significantly larger debt position." msgstr "" -#: src/layout/Footer.tsx:72 -msgid "Crvhub" -msgstr "" - #: src/layout/HeaderMobile.tsx:189 #: src/layout/HeaderSecondary.tsx:49 -#~ msgid "crvUSD" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:288 -msgid "crvUSD and its underlying infrastructure are in an early stage of development, are inherently experimental, and carry a significant degree of risk. Engagement with crvUSD during this phase should be approached with the understanding that it may lead to partial or complete loss of funds. Users considering minting, redeeming, or utilizing crvUSD should be prepared for the possibility of encountering technical issues, bugs, or vulnerabilities that could impact the value of crvUSD or the safety of allocated crypto assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:67 -msgid "crvUSD Design Risks" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:376 -msgid "crvUSD functions in a decentralized way, with its issuance and operational mechanics governed exclusively by smart contracts, without reliance on any intermediaries. While the adjustment of stablecoin critical parameters is subject to Curve DAO approvals, Users must understand that Curve DAO does not act as a broker, agent, advisor, or in any fiduciary capacity towards crvUSD users. Consequently, Curve DAO bears no obligation to ensure that the use of crvUSD aligns with each one’s financial objectives, strategies, or risk tolerance levels." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:69 -msgid "crvUSD has unique design features that Users should fully understand before interacting with the protocol." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:406 -msgid "crvUSD is not recognized as a legal tender by any government authority, central bank, or legal jurisdiction. Users should be aware that the lack of legal tender status means that no statutory, governmental, or corporate entity is obligated to accept the stablecoin as payment for goods, services, debts, or other obligations. The regulatory environment around crypto assets and stablecoins remains fluid and subject to change across jurisdictions. This poses a risk that the legal status of the stablecoin could be altered, potentially affecting its use, transfer, holding, and value." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:154 -msgid "crvUSD makes use of Pegkeepers, contracts authorized to deposit and withdraw crvUSD from a whitelisted Curve crvUSD stableswap pool up to a predefined debt cap. These contracts reference a subset of whitelisted stablecoins as a proxy for the intended USD price. Instability affecting any counterparty Pegkeeper assets (e.g. USDT, USDC), which are also used to aggregate a USD price for crvUSD, may cause the Pegkeeper to deposit all of its crvUSD into the pool in an attempt to rebalance. This creates a dependency on the Pegkeeper counterparty assets that determines the stability of the crvUSD peg. An upgraded PegkeeperV2 design promises to alleviate this risk." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:356 -msgid "crvUSD markets (Controller smart contracts) are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and minters always retain full control and responsibility over their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." +msgid "crvUSD" msgstr "" #: src/layout/Header.tsx:78 #: src/layout/HeaderMobile.tsx:135 -#~ msgid "crvUSD Pools" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:224 -msgid "crvUSD relies on liquidity concentrated within particular Pegkeeper pools, which serve a dual purpose as both a source of liquidity and price feeds for crvUSD oracles. If the incentives for depositing crvUSD into these pools are insufficient, the liquidity shortfalls can result in missed liquidations or deflationary price spirals (cascading liquidations). This phenomenon occurs when initial liquidations fail to be executed effectively, leading to a domino effect of further liquidations and potentially rapid, significant decreases in asset prices." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:267 -msgid "crvUSD relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. Users need to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:61 -msgid "crvUSD smart contract Audits" +msgid "crvUSD Pools" msgstr "" #: src/layout/HeaderMobile.tsx:180 #: src/layout/HeaderSecondary.tsx:41 -#~ msgid "crvUSD Total Supply" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:57 -msgid "crvUSD Whitepaper" +msgid "crvUSD Total Supply" msgstr "" -#: src/hooks/useTitleMapper.tsx:48 +#: src/components/LoanInfoUser/index.tsx:225 msgid "Current balance (est.) / Deposited" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:132 -msgid "Curve incorporates specialized on-chain Exponential Moving Average (EMA) oracles built into stabelswap-ng, tricrypto-ng, and twocrypto-ng Curve pool implementations. crvUSD markets derive price information from a select number of high TVL Curve pools. By utilizing the EMA smoothing methodology, oracles mitigate the impact of transient price fluctuations, aiming to reduce unnecessary losses caused by short-term market volatility or attempts to manipulate the oracle. Despite the manipulation-resistant design specification, Curve pool oracles may exhibit price distortions in certain scenarios that have the potential to result in missed or excessive liquidations. This may be a result of liquidity and volume migration to alternate venues that increase the risk of oracle manipulation. A detailed explanation of the aforementioned terms can be found in the <0>crvUSD Oracle documentation." -msgstr "" - -#: src/layout/Footer.tsx:69 +#: src/layout/Footer.tsx:64 msgid "Curve Monitor" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:130 -msgid "Curve Pool EMA Oracles" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:276 -msgid "Curve smart contracts have undergone multiple audits by reputable firms, including MixBytes and ChainSecurity, to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:47 -msgid "Curve stablecoin infrastructure enables users to mint crvUSD using a selection of crypto-tokenized collaterals (adding new ones is subject to DAO approval). Interacting with crvUSD doesn't come without risks. Before minting or taking exposure of crvUSD, it is best to research and understand the risks involved." -msgstr "" - -#: src/components/AdvancedSettings.tsx:189 +#: src/components/AdvancedSettings.tsx:185 msgid "Custom" msgstr "" -#: src/layout/Header.tsx:97 -msgid "Daily volume" -msgstr "" - -#: src/components/LoanInfoUser/components/UserInfoDebt.tsx:25 #: src/components/PageLoanManage/LoanDecrease/index.tsx:258 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:308 -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:40 msgid "Debt" msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:41 -msgid "Debt Ceiling" -msgstr "" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:40 -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:44 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:43 msgid "Debt:" msgstr "" -#: src/components/PageLoanManage/index.tsx:37 +#: src/components/PageLoanManage/index.tsx:39 msgid "Deleverage" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:249 -msgid "Depegging Risk" -msgstr "" - -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:31 -msgid "Deposit" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Desc" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:388 -msgid "Developer Dependency" -msgstr "" - -#: src/layout/Footer.tsx:97 +#: src/layout/Footer.tsx:103 msgid "Developer Docs" msgstr "" -#: src/components/PageMarketList/index.tsx:152 +#: src/components/PageMarketList/index.tsx:165 msgid "Didn't find what you're looking for?" msgstr "" -#: src/components/AdvancedSettings.tsx:139 +#: src/components/AdvancedSettings.tsx:135 msgid "Discard" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:435 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "" - -#: src/layout/Footer.tsx:47 +#: src/layout/Footer.tsx:42 msgid "Discord" msgstr "" -#: src/layout/Footer.tsx:43 +#: src/layout/Footer.tsx:38 msgid "Dodo" msgstr "" -#: src/layout/Footer.tsx:66 +#: src/layout/Footer.tsx:61 msgid "Dune Analytics" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:167 -msgid "Dynamic Interest Rates" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:302 -msgid "Engaging with crypto assets involves exposure to a range of technological risks inherent to the use of new and evolving technologies. Users must be aware of key risk factors (as outlined below) and consider their implications for crypto asset transactions." -msgstr "" - #: src/components/Page404/Page.tsx:11 -#~ msgid "Error 404" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:186 -msgid "Essentially, the borrow rate increases when the price of crvUSD goes lower and/or the proportion of Pegkeeper debt to total debt reduces. This process is intended to dynamically regulate market behavior such that it reinforces the crvUSD peg. Changes to the Monetary Policy are authorized only by the Curve DAO. A <0>crvUSD rate tool by 0xReviews allows Users to visualize the influence of these factors on the borrowing rate." -msgstr "" - -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:69 -msgid "Est. update profit:" +msgid "Error 404" msgstr "" #: src/components/DetailInfoEstimateGas.tsx:61 @@ -539,75 +347,46 @@ msgstr "" msgid "Estimated TX cost:" msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:291 -#: src/components/PageLoanCreate/Page.tsx:182 -#: src/components/PageLoanManage/Page.tsx:166 -msgid "Expand chart" -msgstr "" - #: src/layout/Footer.tsx:95 -#~ msgid "FAQ" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:300 -msgid "General Blockchain Technology Risks" +msgid "FAQ" msgstr "" -#: src/layout/Footer.tsx:94 +#: src/layout/Footer.tsx:114 msgid "Github" msgstr "" -#: src/components/DetailInfoHealth.tsx:121 -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:34 -#: src/hooks/useTitleMapper.tsx:30 -msgid "Hard liquidation is triggered when health is 0 or below." -msgstr "" - #: src/components/LoanInfoUser/index.tsx:185 -#~ msgid "Health" -#~ msgstr "" - -#: src/hooks/useTitleMapper.tsx:39 -msgid "Health %" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:25 -msgid "Health status" +msgid "Health" msgstr "" -#: src/components/DetailInfoHealth.tsx:115 +#: src/components/DetailInfoHealth.tsx:113 msgid "Health:" msgstr "" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 msgid "High price impact:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:119 -msgid "If the health of the loan falls to zero, the position is subject to hard liquidation, which is an irreversible process resulting in the loss of the collateral with no possibility of recovery or de-liquidation. This scenario underscores the critical need for risk management when using leverage. Leverage and collateral management should be approached with caution, reflecting a balanced assessment of potential gains against the risk of significant financial loss." -msgstr "" - #: src/domain/components/DetailInfoHealth.tsx:182 #~ msgid "Increasing your borrowed amount by {0} will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:196 +#: src/components/DetailInfoHealth.tsx:186 msgid "Increasing your borrowed amount by {formattedAmount} will put you close to soft liquidation." msgstr "" -#: src/components/PageIntegrations/Page.tsx:37 -#: src/layout/Footer.tsx:103 -#: src/layout/Header.tsx:74 -#: src/layout/Header.tsx:80 +#: src/components/PageIntegrations/Page.tsx:38 +#: src/layout/Footer.tsx:99 +#: src/layout/Header.tsx:42 msgid "Integrations" msgstr "" -#: src/components/PageMarketList/index.tsx:154 +#: src/components/PageMarketList/index.tsx:167 msgid "Join the Telegram" msgstr "" -#: src/components/PageLoanCreate/index.tsx:27 +#: src/components/PageLoanCreate/index.tsx:31 msgid "Leverage" msgstr "" @@ -620,15 +399,16 @@ msgstr "" #~ msgstr "" #: src/components/ChartLiquidationRange/index.tsx:92 -#: src/hooks/useTitleMapper.tsx:40 +#: src/components/LoanInfoUser/index.tsx:164 +#: src/components/LoanInfoUser/index.tsx:205 msgid "Liquidation range" msgstr "" -#: src/components/LoanInfoUser/index.tsx:72 +#: src/components/LoanInfoUser/index.tsx:266 msgid "Liquidation Range" msgstr "" -#: src/components/DetailInfoLiqRange.tsx:101 +#: src/components/DetailInfoLiqRange.tsx:100 msgid "Liquidation range:" msgstr "" @@ -636,10 +416,6 @@ msgstr "" msgid "Liquidation range{0}" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:214 -msgid "Liquidity Risk" -msgstr "" - #: src/domain/layout/Footer.tsx:62 #~ msgid "Llama Airforce" #~ msgstr "" @@ -648,23 +424,19 @@ msgstr "" msgid "LLAMMA {collateralName} Avail." msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:286 -msgid "LLAMMA Activity" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:58 +#: src/components/LoanInfoUser/index.tsx:281 msgid "LLAMMA Balances" msgstr "" -#: src/components/PageLoanManage/Page.tsx:72 +#: src/components/PageLoanManage/Page.tsx:58 msgid "LLAMMA Details" msgstr "" -#: src/components/LoanFormConnect.tsx:34 +#: src/components/LoanFormConnect.tsx:29 msgid "Loading" msgstr "" -#: src/components/PageLoanManage/index.tsx:35 +#: src/components/PageLoanManage/index.tsx:37 msgid "Loan" msgstr "" @@ -672,7 +444,7 @@ msgstr "" msgid "Loan Created" msgstr "" -#: src/components/LoanInfoLlamma/index.tsx:67 +#: src/components/LoanInfoLlamma/index.tsx:109 msgid "Loan parameters" msgstr "" @@ -684,26 +456,21 @@ msgstr "" msgid "Loan to Value ratio:" msgstr "" -#: src/hooks/useTitleMapper.tsx:52 +#: src/components/LoanInfoUser/index.tsx:233 msgid "Loss amount" msgstr "" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "Manage" msgstr "" -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Manage Loan" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:212 -msgid "Market Risks" -msgstr "" - -#: src/components/PageMarketList/Page.tsx:34 -#: src/hooks/useTitleMapper.tsx:10 -#: src/layout/Header.tsx:72 -#: src/layout/Header.tsx:79 +#: src/components/PageMarketList/index.tsx:60 +#: src/components/PageMarketList/Page.tsx:33 +#: src/layout/Header.tsx:40 msgid "Markets" msgstr "" @@ -711,78 +478,54 @@ msgstr "" msgid "Max borrow amount" msgstr "" -#: src/components/AdvancedSettings.tsx:159 +#: src/components/AdvancedSettings.tsx:155 msgid "Max Slippage" msgstr "" -#: src/components/AdvancedSettings.tsx:161 +#: src/components/AdvancedSettings.tsx:157 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "" -#: src/components/AdvancedSettings.tsx:116 +#: src/components/AdvancedSettings.tsx:115 msgid "Min. slippage is 0.01%" msgstr "" #: src/layout/HeaderMobile.tsx:164 -#~ msgid "Mode" -#~ msgstr "" +msgid "Mode" +msgstr "" -#: src/components/LoanInfoLlamma/index.tsx:61 +#: src/components/LoanInfoLlamma/index.tsx:103 msgid "Monetary Policy" msgstr "" -#: src/hooks/useTitleMapper.tsx:13 +#: src/components/PageMarketList/index.tsx:62 msgid "My debt" msgstr "" -#: src/hooks/useTitleMapper.tsx:14 +#: src/components/PageMarketList/index.tsx:61 msgid "My health" msgstr "" -#: src/components/DetailInfoN.tsx:13 +#: src/components/DetailInfoN.tsx:10 msgid "N:" msgstr "" -#: src/layout/Footer.tsx:118 +#: src/layout/Footer.tsx:106 msgid "News" msgstr "" -#: src/components/PageMarketList/index.tsx:159 +#: src/components/PageMarketList/index.tsx:172 msgid "No collateral found for \"{0}\". Feel free to search other tabs, or" msgstr "" -#: src/components/PageMarketList/index.tsx:166 +#: src/components/PageMarketList/index.tsx:179 msgid "No collateral found in this category" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:374 -msgid "No Control" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:87 -msgid "No controller data found." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:236 -msgid "No Guarantee of Price Stability" -msgstr "" - #: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:417 -msgid "No Investment and Legal Advice" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:286 -msgid "No Loss Prevention" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:80 -msgid "No trades data found." -msgstr "" - #: src/components/LoanFormAlertError.tsx:45 msgid "Not eligible for liquidation" msgstr "" @@ -793,13 +536,13 @@ msgstr "" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "off" -#~ msgstr "" +msgid "off" +msgstr "" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "on" -#~ msgstr "" +msgid "on" +msgstr "" #: src/components/AlertFormWarning.tsx:30 msgid "Once the loan is paid off, you will no longer be able to manage this loan." @@ -820,30 +563,14 @@ msgstr "" msgid "Oracle price" msgstr "" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:35 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:36 msgid "Oracle Price" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:37 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:35 msgid "Partial repayment LLAMMA changes:" msgstr "" -#: src/components/PagePegKeepers/Page.tsx:33 -msgid "Peg Keepers" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:152 -msgid "Pegkeepers" -msgstr "" - -#: src/components/PagePegKeepers/Page.tsx:30 -msgid "PegKeepers" -msgstr "" - -#: src/components/PageMarketList/components/TableStats.tsx:14 -msgid "PegKeepers Debt" -msgstr "" - #: src/components/PageLoanManage/LoanDecrease/index.tsx:111 msgid "Please approve a repayment of {debt} {0}." msgstr "" @@ -858,7 +585,7 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:142 #: src/components/PageLoanManage/LoanIncrease/index.tsx:162 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:103 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:99 msgid "Please approve spending of {0}" msgstr "" @@ -874,7 +601,7 @@ msgstr "" msgid "Please approve spending your {item1Name}." msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:117 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:113 msgid "Please confirm {stablecoinName} self-liquidation at max {maxSlippage}% slippage." msgstr "" @@ -902,10 +629,6 @@ msgstr "" msgid "Please confirm swapping {swapAmount} {item1Name} at max {maxSlippage} slippage." msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:39 -msgid "Please confirm update {poolName} pool" -msgstr "" - #: src/domain/layout/index.tsx:66 #~ msgid "Please connect wallet to view loan details" #~ msgstr "" @@ -914,34 +637,21 @@ msgstr "" #~ msgid "Please switch your wallet's network to <0>{0}to use Curve on <1>{1}." #~ msgstr "" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 #: src/components/PageLoanManage/LoanSwap/index.tsx:296 msgid "Price impact:" msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:75 -msgid "Profit is denominated in {poolName} LP Tokens" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:42 +#: src/components/LoanInfoUser/index.tsx:211 msgid "Range %" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:44 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:227 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:43 msgid "Receive:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:402 -msgid "Regulatory Risks" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:404 -msgid "Regulatory Uncertainty" -msgstr "" - -#: src/components/PageLoanManage/index.tsx:55 +#: src/components/PageLoanManage/index.tsx:51 msgid "Remove" msgstr "" @@ -953,7 +663,7 @@ msgstr "" #~ msgid "Removing {0} collateral, will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:192 +#: src/components/DetailInfoHealth.tsx:182 msgid "Removing {formattedAmount} collateral, will put you close to soft liquidation." msgstr "" @@ -962,7 +672,7 @@ msgstr "" msgid "Repaid" msgstr "" -#: src/components/PageLoanManage/index.tsx:49 +#: src/components/PageLoanManage/index.tsx:45 #: src/components/PageLoanManage/LoanDecrease/index.tsx:172 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:155 msgid "Repay" @@ -972,64 +682,47 @@ msgstr "" msgid "Repay anyway" msgstr "" -#: src/components/PageLoanManage/LoanDecrease/index.tsx:273 +#: src/components/PageLoanManage/LoanDecrease/index.tsx:268 msgid "Repay in full and close loan" msgstr "" -#: src/layout/Footer.tsx:91 -#: src/layout/Header.tsx:195 +#: src/layout/Footer.tsx:109 +#: src/layout/HeaderMobile.tsx:152 msgid "Resources" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:57 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:56 msgid "Return to wallet:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:41 -#: src/components/PageDisclaimer/Page.tsx:44 -#: src/layout/Header.tsx:73 -#: src/layout/Header.tsx:81 +#: src/components/PageDisclaimer/Page.tsx:28 +#: src/components/PageDisclaimer/Page.tsx:30 +#: src/layout/Header.tsx:41 msgid "Risk Disclaimer" msgstr "" -#: src/components/AdvancedSettings.tsx:151 +#: src/components/AdvancedSettings.tsx:147 msgid "Save" msgstr "" -#: src/components/PageLoanManage/index.tsx:50 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/index.tsx:46 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidate" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidated" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:207 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:203 msgid "Self-liquidation amount" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:226 -msgid "Self-liquidation amount:" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:181 -msgid "several variables set by the Monetary Policy admin" -msgstr "" - -#: src/components/DetailInfoSlippageTolerance.tsx:16 +#: src/components/DetailInfoSlippageTolerance.tsx:14 msgid "Slippage tolerance:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:265 -msgid "Smart Contract Risk" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:77 -msgid "Soft-Liquidation and Hard-Liquidation" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:68 +#: src/components/PageMarketList/components/DialogSortContent.tsx:65 msgid "Sort By" msgstr "" @@ -1037,20 +730,19 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Spending Approved" msgstr "" #: src/components/LoanInfoUser/index.tsx:178 -#~ msgid "Status" -#~ msgstr "" +msgid "Status" +msgstr "" #: src/components/DetailInfoEstimateGas.tsx:62 msgid "Step {0} of {1}" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 #: src/components/PageLoanManage/LoanSwap/index.tsx:176 msgid "Swap" msgstr "" @@ -1063,105 +755,52 @@ msgstr "" msgid "Swapped" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:263 -msgid "Technology Risk" -msgstr "" - -#: src/layout/Footer.tsx:33 +#: src/layout/Footer.tsx:28 msgid "Telegram" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:251 -msgid "The blockchain ecosystem has witnessed instances where stablecoins experienced significant and prolonged periods of depegging from their intended value. Despite the innovative measures designed to uphold price stability, crvUSD is not exempt from the risk of depegging. Market volatility, shifts in regulatory landscapes, sudden and substantial changes in the value of collateral assets, or unforeseen technical issues can precipitate a departure from its pegged value." -msgstr "" - -#: src/hooks/useTitleMapper.tsx:17 +#: src/components/PageMarketList/index.tsx:67 msgid "The borrow rate changes with supply and demand for crvUSD, reflected in the price and total debt versus PegKeeper debt. Rates increase to encourage debt reduction, and decrease to encourage borrowing." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:169 -msgid "The borrowing rate is algorithmically determined based on several factors, including" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:175 -msgid "the crvUSD price as reported by an on-chain price aggregator contract," -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:364 -msgid "The crvUSD protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including deploying new crvUSD markets, setting implementation contracts, and setting parameters that influence market behavior." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:419 -msgid "The data and communications made available on the crvUSD platform, including but not limited to its front-end interfaces, are intended purely for informational purposes and should not under any circumstances be interpreted as constituting investment, financial, trading, legal, or any form of professional advice. The content provided through the crvUSD front-end interface(s) is designed to support users' understanding of the stablecoin, the protocol, and its functionalities, not to guide or influence decision-making regarding investments or financial strategies. Users must be aware that they are the only entity capable of adequately assessing whether an action taken aligns with their financial objectives and circumstances." -msgstr "" - -#: src/components/PageIntegrations/Page.tsx:42 +#: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "" -#: src/components/DetailInfoHealth.tsx:119 -#: src/hooks/useTitleMapper.tsx:28 +#: src/components/DetailInfoHealth.tsx:116 msgid "The loan metric indicates the current health of your position." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:390 -msgid "The ongoing development, maintenance, and scalability of the crvUSD protocol is dependent on developers' contributions. While numerous developers are currently engaged in the project, there is no assurance that this level of contribution will persist indefinitely. The future involvement of developers is subject to change due to a variety of factors that could influence their capacity or willingness to contribute." -msgstr "" - -#: src/components/DetailInfoLiqRange.tsx:95 +#: src/components/DetailInfoLiqRange.tsx:94 msgid "The range of prices where collateral is managed by the market-maker. Collateral begins to be sold off when its price enters your liquidation range (\"soft liquidation\"). If the market-maker cannot keep the position sufficiently collateralized, an externally triggered \"hard\" liquidation may take place." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:178 -msgid "the ratio of Pegkeeper debt to total outstanding debt," -msgstr "" - #: src/hooks/useTokenAlert.tsx:34 msgid "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown. This is out of our control, but we will do everything in our power to make sure the peg of Ren assets is maintained." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:238 -msgid "The value of the crypto assets used as collateral for crvUSD is subject to high levels of volatility and unpredictability. The pricing of these assets may be extremely speculative and prone to rapid fluctuations. Such market characteristics can impact the stability of crvUSD’s value. While the LLAMMA algorithm aims to adjust collateral levels to support crvUSD’s value, there is no guarantee that these adjustments will always preserve stability, especially during periods of extreme market volatility." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:199 -msgid "There may be assumptions in the Monetary Policy design that, in some circumstances, cause interest rates to produce undesired outcomes, and which may cause a sub-optimal experience for borrowers. In general, interest rates on borrowing may change dramatically in response to changing market circumstances, and may not reflect a borrower's expectations when they had opened their position." -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:102 -msgid "There was an error fetching the pool activity data." -msgstr "" - -#: src/hooks/useTitleMapper.tsx:55 +#: src/components/LoanInfoUser/index.tsx:238 msgid "This metric measures the loss in collateral value caused by LLAMMA's soft liquidation process, which is activated when the oracle price falls within a user’s liquidation range." msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:74 -msgid "Time" -msgstr "" - #: src/domain/components/loan-collateral-list/index.tsx:56 #~ msgid "Total borrowed" #~ msgstr "" #: src/components/PageMarketList/index.tsx:74 -#~ msgid "Total collateral value" -#~ msgstr "" +msgid "Total collateral value" +msgstr "" #: src/components/PageMarketList/index.tsx:71 -#~ msgid "Total debt" -#~ msgstr "" +msgid "Total debt" +msgstr "" #: src/components/LoanInfoUser/index.tsx:296 -#~ msgid "Total debt:" -#~ msgstr "" - -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:146 -msgid "Total position collateral:" +msgid "Total debt:" msgstr "" -#: src/layout/Header.tsx:98 -msgid "Total Supply" +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:138 +msgid "Total position collateral:" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoTradeRoutes.tsx:42 @@ -1178,7 +817,6 @@ msgid "Transaction complete" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:126 -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:45 msgid "Transaction complete." msgstr "" @@ -1190,11 +828,11 @@ msgstr "" msgid "Transaction complete. This loan is payoff and will no longer be manageable." msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:125 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:121 msgid "Transaction complete. This loan will no longer exist. Click <0>here to go back to collateral list." msgstr "" -#: src/layout/Footer.tsx:30 +#: src/layout/Footer.tsx:25 msgid "Twitter" msgstr "" @@ -1242,7 +880,7 @@ msgid "Unable to get total supply" msgstr "" #: src/components/DetailInfoEstimateGas.tsx:78 -#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:47 +#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:26 msgid "Unable to get USD rate" msgstr "" @@ -1263,33 +901,17 @@ msgstr "" msgid "Unable to swap" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:216 -msgid "Users should be aware that ample crvUSD liquidity on exchange is necessary for facilitating liquidations. Circumstances leading to a reduction in the available crvUSD liquidity for liquidators are plausible. Such scenarios can significantly impact the proper functioning of the stablecoin market, particularly concerning the process of liquidation." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:107 -msgid "Users should be cautious about collateral management, as a sharp decline in the price of the collateral within a brief period can escalate losses, further deteriorating the health of the loan. Respectively, an increase in the collateral's value while in soft-liquidation can also cause “de-liquidation losses” - a situation where an appreciating market price for the collateral may negatively impact the loan’s health. During periods of high volatility and/or high Ethereum gas prices, arbitrage may be less efficient, causing losses incurred from soft liquidation to be exacerbated." -msgstr "" - -#: src/components/PageMarketList/index.tsx:161 +#: src/components/PageMarketList/index.tsx:174 msgid "view all collateral." msgstr "" -#: src/components/PageMarketList/components/TableCellMarketsTotalDebt.tsx:31 -msgid "View details" -msgstr "" - -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:45 -msgid "View:" -msgstr "" - #: src/layout/HeaderMobile.tsx:136 -#~ msgid "Visit Curve.fi" -#~ msgstr "" +msgid "Visit Curve.fi" +msgstr "" #: src/components/LoanInfoUser/index.tsx:307 -#~ msgid "Wallet Balances" -#~ msgstr "" +msgid "Wallet Balances" +msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:362 msgid "WARNING: The corresponding deleverage button is also not yet available." @@ -1307,18 +929,14 @@ msgstr "" msgid "Warning! Exchange rate is too low!" msgstr "" -#: src/layout/Footer.tsx:106 +#: src/layout/Footer.tsx:83 msgid "Whitepaper" msgstr "" -#: src/layout/Footer.tsx:62 +#: src/layout/Footer.tsx:57 msgid "Wiki CN" msgstr "" -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:54 -msgid "Withdrawal" -msgstr "" - #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:29 msgid "x-axis display" msgstr "" @@ -1327,7 +945,7 @@ msgstr "" #~ msgid "You are in soft-liquidation mode. The amount currently at risk is {0} {1}. In this mode, you cannot withdraw collateral or add more to your position. To exit self-liquidation mode you can repay or self-liquidate." #~ msgstr "" -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:32 +#: src/components/LoanInfoUser/index.tsx:174 msgid "You are in soft-liquidation mode. The amount currently at risk is {softLiquidationAmountText}. In this mode, you cannot partially withdraw or add more collateral to your position. To reduce the risk of hard liquidation, you can repay or, to exit soft liquidation, you can close (self-liquidate)." msgstr "" @@ -1335,7 +953,7 @@ msgstr "" msgid "You are not in liquidation mode." msgstr "" -#: src/components/DetailInfoHealth.tsx:188 +#: src/components/DetailInfoHealth.tsx:178 msgid "You are still close to soft liquidation." msgstr "" @@ -1359,15 +977,15 @@ msgstr "" msgid "You have a high price impact {priceImpact}%!" msgstr "" -#: src/components/PageLoanManage/Page.tsx:73 -#: src/components/PageLoanManage/Page.tsx:75 +#: src/components/PageLoanManage/Page.tsx:57 +#: src/components/PageLoanManage/Page.tsx:60 msgid "Your Loan Details" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:38 msgid "Your loan will be paid off" msgstr "" -#: src/layout/Footer.tsx:50 +#: src/layout/Footer.tsx:45 msgid "YouTube" msgstr "" diff --git a/apps/loan/src/locales/zh-Hant/messages.po b/apps/loan/src/locales/zh-Hant/messages.po index f7c65219c..35cdd0e54 100644 --- a/apps/loan/src/locales/zh-Hant/messages.po +++ b/apps/loan/src/locales/zh-Hant/messages.po @@ -17,14 +17,14 @@ msgstr "" msgid "(Soft liquidation)" msgstr "" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "{0}" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:286 #: src/components/PageLoanManage/CollateralIncrease/index.tsx:242 #: src/components/PageLoanManage/LoanDecrease/index.tsx:228 -#: src/components/PageLoanManage/LoanIncrease/index.tsx:299 +#: src/components/PageLoanManage/LoanIncrease/index.tsx:301 msgid "{0} Avail." msgstr "" @@ -45,51 +45,19 @@ msgstr "" msgid "{0} borrow amount" msgstr "" -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "{rCollateralId}" msgstr "" -#: src/components/LoanInfoUser/components/UserInfoLoss.tsx:62 -msgid "*current balance minus losses" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:54 +#: src/components/LoanInfoUser/index.tsx:237 msgid "% lost" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:317 -msgid "<0>Anonymity: The degree of anonymity provided by blockchain technology can complicate the tracing of funds and the identification of parties in transactions." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:331 -msgid "<0>Cybersecurity Incidents: The digital nature of crypto assets makes them a target for hackers, malicious actors, and other cybersecurity threats. Failures, hacks, exploits, protocol errors, and unforeseen vulnerabilities can compromise the security of assets, resulting in theft, loss, or unauthorized access." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:310 -msgid "<0>Irreversibility of Transactions: Once executed, transactions in crypto assets cannot be reversed. Errors or accidental transactions cannot be easily rectified, potentially leading to permanent loss of assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:339 -msgid "<0>Operational Challenges: The process of recording and settling transactions on a blockchain depends on the network's stability and performance. Disruptions, high transaction volumes, or network congestion can delay settlement times, affecting the liquidity and availability of assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:323 -msgid "<0>Software Dependencies: Crypto asset operations rely heavily on the flawless functioning of complex software, including wallets, smart contracts, and blockchain networks. Any defects, bugs, or vulnerabilities in software can impair access to or use of crypto assets, leading to potential losses." -msgstr "" - #: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:21 msgid "A" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:354 -msgid "Access Control" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 -msgid "Action" -msgstr "" - -#: src/components/PageLoanManage/index.tsx:54 +#: src/components/PageLoanManage/index.tsx:50 msgid "Add" msgstr "" @@ -105,13 +73,11 @@ msgstr "" msgid "Adjust N:" msgstr "" -#: src/components/AdvancedSettings.tsx:134 +#: src/components/AdvancedSettings.tsx:130 msgid "Advanced Settings" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:57 -#: src/components/LoanInfoLlamma/index.tsx:50 +#: src/components/LoanInfoLlamma/index.tsx:94 msgid "AMM" msgstr "" @@ -127,30 +93,22 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Approve Spending" msgstr "" -#: src/layout/Header.tsx:193 -msgid "Apps" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Asc" msgstr "" -#: src/layout/Footer.tsx:109 +#: src/layout/Footer.tsx:86 msgid "Audits" msgstr "" -#: src/hooks/useTitleMapper.tsx:20 -msgid "Available" -msgstr "" - #: src/components/PageMarketList/index.tsx:73 -#~ msgid "Available to borrow" -#~ msgstr "" +msgid "Available to borrow" +msgstr "" #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:37 msgid "band" @@ -161,16 +119,16 @@ msgstr "" msgid "Band {n}" msgstr "" -#: src/hooks/useTitleMapper.tsx:41 +#: src/components/LoanInfoUser/index.tsx:208 msgid "Band range" msgstr "" -#: src/components/DetailInfoLiqRange.tsx:137 +#: src/components/DetailInfoLiqRange.tsx:136 msgid "Band range:" msgstr "" -#: src/components/LoanInfoLlamma/components/DetailsBandsChart.tsx:73 -#: src/components/LoanInfoUser/components/ChartUserBands.tsx:80 +#: src/components/LoanInfoLlamma/index.tsx:86 +#: src/components/LoanInfoUser/index.tsx:260 msgid "Bands" msgstr "" @@ -187,11 +145,10 @@ msgstr "" #~ msgstr "" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:12 msgid "Borrow" msgstr "" -#: src/components/PageLoanManage/index.tsx:48 +#: src/components/PageLoanManage/index.tsx:44 msgid "Borrow more" msgstr "" @@ -199,8 +156,10 @@ msgstr "" msgid "Borrow more anyway" msgstr "" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:46 -#: src/hooks/useTitleMapper.tsx:16 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:48 +#: src/components/LoanInfoUser/index.tsx:196 +#: src/components/LoanInfoUser/index.tsx:215 +#: src/components/PageMarketList/index.tsx:66 msgid "Borrow rate" msgstr "" @@ -209,27 +168,18 @@ msgid "Borrow rate:" msgstr "" #: src/components/PageLoanManage/LoanIncrease/index.tsx:173 -#: src/hooks/useTitleMapper.tsx:21 msgid "Borrowed" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:96 -msgid "Borrowers in the crvUSD ecosystem are subject to specific risks associated with the liquidation process. It is crucial to understand that if the User’s collateral is placed into soft-liquidation mode, they are prohibited from withdrawing the collateral or augmenting their position with additional collateral. Entering soft-liquidation mode locks the collateral, removing the option to withdraw or add to it. In case market conditions suggest a strategic adjustment to the User’s position, they may face exacerbated risk due to such restrictions." -msgstr "" - #: src/domain/components/DetailInfoHealth.tsx:180 #~ msgid "Borrowing {0} will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:194 +#: src/components/DetailInfoHealth.tsx:184 msgid "Borrowing {formattedAmount} will put you close to soft liquidation." msgstr "" -#: src/layout/Footer.tsx:100 -msgid "Branding" -msgstr "" - -#: src/layout/Footer.tsx:115 +#: src/layout/Footer.tsx:92 msgid "Bug Bounty" msgstr "" @@ -241,28 +191,20 @@ msgstr "" msgid "Cancel" msgstr "" -#: src/hooks/useTitleMapper.tsx:22 +#: src/components/PageMarketList/index.tsx:72 msgid "Cap" msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:252 -#: src/components/ChartOhlcWrapper/index.tsx:279 -#: src/components/ChartOhlcWrapper/index.tsx:308 -msgid "Chart" -msgstr "" - -#: src/components/DetailInfoHealth.tsx:206 +#: src/components/DetailInfoHealth.tsx:196 msgid "Close to liquidation range!" msgstr "" -#: src/layout/Footer.tsx:37 -#: src/layout/Footer.tsx:55 +#: src/layout/Footer.tsx:32 +#: src/layout/Footer.tsx:50 msgid "CN" msgstr "" -#: src/components/PageLoanManage/index.tsx:36 -#: src/hooks/useTitleMapper.tsx:11 -#: src/hooks/useTitleMapper.tsx:46 +#: src/components/PageLoanManage/index.tsx:38 msgid "Collateral" msgstr "" @@ -278,19 +220,11 @@ msgstr "" msgid "Collateral Removed" msgstr "" -#: src/hooks/useTitleMapper.tsx:23 -msgid "Collateral value" -msgstr "" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:41 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:39 msgid "Collateral:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:79 -msgid "Collateralized debt positions are managed passively through arbitrage opportunities: if the collateral's price decreases, the system automatically sells off collateral to arbitrageurs in a ‘soft-liquidation mode’. If the collateral's price increases, the system recovers the collateral. This algorithm is designed to dynamically adjust the collateral backing each crvUSD in real-time, responding to fluctuating market conditions. While this approach is intended to mitigate the severity of traditional liquidations—a process where collateral becomes insufficient, leading to irreversible sales at potentially undervalued prices—it does not eliminate the inherent risk of collateral volatility. Additional information can be found on <0>LLAMMA Overview." -msgstr "" - -#: src/layout/Header.tsx:194 +#: src/layout/HeaderMobile.tsx:140 msgid "Community" msgstr "" @@ -300,51 +234,31 @@ msgstr "" msgid "Confirm warning to proceed." msgstr "" -#: src/components/PageLoanCreate/Page.tsx:225 -#: src/components/PageLoanManage/Page.tsx:228 -msgid "Connect" -msgstr "" - #: src/domain/layout/index.tsx:68 #~ msgid "Connect wallet" #~ msgstr "" -#: src/components/LoanFormConnect.tsx:30 +#: src/components/ConnectWallet.tsx:51 +#: src/components/LoanFormConnect.tsx:25 msgid "Connect Wallet" msgstr "" -#: src/components/PageLoanCreate/Page.tsx:224 -#: src/components/PageLoanManage/Page.tsx:227 -msgid "Connect your wallet to view market" -msgstr "" - -#: src/components/PageLoanCreate/Page.tsx:226 -#: src/components/PageLoanManage/Page.tsx:229 -msgid "Connecting" -msgstr "" - -#: src/components/LoanInfoLlamma/index.tsx:46 -#: src/layout/Footer.tsx:112 +#: src/components/LoanInfoLlamma/index.tsx:93 +#: src/layout/Footer.tsx:89 msgid "Contracts" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:50 -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:64 -#: src/components/LoanInfoLlamma/index.tsx:56 +#: src/components/LoanInfoLlamma/index.tsx:98 msgid "Controller" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:351 -msgid "Counterparty Risks" -msgstr "" - -#: src/components/PageLoanCreate/Page.tsx:168 +#: src/components/PageLoanCreate/Page.tsx:153 msgid "Create" msgstr "" -#: src/components/PageLoanCreate/index.tsx:26 +#: src/components/PageLoanCreate/index.tsx:30 #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:174 -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Create Loan" msgstr "" @@ -352,183 +266,77 @@ msgstr "" msgid "Creating a leverage loan means you will not receive any crvUSD to your address and will instead assume a significantly larger debt position." msgstr "" -#: src/layout/Footer.tsx:72 -msgid "Crvhub" -msgstr "" - #: src/layout/HeaderMobile.tsx:189 #: src/layout/HeaderSecondary.tsx:49 -#~ msgid "crvUSD" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:288 -msgid "crvUSD and its underlying infrastructure are in an early stage of development, are inherently experimental, and carry a significant degree of risk. Engagement with crvUSD during this phase should be approached with the understanding that it may lead to partial or complete loss of funds. Users considering minting, redeeming, or utilizing crvUSD should be prepared for the possibility of encountering technical issues, bugs, or vulnerabilities that could impact the value of crvUSD or the safety of allocated crypto assets." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:67 -msgid "crvUSD Design Risks" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:376 -msgid "crvUSD functions in a decentralized way, with its issuance and operational mechanics governed exclusively by smart contracts, without reliance on any intermediaries. While the adjustment of stablecoin critical parameters is subject to Curve DAO approvals, Users must understand that Curve DAO does not act as a broker, agent, advisor, or in any fiduciary capacity towards crvUSD users. Consequently, Curve DAO bears no obligation to ensure that the use of crvUSD aligns with each one’s financial objectives, strategies, or risk tolerance levels." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:69 -msgid "crvUSD has unique design features that Users should fully understand before interacting with the protocol." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:406 -msgid "crvUSD is not recognized as a legal tender by any government authority, central bank, or legal jurisdiction. Users should be aware that the lack of legal tender status means that no statutory, governmental, or corporate entity is obligated to accept the stablecoin as payment for goods, services, debts, or other obligations. The regulatory environment around crypto assets and stablecoins remains fluid and subject to change across jurisdictions. This poses a risk that the legal status of the stablecoin could be altered, potentially affecting its use, transfer, holding, and value." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:154 -msgid "crvUSD makes use of Pegkeepers, contracts authorized to deposit and withdraw crvUSD from a whitelisted Curve crvUSD stableswap pool up to a predefined debt cap. These contracts reference a subset of whitelisted stablecoins as a proxy for the intended USD price. Instability affecting any counterparty Pegkeeper assets (e.g. USDT, USDC), which are also used to aggregate a USD price for crvUSD, may cause the Pegkeeper to deposit all of its crvUSD into the pool in an attempt to rebalance. This creates a dependency on the Pegkeeper counterparty assets that determines the stability of the crvUSD peg. An upgraded PegkeeperV2 design promises to alleviate this risk." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:356 -msgid "crvUSD markets (Controller smart contracts) are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and minters always retain full control and responsibility over their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." +msgid "crvUSD" msgstr "" #: src/layout/Header.tsx:78 #: src/layout/HeaderMobile.tsx:135 -#~ msgid "crvUSD Pools" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:224 -msgid "crvUSD relies on liquidity concentrated within particular Pegkeeper pools, which serve a dual purpose as both a source of liquidity and price feeds for crvUSD oracles. If the incentives for depositing crvUSD into these pools are insufficient, the liquidity shortfalls can result in missed liquidations or deflationary price spirals (cascading liquidations). This phenomenon occurs when initial liquidations fail to be executed effectively, leading to a domino effect of further liquidations and potentially rapid, significant decreases in asset prices." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:267 -msgid "crvUSD relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. Users need to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:61 -msgid "crvUSD smart contract Audits" +msgid "crvUSD Pools" msgstr "" #: src/layout/HeaderMobile.tsx:180 #: src/layout/HeaderSecondary.tsx:41 -#~ msgid "crvUSD Total Supply" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:57 -msgid "crvUSD Whitepaper" +msgid "crvUSD Total Supply" msgstr "" -#: src/hooks/useTitleMapper.tsx:48 +#: src/components/LoanInfoUser/index.tsx:225 msgid "Current balance (est.) / Deposited" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:132 -msgid "Curve incorporates specialized on-chain Exponential Moving Average (EMA) oracles built into stabelswap-ng, tricrypto-ng, and twocrypto-ng Curve pool implementations. crvUSD markets derive price information from a select number of high TVL Curve pools. By utilizing the EMA smoothing methodology, oracles mitigate the impact of transient price fluctuations, aiming to reduce unnecessary losses caused by short-term market volatility or attempts to manipulate the oracle. Despite the manipulation-resistant design specification, Curve pool oracles may exhibit price distortions in certain scenarios that have the potential to result in missed or excessive liquidations. This may be a result of liquidity and volume migration to alternate venues that increase the risk of oracle manipulation. A detailed explanation of the aforementioned terms can be found in the <0>crvUSD Oracle documentation." -msgstr "" - -#: src/layout/Footer.tsx:69 +#: src/layout/Footer.tsx:64 msgid "Curve Monitor" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:130 -msgid "Curve Pool EMA Oracles" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:276 -msgid "Curve smart contracts have undergone multiple audits by reputable firms, including MixBytes and ChainSecurity, to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:47 -msgid "Curve stablecoin infrastructure enables users to mint crvUSD using a selection of crypto-tokenized collaterals (adding new ones is subject to DAO approval). Interacting with crvUSD doesn't come without risks. Before minting or taking exposure of crvUSD, it is best to research and understand the risks involved." -msgstr "" - -#: src/components/AdvancedSettings.tsx:189 +#: src/components/AdvancedSettings.tsx:185 msgid "Custom" msgstr "" -#: src/layout/Header.tsx:97 -msgid "Daily volume" -msgstr "" - -#: src/components/LoanInfoUser/components/UserInfoDebt.tsx:25 #: src/components/PageLoanManage/LoanDecrease/index.tsx:258 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:308 -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:40 msgid "Debt" msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:41 -msgid "Debt Ceiling" -msgstr "" - -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:40 -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:44 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:43 msgid "Debt:" msgstr "" -#: src/components/PageLoanManage/index.tsx:37 +#: src/components/PageLoanManage/index.tsx:39 msgid "Deleverage" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:249 -msgid "Depegging Risk" -msgstr "" - -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:31 -msgid "Deposit" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:74 +#: src/components/PageMarketList/components/DialogSortContent.tsx:71 msgid "Desc" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:388 -msgid "Developer Dependency" -msgstr "" - -#: src/layout/Footer.tsx:97 +#: src/layout/Footer.tsx:103 msgid "Developer Docs" msgstr "" -#: src/components/PageMarketList/index.tsx:152 +#: src/components/PageMarketList/index.tsx:165 msgid "Didn't find what you're looking for?" msgstr "" -#: src/components/AdvancedSettings.tsx:139 +#: src/components/AdvancedSettings.tsx:135 msgid "Discard" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:435 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "" - -#: src/layout/Footer.tsx:47 +#: src/layout/Footer.tsx:42 msgid "Discord" msgstr "" -#: src/layout/Footer.tsx:43 +#: src/layout/Footer.tsx:38 msgid "Dodo" msgstr "" -#: src/layout/Footer.tsx:66 +#: src/layout/Footer.tsx:61 msgid "Dune Analytics" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:167 -msgid "Dynamic Interest Rates" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:302 -msgid "Engaging with crypto assets involves exposure to a range of technological risks inherent to the use of new and evolving technologies. Users must be aware of key risk factors (as outlined below) and consider their implications for crypto asset transactions." -msgstr "" - #: src/components/Page404/Page.tsx:11 -#~ msgid "Error 404" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:186 -msgid "Essentially, the borrow rate increases when the price of crvUSD goes lower and/or the proportion of Pegkeeper debt to total debt reduces. This process is intended to dynamically regulate market behavior such that it reinforces the crvUSD peg. Changes to the Monetary Policy are authorized only by the Curve DAO. A <0>crvUSD rate tool by 0xReviews allows Users to visualize the influence of these factors on the borrowing rate." -msgstr "" - -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:69 -msgid "Est. update profit:" +msgid "Error 404" msgstr "" #: src/components/DetailInfoEstimateGas.tsx:61 @@ -539,75 +347,46 @@ msgstr "" msgid "Estimated TX cost:" msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:291 -#: src/components/PageLoanCreate/Page.tsx:182 -#: src/components/PageLoanManage/Page.tsx:166 -msgid "Expand chart" -msgstr "" - #: src/layout/Footer.tsx:95 -#~ msgid "FAQ" -#~ msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:300 -msgid "General Blockchain Technology Risks" +msgid "FAQ" msgstr "" -#: src/layout/Footer.tsx:94 +#: src/layout/Footer.tsx:114 msgid "Github" msgstr "" -#: src/components/DetailInfoHealth.tsx:121 -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:34 -#: src/hooks/useTitleMapper.tsx:30 -msgid "Hard liquidation is triggered when health is 0 or below." -msgstr "" - #: src/components/LoanInfoUser/index.tsx:185 -#~ msgid "Health" -#~ msgstr "" - -#: src/hooks/useTitleMapper.tsx:39 -msgid "Health %" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:25 -msgid "Health status" +msgid "Health" msgstr "" -#: src/components/DetailInfoHealth.tsx:115 +#: src/components/DetailInfoHealth.tsx:113 msgid "Health:" msgstr "" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 msgid "High price impact:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:119 -msgid "If the health of the loan falls to zero, the position is subject to hard liquidation, which is an irreversible process resulting in the loss of the collateral with no possibility of recovery or de-liquidation. This scenario underscores the critical need for risk management when using leverage. Leverage and collateral management should be approached with caution, reflecting a balanced assessment of potential gains against the risk of significant financial loss." -msgstr "" - #: src/domain/components/DetailInfoHealth.tsx:182 #~ msgid "Increasing your borrowed amount by {0} will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:196 +#: src/components/DetailInfoHealth.tsx:186 msgid "Increasing your borrowed amount by {formattedAmount} will put you close to soft liquidation." msgstr "" -#: src/components/PageIntegrations/Page.tsx:37 -#: src/layout/Footer.tsx:103 -#: src/layout/Header.tsx:74 -#: src/layout/Header.tsx:80 +#: src/components/PageIntegrations/Page.tsx:38 +#: src/layout/Footer.tsx:99 +#: src/layout/Header.tsx:42 msgid "Integrations" msgstr "" -#: src/components/PageMarketList/index.tsx:154 +#: src/components/PageMarketList/index.tsx:167 msgid "Join the Telegram" msgstr "" -#: src/components/PageLoanCreate/index.tsx:27 +#: src/components/PageLoanCreate/index.tsx:31 msgid "Leverage" msgstr "" @@ -620,15 +399,16 @@ msgstr "" #~ msgstr "" #: src/components/ChartLiquidationRange/index.tsx:92 -#: src/hooks/useTitleMapper.tsx:40 +#: src/components/LoanInfoUser/index.tsx:164 +#: src/components/LoanInfoUser/index.tsx:205 msgid "Liquidation range" msgstr "" -#: src/components/LoanInfoUser/index.tsx:72 +#: src/components/LoanInfoUser/index.tsx:266 msgid "Liquidation Range" msgstr "" -#: src/components/DetailInfoLiqRange.tsx:101 +#: src/components/DetailInfoLiqRange.tsx:100 msgid "Liquidation range:" msgstr "" @@ -636,10 +416,6 @@ msgstr "" msgid "Liquidation range{0}" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:214 -msgid "Liquidity Risk" -msgstr "" - #: src/domain/layout/Footer.tsx:62 #~ msgid "Llama Airforce" #~ msgstr "" @@ -648,23 +424,19 @@ msgstr "" msgid "LLAMMA {collateralName} Avail." msgstr "" -#: src/components/ChartOhlcWrapper/index.tsx:286 -msgid "LLAMMA Activity" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:58 +#: src/components/LoanInfoUser/index.tsx:281 msgid "LLAMMA Balances" msgstr "" -#: src/components/PageLoanManage/Page.tsx:72 +#: src/components/PageLoanManage/Page.tsx:58 msgid "LLAMMA Details" msgstr "" -#: src/components/LoanFormConnect.tsx:34 +#: src/components/LoanFormConnect.tsx:29 msgid "Loading" msgstr "" -#: src/components/PageLoanManage/index.tsx:35 +#: src/components/PageLoanManage/index.tsx:37 msgid "Loan" msgstr "" @@ -672,7 +444,7 @@ msgstr "" msgid "Loan Created" msgstr "" -#: src/components/LoanInfoLlamma/index.tsx:67 +#: src/components/LoanInfoLlamma/index.tsx:109 msgid "Loan parameters" msgstr "" @@ -684,26 +456,21 @@ msgstr "" msgid "Loan to Value ratio:" msgstr "" -#: src/hooks/useTitleMapper.tsx:52 +#: src/components/LoanInfoUser/index.tsx:233 msgid "Loss amount" msgstr "" -#: src/components/PageLoanManage/Page.tsx:152 +#: src/components/PageLoanManage/Page.tsx:131 msgid "Manage" msgstr "" -#: src/components/PageMarketList/components/TableRowMobile.tsx:114 +#: src/components/PageMarketList/components/TableRowMobile.tsx:135 msgid "Manage Loan" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:212 -msgid "Market Risks" -msgstr "" - -#: src/components/PageMarketList/Page.tsx:34 -#: src/hooks/useTitleMapper.tsx:10 -#: src/layout/Header.tsx:72 -#: src/layout/Header.tsx:79 +#: src/components/PageMarketList/index.tsx:60 +#: src/components/PageMarketList/Page.tsx:33 +#: src/layout/Header.tsx:40 msgid "Markets" msgstr "" @@ -711,78 +478,54 @@ msgstr "" msgid "Max borrow amount" msgstr "" -#: src/components/AdvancedSettings.tsx:159 +#: src/components/AdvancedSettings.tsx:155 msgid "Max Slippage" msgstr "" -#: src/components/AdvancedSettings.tsx:161 +#: src/components/AdvancedSettings.tsx:157 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "" -#: src/components/AdvancedSettings.tsx:116 +#: src/components/AdvancedSettings.tsx:115 msgid "Min. slippage is 0.01%" msgstr "" #: src/layout/HeaderMobile.tsx:164 -#~ msgid "Mode" -#~ msgstr "" +msgid "Mode" +msgstr "" -#: src/components/LoanInfoLlamma/index.tsx:61 +#: src/components/LoanInfoLlamma/index.tsx:103 msgid "Monetary Policy" msgstr "" -#: src/hooks/useTitleMapper.tsx:13 +#: src/components/PageMarketList/index.tsx:62 msgid "My debt" msgstr "" -#: src/hooks/useTitleMapper.tsx:14 +#: src/components/PageMarketList/index.tsx:61 msgid "My health" msgstr "" -#: src/components/DetailInfoN.tsx:13 +#: src/components/DetailInfoN.tsx:10 msgid "N:" msgstr "" -#: src/layout/Footer.tsx:118 +#: src/layout/Footer.tsx:106 msgid "News" msgstr "" -#: src/components/PageMarketList/index.tsx:159 +#: src/components/PageMarketList/index.tsx:172 msgid "No collateral found for \"{0}\". Feel free to search other tabs, or" msgstr "" -#: src/components/PageMarketList/index.tsx:166 +#: src/components/PageMarketList/index.tsx:179 msgid "No collateral found in this category" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:374 -msgid "No Control" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:87 -msgid "No controller data found." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:236 -msgid "No Guarantee of Price Stability" -msgstr "" - #: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:417 -msgid "No Investment and Legal Advice" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:286 -msgid "No Loss Prevention" -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:80 -msgid "No trades data found." -msgstr "" - #: src/components/LoanFormAlertError.tsx:45 msgid "Not eligible for liquidation" msgstr "" @@ -793,13 +536,13 @@ msgstr "" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "off" -#~ msgstr "" +msgid "off" +msgstr "" #: src/layout/HeaderMobile.tsx:172 #: src/layout/HeaderSecondary.tsx:61 -#~ msgid "on" -#~ msgstr "" +msgid "on" +msgstr "" #: src/components/AlertFormWarning.tsx:30 msgid "Once the loan is paid off, you will no longer be able to manage this loan." @@ -820,30 +563,14 @@ msgstr "" msgid "Oracle price" msgstr "" -#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:35 +#: src/components/LoanInfoLlamma/LoanInfoParameters.tsx:36 msgid "Oracle Price" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:37 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertPartial.tsx:35 msgid "Partial repayment LLAMMA changes:" msgstr "" -#: src/components/PagePegKeepers/Page.tsx:33 -msgid "Peg Keepers" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:152 -msgid "Pegkeepers" -msgstr "" - -#: src/components/PagePegKeepers/Page.tsx:30 -msgid "PegKeepers" -msgstr "" - -#: src/components/PageMarketList/components/TableStats.tsx:14 -msgid "PegKeepers Debt" -msgstr "" - #: src/components/PageLoanManage/LoanDecrease/index.tsx:111 msgid "Please approve a repayment of {debt} {0}." msgstr "" @@ -858,7 +585,7 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:142 #: src/components/PageLoanManage/LoanIncrease/index.tsx:162 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:103 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:99 msgid "Please approve spending of {0}" msgstr "" @@ -874,7 +601,7 @@ msgstr "" msgid "Please approve spending your {item1Name}." msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:117 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:113 msgid "Please confirm {stablecoinName} self-liquidation at max {maxSlippage}% slippage." msgstr "" @@ -902,10 +629,6 @@ msgstr "" msgid "Please confirm swapping {swapAmount} {item1Name} at max {maxSlippage} slippage." msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:39 -msgid "Please confirm update {poolName} pool" -msgstr "" - #: src/domain/layout/index.tsx:66 #~ msgid "Please connect wallet to view loan details" #~ msgstr "" @@ -914,34 +637,21 @@ msgstr "" #~ msgid "Please switch your wallet's network to <0>{0}to use Curve on <1>{1}." #~ msgstr "" -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:64 +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:60 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:269 #: src/components/PageLoanManage/LoanSwap/index.tsx:296 msgid "Price impact:" msgstr "" -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:75 -msgid "Profit is denominated in {poolName} LP Tokens" -msgstr "" - -#: src/hooks/useTitleMapper.tsx:42 +#: src/components/LoanInfoUser/index.tsx:211 msgid "Range %" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:44 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:227 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:43 msgid "Receive:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:402 -msgid "Regulatory Risks" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:404 -msgid "Regulatory Uncertainty" -msgstr "" - -#: src/components/PageLoanManage/index.tsx:55 +#: src/components/PageLoanManage/index.tsx:51 msgid "Remove" msgstr "" @@ -953,7 +663,7 @@ msgstr "" #~ msgid "Removing {0} collateral, will put you close to soft liquidation." #~ msgstr "" -#: src/components/DetailInfoHealth.tsx:192 +#: src/components/DetailInfoHealth.tsx:182 msgid "Removing {formattedAmount} collateral, will put you close to soft liquidation." msgstr "" @@ -962,7 +672,7 @@ msgstr "" msgid "Repaid" msgstr "" -#: src/components/PageLoanManage/index.tsx:49 +#: src/components/PageLoanManage/index.tsx:45 #: src/components/PageLoanManage/LoanDecrease/index.tsx:172 #: src/components/PageLoanManage/LoanDeleverage/index.tsx:155 msgid "Repay" @@ -972,64 +682,47 @@ msgstr "" msgid "Repay anyway" msgstr "" -#: src/components/PageLoanManage/LoanDecrease/index.tsx:273 +#: src/components/PageLoanManage/LoanDecrease/index.tsx:268 msgid "Repay in full and close loan" msgstr "" -#: src/layout/Footer.tsx:91 -#: src/layout/Header.tsx:195 +#: src/layout/Footer.tsx:109 +#: src/layout/HeaderMobile.tsx:152 msgid "Resources" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:57 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:56 msgid "Return to wallet:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:41 -#: src/components/PageDisclaimer/Page.tsx:44 -#: src/layout/Header.tsx:73 -#: src/layout/Header.tsx:81 +#: src/components/PageDisclaimer/Page.tsx:28 +#: src/components/PageDisclaimer/Page.tsx:30 +#: src/layout/Header.tsx:41 msgid "Risk Disclaimer" msgstr "" -#: src/components/AdvancedSettings.tsx:151 +#: src/components/AdvancedSettings.tsx:147 msgid "Save" msgstr "" -#: src/components/PageLoanManage/index.tsx:50 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/index.tsx:46 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidate" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:114 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:110 msgid "Self-liquidated" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:207 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:203 msgid "Self-liquidation amount" msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:226 -msgid "Self-liquidation amount:" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:181 -msgid "several variables set by the Monetary Policy admin" -msgstr "" - -#: src/components/DetailInfoSlippageTolerance.tsx:16 +#: src/components/DetailInfoSlippageTolerance.tsx:14 msgid "Slippage tolerance:" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:265 -msgid "Smart Contract Risk" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:77 -msgid "Soft-Liquidation and Hard-Liquidation" -msgstr "" - -#: src/components/PageMarketList/components/DialogSortContent.tsx:68 +#: src/components/PageMarketList/components/DialogSortContent.tsx:65 msgid "Sort By" msgstr "" @@ -1037,20 +730,19 @@ msgstr "" #: src/components/PageLoanManage/CollateralIncrease/index.tsx:140 #: src/components/PageLoanManage/LoanDecrease/index.tsx:159 #: src/components/PageLoanManage/LoanIncrease/index.tsx:160 -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:101 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:97 #: src/components/PageLoanManage/LoanSwap/index.tsx:161 msgid "Spending Approved" msgstr "" #: src/components/LoanInfoUser/index.tsx:178 -#~ msgid "Status" -#~ msgstr "" +msgid "Status" +msgstr "" #: src/components/DetailInfoEstimateGas.tsx:62 msgid "Step {0} of {1}" msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:73 #: src/components/PageLoanManage/LoanSwap/index.tsx:176 msgid "Swap" msgstr "" @@ -1063,105 +755,52 @@ msgstr "" msgid "Swapped" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:263 -msgid "Technology Risk" -msgstr "" - -#: src/layout/Footer.tsx:33 +#: src/layout/Footer.tsx:28 msgid "Telegram" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:251 -msgid "The blockchain ecosystem has witnessed instances where stablecoins experienced significant and prolonged periods of depegging from their intended value. Despite the innovative measures designed to uphold price stability, crvUSD is not exempt from the risk of depegging. Market volatility, shifts in regulatory landscapes, sudden and substantial changes in the value of collateral assets, or unforeseen technical issues can precipitate a departure from its pegged value." -msgstr "" - -#: src/hooks/useTitleMapper.tsx:17 +#: src/components/PageMarketList/index.tsx:67 msgid "The borrow rate changes with supply and demand for crvUSD, reflected in the price and total debt versus PegKeeper debt. Rates increase to encourage debt reduction, and decrease to encourage borrowing." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:169 -msgid "The borrowing rate is algorithmically determined based on several factors, including" -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:175 -msgid "the crvUSD price as reported by an on-chain price aggregator contract," -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:364 -msgid "The crvUSD protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including deploying new crvUSD markets, setting implementation contracts, and setting parameters that influence market behavior." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:419 -msgid "The data and communications made available on the crvUSD platform, including but not limited to its front-end interfaces, are intended purely for informational purposes and should not under any circumstances be interpreted as constituting investment, financial, trading, legal, or any form of professional advice. The content provided through the crvUSD front-end interface(s) is designed to support users' understanding of the stablecoin, the protocol, and its functionalities, not to guide or influence decision-making regarding investments or financial strategies. Users must be aware that they are the only entity capable of adequately assessing whether an action taken aligns with their financial objectives and circumstances." -msgstr "" - -#: src/components/PageIntegrations/Page.tsx:42 +#: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "" -#: src/components/DetailInfoHealth.tsx:119 -#: src/hooks/useTitleMapper.tsx:28 +#: src/components/DetailInfoHealth.tsx:116 msgid "The loan metric indicates the current health of your position." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:390 -msgid "The ongoing development, maintenance, and scalability of the crvUSD protocol is dependent on developers' contributions. While numerous developers are currently engaged in the project, there is no assurance that this level of contribution will persist indefinitely. The future involvement of developers is subject to change due to a variety of factors that could influence their capacity or willingness to contribute." -msgstr "" - -#: src/components/DetailInfoLiqRange.tsx:95 +#: src/components/DetailInfoLiqRange.tsx:94 msgid "The range of prices where collateral is managed by the market-maker. Collateral begins to be sold off when its price enters your liquidation range (\"soft liquidation\"). If the market-maker cannot keep the position sufficiently collateralized, an externally triggered \"hard\" liquidation may take place." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:178 -msgid "the ratio of Pegkeeper debt to total outstanding debt," -msgstr "" - #: src/hooks/useTokenAlert.tsx:34 msgid "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown. This is out of our control, but we will do everything in our power to make sure the peg of Ren assets is maintained." msgstr "" -#: src/components/PageDisclaimer/Page.tsx:238 -msgid "The value of the crypto assets used as collateral for crvUSD is subject to high levels of volatility and unpredictability. The pricing of these assets may be extremely speculative and prone to rapid fluctuations. Such market characteristics can impact the stability of crvUSD’s value. While the LLAMMA algorithm aims to adjust collateral levels to support crvUSD’s value, there is no guarantee that these adjustments will always preserve stability, especially during periods of extreme market volatility." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:199 -msgid "There may be assumptions in the Monetary Policy design that, in some circumstances, cause interest rates to produce undesired outcomes, and which may cause a sub-optimal experience for borrowers. In general, interest rates on borrowing may change dramatically in response to changing market circumstances, and may not reflect a borrower's expectations when they had opened their position." -msgstr "" - -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:102 -msgid "There was an error fetching the pool activity data." -msgstr "" - -#: src/hooks/useTitleMapper.tsx:55 +#: src/components/LoanInfoUser/index.tsx:238 msgid "This metric measures the loss in collateral value caused by LLAMMA's soft liquidation process, which is activated when the oracle price falls within a user’s liquidation range." msgstr "" -#: src/components/ChartOhlcWrapper/PoolActivity.tsx:74 -msgid "Time" -msgstr "" - #: src/domain/components/loan-collateral-list/index.tsx:56 #~ msgid "Total borrowed" #~ msgstr "" #: src/components/PageMarketList/index.tsx:74 -#~ msgid "Total collateral value" -#~ msgstr "" +msgid "Total collateral value" +msgstr "" #: src/components/PageMarketList/index.tsx:71 -#~ msgid "Total debt" -#~ msgstr "" +msgid "Total debt" +msgstr "" #: src/components/LoanInfoUser/index.tsx:296 -#~ msgid "Total debt:" -#~ msgstr "" - -#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:146 -msgid "Total position collateral:" +msgid "Total debt:" msgstr "" -#: src/layout/Header.tsx:98 -msgid "Total Supply" +#: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoLeverage.tsx:138 +msgid "Total position collateral:" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/components/DetailInfoTradeRoutes.tsx:42 @@ -1178,7 +817,6 @@ msgid "Transaction complete" msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:126 -#: src/components/PagePegKeepers/components/PegKeeperForm.tsx:45 msgid "Transaction complete." msgstr "" @@ -1190,11 +828,11 @@ msgstr "" msgid "Transaction complete. This loan is payoff and will no longer be manageable." msgstr "" -#: src/components/PageLoanManage/LoanLiquidate/index.tsx:125 +#: src/components/PageLoanManage/LoanLiquidate/index.tsx:121 msgid "Transaction complete. This loan will no longer exist. Click <0>here to go back to collateral list." msgstr "" -#: src/layout/Footer.tsx:30 +#: src/layout/Footer.tsx:25 msgid "Twitter" msgstr "" @@ -1242,7 +880,7 @@ msgid "Unable to get total supply" msgstr "" #: src/components/DetailInfoEstimateGas.tsx:78 -#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:47 +#: src/components/PageMarketList/components/TableCellTotalCollateral.tsx:26 msgid "Unable to get USD rate" msgstr "" @@ -1263,33 +901,17 @@ msgstr "" msgid "Unable to swap" msgstr "" -#: src/components/PageDisclaimer/Page.tsx:216 -msgid "Users should be aware that ample crvUSD liquidity on exchange is necessary for facilitating liquidations. Circumstances leading to a reduction in the available crvUSD liquidity for liquidators are plausible. Such scenarios can significantly impact the proper functioning of the stablecoin market, particularly concerning the process of liquidation." -msgstr "" - -#: src/components/PageDisclaimer/Page.tsx:107 -msgid "Users should be cautious about collateral management, as a sharp decline in the price of the collateral within a brief period can escalate losses, further deteriorating the health of the loan. Respectively, an increase in the collateral's value while in soft-liquidation can also cause “de-liquidation losses” - a situation where an appreciating market price for the collateral may negatively impact the loan’s health. During periods of high volatility and/or high Ethereum gas prices, arbitrage may be less efficient, causing losses incurred from soft liquidation to be exacerbated." -msgstr "" - -#: src/components/PageMarketList/index.tsx:161 +#: src/components/PageMarketList/index.tsx:174 msgid "view all collateral." msgstr "" -#: src/components/PageMarketList/components/TableCellMarketsTotalDebt.tsx:31 -msgid "View details" -msgstr "" - -#: src/components/PagePegKeepers/components/PegKeeperContent.tsx:45 -msgid "View:" -msgstr "" - #: src/layout/HeaderMobile.tsx:136 -#~ msgid "Visit Curve.fi" -#~ msgstr "" +msgid "Visit Curve.fi" +msgstr "" #: src/components/LoanInfoUser/index.tsx:307 -#~ msgid "Wallet Balances" -#~ msgstr "" +msgid "Wallet Balances" +msgstr "" #: src/components/PageLoanCreate/LoanFormCreate/index.tsx:362 msgid "WARNING: The corresponding deleverage button is also not yet available." @@ -1307,18 +929,14 @@ msgstr "" msgid "Warning! Exchange rate is too low!" msgstr "" -#: src/layout/Footer.tsx:106 +#: src/layout/Footer.tsx:83 msgid "Whitepaper" msgstr "" -#: src/layout/Footer.tsx:62 +#: src/layout/Footer.tsx:57 msgid "Wiki CN" msgstr "" -#: src/components/ChartOhlcWrapper/LiquidityData.tsx:54 -msgid "Withdrawal" -msgstr "" - #: src/components/ChartBandBalances/ChartBandBalancesSettingsContent.tsx:29 msgid "x-axis display" msgstr "" @@ -1327,7 +945,7 @@ msgstr "" #~ msgid "You are in soft-liquidation mode. The amount currently at risk is {0} {1}. In this mode, you cannot withdraw collateral or add more to your position. To exit self-liquidation mode you can repay or self-liquidate." #~ msgstr "" -#: src/components/LoanInfoUser/components/AlertSoftLiquidation.tsx:32 +#: src/components/LoanInfoUser/index.tsx:174 msgid "You are in soft-liquidation mode. The amount currently at risk is {softLiquidationAmountText}. In this mode, you cannot partially withdraw or add more collateral to your position. To reduce the risk of hard liquidation, you can repay or, to exit soft liquidation, you can close (self-liquidate)." msgstr "" @@ -1335,7 +953,7 @@ msgstr "" msgid "You are not in liquidation mode." msgstr "" -#: src/components/DetailInfoHealth.tsx:188 +#: src/components/DetailInfoHealth.tsx:178 msgid "You are still close to soft liquidation." msgstr "" @@ -1359,15 +977,15 @@ msgstr "" msgid "You have a high price impact {priceImpact}%!" msgstr "" -#: src/components/PageLoanManage/Page.tsx:73 -#: src/components/PageLoanManage/Page.tsx:75 +#: src/components/PageLoanManage/Page.tsx:57 +#: src/components/PageLoanManage/Page.tsx:60 msgid "Your Loan Details" msgstr "" -#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:39 +#: src/components/PageLoanManage/LoanDeleverage/components/LoanDeleverageAlertFull.tsx:38 msgid "Your loan will be paid off" msgstr "" -#: src/layout/Footer.tsx:50 +#: src/layout/Footer.tsx:45 msgid "YouTube" msgstr "" diff --git a/apps/main/src/locales/en/messages.po b/apps/main/src/locales/en/messages.po index 29961197d..7702f0f42 100644 --- a/apps/main/src/locales/en/messages.po +++ b/apps/main/src/locales/en/messages.po @@ -13,26 +13,26 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/components/PageDashboard/index.tsx:199 +#: src/components/PageDashboard/index.tsx:205 msgid ". Please click on the pool name to view them on" msgstr ". Please click on the pool name to view them on" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "(incl. fees):" msgstr "(incl. fees):" -#: src/components/PageCreatePool/constants.ts:217 -#: src/components/PageCreatePool/constants.ts:223 +#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:191 msgid "(only available for pools with pegged assets)" msgstr "(only available for pools with pegged assets)" -#: src/components/PageCreatePool/TokensInPool/index.tsx:763 +#: src/components/PageCreatePool/TokensInPool/index.tsx:595 msgid "(Switch)" msgstr "(Switch)" #: src/components/PageCreatePool/components/InfoBox.tsx:27 #: src/components/PageCreatePool/components/InfoBox.tsx:33 -#: src/components/PageCreatePool/constants.ts:216 +#: src/components/PageCreatePool/constants.ts:184 msgid "{0}" msgstr "{0}" @@ -68,22 +68,18 @@ msgstr "{0}" #~ msgid "{0} deposited and staked approved" #~ msgstr "{0} deposited and staked approved" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:69 -msgid "{0} is a Cryptoswap pool" -msgstr "{0} is a Cryptoswap pool" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:78 -#~ msgid "{0} is a v2 pool" -#~ msgstr "{0} is a v2 pool" +msgid "{0} is a v2 pool" +msgstr "{0} is a v2 pool" #: src/domain/create-pool/parameters/initial-price.tsx:33 #: src/domain/create-pool/parameters/initial-price.tsx:42 #~ msgid "{0} price" #~ msgstr "{0} price" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:34 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:45 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:57 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:32 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:43 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:55 msgid "{0} price in USD" msgstr "{0} price in USD" @@ -115,27 +111,19 @@ msgstr "{0} price in USD" #~ msgid "{0} withdraw approved" #~ msgstr "{0} withdraw approved" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:291 -msgid "{filterValue} is a disabled token in Pool Creation" -msgstr "{filterValue} is a disabled token in Pool Creation" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:293 -msgid "{filterValue} is a disabled token in this pool configuration." -msgstr "{filterValue} is a disabled token in this pool configuration." - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:68 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:54 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 msgid "{title} {0} Oracle" msgstr "{title} {0} Oracle" -#: src/components/PageDashboard/index.tsx:188 +#: src/components/PageDashboard/index.tsx:194 msgid "*This UI does not support the following pools:" msgstr "*This UI does not support the following pools:" #: src/components/PageDashboard/index.tsx:66 #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "+ Incentives)" -#~ msgstr "+ Incentives)" +msgid "+ Incentives)" +msgstr "+ Incentives)" #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:18 msgid "1 month" @@ -149,7 +137,7 @@ msgstr "1 week" msgid "1 year" msgstr "1 year" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:67 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:76 msgid "24h Volume/Liquidity ratio" msgstr "24h Volume/Liquidity ratio" @@ -157,18 +145,10 @@ msgstr "24h Volume/Liquidity ratio" msgid "3 months" msgstr "3 months" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:92 -msgid "3CRV have been claimed and sent to 3pool." -msgstr "3CRV have been claimed and sent to 3pool." - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:22 msgid "4 years" msgstr "4 years" -#: src/components/PageRiskDisclaimer/index.tsx:72 -msgid "5-of-9 multisig" -msgstr "5-of-9 multisig" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:20 msgid "6 months" msgstr "6 months" @@ -177,30 +157,26 @@ msgstr "6 months" #~ msgid "A" #~ msgstr "A" -#: src/components/PageCreatePool/Parameters/index.tsx:301 -#: src/components/PageCreatePool/Parameters/index.tsx:334 +#: src/components/PageCreatePool/Parameters/index.tsx:296 +#: src/components/PageCreatePool/Parameters/index.tsx:329 msgid "A ({0} - {1})" msgstr "A ({0} - {1})" -#: src/components/PageCreatePool/constants.ts:224 +#: src/components/PageCreatePool/constants.ts:192 msgid "A more gas-efficient implementation that can be used when every token in the pool has 18 decimals and returns True on success / reverts on error" msgstr "A more gas-efficient implementation that can be used when every token in the pool has 18 decimals and returns True on success / reverts on error" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:75 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:193 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:28 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:83 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:65 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:169 msgid "A:" msgstr "A:" -#: src/components/PageRiskDisclaimer/index.tsx:61 -msgid "Access Control:" -msgstr "Access Control:" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 msgid "Action" msgstr "Action" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:41 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:42 msgid "Add" msgstr "Add" @@ -208,33 +184,28 @@ msgstr "Add" msgid "Add all coins in a balanced proportion" msgstr "Add all coins in a balanced proportion" -#: src/components/PagePool/components/AddGaugeLink.tsx:58 +#: src/components/PagePool/components/AddGaugeLink.tsx:50 msgid "Add Gauge" msgstr "Add Gauge" -#: src/components/PageCreatePool/TokensInPool/index.tsx:796 +#: src/components/PageCreatePool/TokensInPool/index.tsx:639 msgid "Add token" msgstr "Add token" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:146 -#: src/components/PagePoolList/components/TableRowMobile.tsx:149 -msgid "Additional external rewards" -msgstr "Additional external rewards" - -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:291 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:280 msgid "Additional slippage tolerance" msgstr "Additional slippage tolerance" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:291 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:476 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:288 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:475 msgid "Additional slippage tolerance:" msgstr "Additional slippage tolerance:" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:77 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 msgid "Address (e.g 0x123...)" msgstr "Address (e.g 0x123...)" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:57 msgid "Address:" msgstr "Address:" @@ -242,12 +213,12 @@ msgstr "Address:" msgid "Adjust veCrv" msgstr "Adjust veCrv" -#: src/components/PageCreatePool/Parameters/index.tsx:380 +#: src/components/PageCreatePool/Parameters/index.tsx:375 msgid "Adjustment Step ({0} - {1})" msgstr "Adjustment Step ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:280 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:118 msgid "Adjustment Step:" msgstr "Adjustment Step:" @@ -255,42 +226,33 @@ msgstr "Adjustment Step:" #~ msgid "Admin fee" #~ msgstr "Admin fee" -#: src/components/PageCreatePool/Parameters/index.tsx:289 -#: src/components/PageCreatePool/Summary/index.tsx:28 -#: src/components/PagePool/index.tsx:129 +#: src/components/PageCreatePool/Parameters/index.tsx:284 +#: src/components/PageCreatePool/Summary/index.tsx:41 +#: src/components/PagePool/index.tsx:106 +#: src/components/PagePool/index.tsx:115 msgid "Advanced" msgstr "Advanced" -#: src/components/AdvancedSettings.tsx:140 +#: src/components/AdvancedSettings.tsx:131 msgid "Advanced Settings" msgstr "Advanced Settings" -#: src/components/PagePoolList/index.tsx:96 +#: src/components/PagePoolList/index.tsx:102 msgid "ALL" msgstr "ALL" -#: src/components/PageCreatePool/Parameters/index.tsx:358 +#: src/components/PageCreatePool/Parameters/index.tsx:353 msgid "Allowed Extra Profit ({0} - {1})" msgstr "Allowed Extra Profit ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:91 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:268 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:106 msgid "Allowed Extra Profit:" msgstr "Allowed Extra Profit:" -#: src/components/PagePool/Swap/index.tsx:402 -#: src/components/PageRouterSwap/index.tsx:431 -msgid "Amount > wallet balance {0}" -msgstr "Amount > wallet balance {0}" - #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:173 -#~ msgid "Amplification coefficient chosen from fluctuation of prices around 1" -#~ msgstr "Amplification coefficient chosen from fluctuation of prices around 1" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:200 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:34 -msgid "Amplification coefficient chosen from fluctuation of prices around 1." -msgstr "Amplification coefficient chosen from fluctuation of prices around 1." +msgid "Amplification coefficient chosen from fluctuation of prices around 1" +msgstr "Amplification coefficient chosen from fluctuation of prices around 1" #: src/domain/transfer/withdraw/form-withdraw/withdraw-actions.tsx:311 #~ msgid "Approve Remove Liquidity" @@ -298,12 +260,12 @@ msgstr "Amplification coefficient chosen from fluctuation of prices around 1." #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Approve Spending" msgstr "Approve Spending" @@ -311,31 +273,11 @@ msgstr "Approve Spending" #~ msgid "Approving" #~ msgstr "Approving" -#: src/layout/default/Header.tsx:193 -msgid "Apps" -msgstr "Apps" - -#: src/components/PageRiskDisclaimer/index.tsx:99 -msgid "are designed to mitigate impermanent loss by pairing assets that are expected to exhibit mean-reverting behavior. This assumption may not hold true in every case, requiring diligent assessment when interacting with these pools." -msgstr "are designed to mitigate impermanent loss by pairing assets that are expected to exhibit mean-reverting behavior. This assumption may not hold true in every case, requiring diligent assessment when interacting with these pools." - -#: src/components/PageRiskDisclaimer/index.tsx:105 -msgid "are designed with an internal oracle to concentrate liquidity around the current market price. The algorithm attempts to offset the effects of impermanent loss by calculating fees generated by the pool and ensuring the pool is in profit before re-pegging. Impermanent loss may still occur in CryptoSwap V2 pools, particularly when the earned fees are insufficient to counterbalance the impact of re-pegging. This underscores the need for users to be attentive about the dynamics of these pools when making decisions about liquidity provision." -msgstr "are designed with an internal oracle to concentrate liquidity around the current market price. The algorithm attempts to offset the effects of impermanent loss by calculating fees generated by the pool and ensuring the pool is in profit before re-pegging. Impermanent loss may still occur in CryptoSwap V2 pools, particularly when the earned fees are insufficient to counterbalance the impact of re-pegging. This underscores the need for users to be attentive about the dynamics of these pools when making decisions about liquidity provision." - -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:48 -msgid "As the number of staked LP Tokens increases, the CRV tAPR will decrease." -msgstr "As the number of staked LP Tokens increases, the CRV tAPR will decrease." - #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Asc" -#~ msgstr "Asc" +msgid "Asc" +msgstr "Asc" -#: src/components/PageRiskDisclaimer/index.tsx:79 -msgid "Asset Risk" -msgstr "Asset Risk" - -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:54 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:76 msgid "Asset Type:" msgstr "Asset Type:" @@ -347,15 +289,15 @@ msgstr "Asset Type:" #~ msgid "Audit" #~ msgstr "Audit" -#: src/layout/default/Footer.tsx:136 +#: src/layout/default/Footer.tsx:102 msgid "Audits" msgstr "Audits" #: src/components/PagePool/components/FieldToken.tsx:69 -#: src/components/PagePool/Swap/index.tsx:352 -#: src/components/PagePool/Swap/index.tsx:443 -#: src/components/PageRouterSwap/index.tsx:391 -#: src/components/PageRouterSwap/index.tsx:457 +#: src/components/PagePool/Swap/index.tsx:347 +#: src/components/PagePool/Swap/index.tsx:438 +#: src/components/PageRouterSwap/index.tsx:370 +#: src/components/PageRouterSwap/index.tsx:427 msgid "Avail." msgstr "Avail." @@ -367,8 +309,8 @@ msgstr "Avail." #~ msgid "Average value of pool token" #~ msgstr "Average value of pool token" -#: src/components/PageDashboard/components/TableRow.tsx:181 -#: src/components/PageDashboard/index.tsx:56 +#: src/components/PageDashboard/components/TableRow.tsx:179 +#: src/components/PageDashboard/index.tsx:67 msgid "Balance" msgstr "Balance" @@ -380,7 +322,7 @@ msgstr "Balance in voting escrow:" #~ msgid "Balance minus estimated gas" #~ msgstr "Balance minus estimated gas" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:354 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:353 msgid "Balanced" msgstr "Balanced" @@ -388,47 +330,35 @@ msgstr "Balanced" #~ msgid "Balanced amounts" #~ msgstr "Balanced amounts" -#: src/components/PagePool/UserDetails/index.tsx:140 +#: src/components/PagePool/UserDetails/index.tsx:139 msgid "Balanced withdraw amounts" msgstr "Balanced withdraw amounts" -#: src/components/PageCreatePool/constants.ts:210 +#: src/components/PageCreatePool/constants.ts:178 msgid "Balances" msgstr "Balances" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:39 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:40 msgid "Base" msgstr "Base" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:169 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:243 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:205 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:201 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:126 msgid "BASE" msgstr "BASE" -#: src/components/PageDashboard/index.tsx:53 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 -#: src/components/PagePoolList/Page.tsx:55 +#: src/components/PageDashboard/index.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:48 +#: src/components/PagePoolList/Page.tsx:57 msgid "Base vAPY" msgstr "Base vAPY" -#: src/components/PagePoolList/components/TableRowMobile.tsx:123 -msgid "BASE vAPY" -msgstr "BASE vAPY" - -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:42 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:41 msgid "Base vAPY can temporarily be negative when A parameter is ramped down, or crypto pools spend profit to rebalance." msgstr "Base vAPY can temporarily be negative when A parameter is ramped down, or crypto pools spend profit to rebalance." -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:100 -msgid "Basepool" -msgstr "Basepool" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:105 -msgid "Basepool:" -msgstr "Basepool:" - -#: src/components/PageCreatePool/constants.ts:204 +#: src/components/PageCreatePool/constants.ts:172 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:34 msgid "Basic" msgstr "Basic" @@ -437,11 +367,11 @@ msgstr "Basic" #~ msgid "Beta" #~ msgstr "Beta" -#: src/components/PageCreatePool/PoolType/index.tsx:32 +#: src/components/PageCreatePool/PoolType/index.tsx:30 msgid "Bonding Curve specialising in pegged assets." msgstr "Bonding Curve specialising in pegged assets." -#: src/components/PageCreatePool/PoolType/index.tsx:45 +#: src/components/PageCreatePool/PoolType/index.tsx:43 msgid "Bonding Curve specialising in unpegged assets." msgstr "Bonding Curve specialising in unpegged assets." @@ -449,7 +379,7 @@ msgstr "Bonding Curve specialising in unpegged assets." msgid "Bonus comes as an advantage from current coin prices which usually appears for coins which are low in balance" msgstr "Bonus comes as an advantage from current coin prices which usually appears for coins which are low in balance" -#: src/layout/default/Footer.tsx:141 +#: src/layout/default/Footer.tsx:119 msgid "Bug Bounty" msgstr "Bug Bounty" @@ -457,15 +387,11 @@ msgstr "Bug Bounty" #~ msgid "Calc" #~ msgstr "Calc" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:228 -msgid "Can't find the pool preset you want? Check out" -msgstr "Can't find the pool preset you want? Check out" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:159 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:162 -#: src/components/PagePool/Swap/index.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:172 -#: src/components/PageRouterSwap/index.tsx:237 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:156 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:157 +#: src/components/PagePool/Swap/index.tsx:200 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:171 +#: src/components/PageRouterSwap/index.tsx:232 msgid "Cancel" msgstr "Cancel" @@ -481,35 +407,35 @@ msgstr "Cancel" #~ msgid "Change network" #~ msgstr "Change network" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:249 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:209 msgid "Chart" msgstr "Chart" -#: src/components/PageCreatePool/components/Navigation.tsx:27 -#: src/components/PageCreatePool/components/Navigation.tsx:39 -#: src/components/PageCreatePool/components/Navigation.tsx:52 -#: src/components/PageCreatePool/components/Navigation.tsx:65 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:130 -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:24 -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:32 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:27 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:59 -#: src/components/PageDeployGauge/ProcessSummary.tsx:46 -#: src/components/PageDeployGauge/ProcessSummary.tsx:78 +#: src/components/PageCreatePool/components/Navigation.tsx:38 +#: src/components/PageCreatePool/components/Navigation.tsx:62 +#: src/components/PageCreatePool/components/Navigation.tsx:105 +#: src/components/PageCreatePool/components/Navigation.tsx:156 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:236 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:46 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:55 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:26 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:57 +#: src/components/PageDeployGauge/ProcessSummary.tsx:39 +#: src/components/PageDeployGauge/ProcessSummary.tsx:60 msgid "Checkmark filled" msgstr "Checkmark filled" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Chevron left" msgstr "Chevron left" -#: src/components/PageCreatePool/components/Navigation.tsx:29 -#: src/components/PageCreatePool/components/Navigation.tsx:42 -#: src/components/PageCreatePool/components/Navigation.tsx:55 -#: src/components/PageCreatePool/components/Navigation.tsx:68 -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:64 +#: src/components/PageCreatePool/components/Navigation.tsx:107 +#: src/components/PageCreatePool/components/Navigation.tsx:158 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Chevron right" msgstr "Chevron right" @@ -518,10 +444,6 @@ msgstr "Chevron right" #~ msgid "Claim" #~ msgstr "Claim" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:56 -msgid "Claim 3CRV" -msgstr "Claim 3CRV" - #: src/components/PagePool/Withdraw/utils.ts:87 msgid "Claim CRV" msgstr "Claim CRV" @@ -530,20 +452,16 @@ msgstr "Claim CRV" msgid "Claim CRV Complete" msgstr "Claim CRV Complete" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:57 -msgid "Claim crvUSD" -msgstr "Claim crvUSD" - #: src/domain/transfer/withdraw/form-claim/index.tsx:149 #~ msgid "Claim Failed" #~ msgstr "Claim Failed" #: src/components/PageDashboard/components/FormClaimFees.tsx:119 -#~ msgid "Claim LP rewards" -#~ msgstr "Claim LP rewards" +msgid "Claim LP rewards" +msgstr "Claim LP rewards" #: src/components/PagePool/Withdraw/components/FormClaim.tsx:110 -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:246 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:247 #: src/components/PagePool/Withdraw/index.tsx:33 msgid "Claim Rewards" msgstr "Claim Rewards" @@ -556,9 +474,9 @@ msgstr "Claim Rewards Complete" #~ msgid "Claim Rewards Failed" #~ msgstr "Claim Rewards Failed" -#: src/components/PageDashboard/components/Summary.tsx:64 -#: src/components/PageDashboard/components/TableRow.tsx:176 -#: src/components/PageDashboard/index.tsx:59 +#: src/components/PageDashboard/components/Summary.tsx:65 +#: src/components/PageDashboard/components/TableRow.tsx:174 +#: src/components/PageDashboard/index.tsx:70 msgid "Claimable Tokens" msgstr "Claimable Tokens" @@ -566,10 +484,6 @@ msgstr "Claimable Tokens" msgid "Claimed {balance}" msgstr "Claimed {balance}" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:85 -msgid "Claimed {key}" -msgstr "Claimed {key}" - #: src/components/PagePool/Withdraw/utils.ts:82 msgid "Claimed {tokensMessage}" msgstr "Claimed {tokensMessage}" @@ -584,14 +498,8 @@ msgstr "Claiming" #: src/layout/default/HeaderMobile.tsx:162 #: src/layout/default/HeaderSecondary.tsx:79 -#~ msgid "Classic UI" -#~ msgstr "Classic UI" - -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:74 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:81 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:100 -msgid "Clear" -msgstr "Clear" +msgid "Classic UI" +msgstr "Classic UI" #: src/domain/transfer/pool-stats/rewards.tsx:45 #~ msgid "Click here to learn more about Base vAPY." @@ -601,45 +509,29 @@ msgstr "Clear" #~ msgid "Click here to learn more about Boosting your CRV rewards." #~ msgstr "Click here to learn more about Boosting your CRV rewards." -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:72 -msgid "Click here to learn more about Cryptoswap pools" -msgstr "Click here to learn more about Cryptoswap pools" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:81 -#~ msgid "Click here to learn more about v2 pools" -#~ msgstr "Click here to learn more about v2 pools" +msgid "Click here to learn more about v2 pools" +msgstr "Click here to learn more about v2 pools" -#: src/layout/default/Footer.tsx:44 -#: src/layout/default/Footer.tsx:65 +#: src/layout/default/Footer.tsx:39 +#: src/layout/default/Footer.tsx:60 msgid "CN" msgstr "CN" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:125 -msgid "Coins:" -msgstr "Coins:" - -#: src/layout/default/Header.tsx:194 +#: src/layout/default/HeaderMobile.tsx:172 msgid "Community" msgstr "Community" -#: src/components/PageCompensation/Page.tsx:67 -#: src/components/PageCompensation/Page.tsx:71 +#: src/components/PageCompensation/Page.tsx:60 +#: src/components/PageCompensation/Page.tsx:64 msgid "Compensation" msgstr "Compensation" -#: src/components/PageRiskDisclaimer/index.tsx:74 -msgid "composed of Curve community members. It has restricted rights to undertake actions that do not directly impact users' funds, including canceling parameter changes authorized by the DAO and halting CRV emissions to a pool. Early pool implementations included a timelimited function to freeze swaps and deposits in case of emergency, but this precautionary function has since been deprecated in current pool implementations." -msgstr "composed of Curve community members. It has restricted rights to undertake actions that do not directly impact users' funds, including canceling parameter changes authorized by the DAO and halting CRV emissions to a pool. Early pool implementations included a timelimited function to freeze swaps and deposits in case of emergency, but this precautionary function has since been deprecated in current pool implementations." - #: src/components/PageCreatePool/ConfirmModal/index.tsx:253 -#~ msgid "Confirm pool setup" -#~ msgstr "Confirm pool setup" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:71 -msgid "Confirm Pool Setup" -msgstr "Confirm Pool Setup" +msgid "Confirm pool setup" +msgstr "Confirm pool setup" -#: src/components/PagePool/components/WarningModal.tsx:89 +#: src/components/PagePool/components/WarningModal.tsx:82 msgid "Confirm warning to proceed." msgstr "Confirm warning to proceed." @@ -647,76 +539,59 @@ msgstr "Confirm warning to proceed." #~ msgid "Connect" #~ msgstr "Connect" -#: src/components/PageDeployGauge/DeploySidechain.tsx:88 +#: src/components/PageDeployGauge/DeploySidechain.tsx:79 msgid "Connect to a sidechain in order to complete the first step and deploy a sidechain gauge." msgstr "Connect to a sidechain in order to complete the first step and deploy a sidechain gauge." -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:87 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:168 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:560 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:625 msgid "Connect to Ethereum" msgstr "Connect to Ethereum" -#: src/components/PageDeployGauge/DeployMainnet.tsx:73 +#: src/components/PageDeployGauge/DeployMainnet.tsx:64 msgid "Connect to Ethereum in order to deploy gauge." msgstr "Connect to Ethereum in order to deploy gauge." -#: src/components/PageDeployGauge/DeploySidechain.tsx:84 +#: src/components/PageDeployGauge/DeploySidechain.tsx:75 msgid "Connect to Ethereum in order to deploy mirror gauge." msgstr "Connect to Ethereum in order to deploy mirror gauge." -#: src/components/FormConnectWallet.tsx:25 -#: src/components/PageCompensation/Page.tsx:90 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:30 +#: src/components/ConnectWallet.tsx:46 +#: src/components/PageCompensation/Page.tsx:77 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:375 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:78 #: src/components/PageCrvLocker/components/FormActions.tsx:23 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:97 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:178 -#: src/components/PagePool/Page.tsx:81 -#: src/components/PagePoolList/index.tsx:245 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:570 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:635 +#: src/components/PagePool/components/TransferActions.tsx:62 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:29 msgid "Connect Wallet" msgstr "Connect Wallet" -#: src/components/PagePool/Page.tsx:80 -msgid "Connect wallet to view pool" -msgstr "Connect wallet to view pool" - -#: src/components/PagePoolList/index.tsx:244 -msgid "Connect wallet to view pool list" -msgstr "Connect wallet to view pool list" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:91 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:172 -#: src/components/PagePool/Page.tsx:82 -#: src/components/PagePoolList/index.tsx:246 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:564 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:629 msgid "Connecting" msgstr "Connecting" -#: src/components/PageCreatePool/index.tsx:174 +#: src/components/PageCreatePool/index.tsx:113 msgid "Connecting to network" msgstr "Connecting to network" #: src/components/PageCreatePool/Parameters/index.tsx:268 #: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#~ msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" -#~ msgstr "Consider choosing the token with the higher unit price as the first token for a more performant AMM" +msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" +msgstr "Consider choosing the token with the higher unit price as the first token for a more performant AMM" #: src/domain/create-pool/confirm-modal/index.tsx:318 #: src/domain/create-pool/summary/index.tsx:146 #~ msgid "Contains rebasing tokens:" #~ msgstr "Contains rebasing tokens:" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:25 -#: src/layout/default/Footer.tsx:118 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:23 +#: src/layout/default/Footer.tsx:114 msgid "Contracts" msgstr "Contracts" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:53 -msgid "Copy address" -msgstr "Copy address" - -#: src/components/PageRiskDisclaimer/index.tsx:59 -msgid "Counterparty Risk" -msgstr "Counterparty Risk" - #: src/domain/create-pool/index.tsx:82 #~ msgid "CREATE CURVE POOL" #~ msgstr "CREATE CURVE POOL" @@ -729,18 +604,14 @@ msgstr "Create Lock" #~ msgid "Create lock spending approved" #~ msgstr "Create lock spending approved" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:42 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:47 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:121 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:145 -#: src/components/PageCreatePool/Page.tsx:31 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:383 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:388 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:218 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:248 +#: src/components/PageCreatePool/Page.tsx:28 msgid "Create Pool" msgstr "Create Pool" -#: src/components/PagePoolList/index.tsx:105 -msgid "Cross-chain" -msgstr "Cross-chain" - #: src/domain/crv-locker/form-lock-crv/index.tsx:122 #~ msgid "CRV approved" #~ msgstr "CRV approved" @@ -761,7 +632,7 @@ msgstr "CRV Avail." #~ msgid "CRV locked {0}" #~ msgstr "CRV locked {0}" -#: src/components/PageDashboard/components/FormVecrv.tsx:188 +#: src/components/PageDashboard/components/FormVecrv.tsx:181 msgid "CRV locked:" msgstr "CRV locked:" @@ -773,32 +644,30 @@ msgstr "CRV locked:" msgid "CRV Locked: {0}" msgstr "CRV Locked: {0}" -#: src/components/PageCrvLocker/Page.tsx:74 -#: src/components/PageCrvLocker/Page.tsx:78 +#: src/components/PageCrvLocker/Page.tsx:75 +#: src/components/PageCrvLocker/Page.tsx:79 msgid "CRV Locker" msgstr "CRV Locker" #~ msgid "CRV LP reward annualized (max APY can be reached with max boost of 2.50)" #~ msgstr "CRV LP reward annualized (max APY can be reached with max boost of 2.50)" -#: src/components/PoolRewardsCrv.tsx:96 +#: src/components/PoolRewardsCrv.tsx:73 msgid "CRV LP reward annualized (max tAPR can be reached with max boost of 2.50)" msgstr "CRV LP reward annualized (max tAPR can be reached with max boost of 2.50)" -#: src/components/PageDashboard/index.tsx:58 +#: src/components/PageDashboard/index.tsx:69 msgid "CRV Profits" msgstr "CRV Profits" -#: src/components/PagePoolList/index.tsx:101 +#: src/components/PagePoolList/index.tsx:107 +#: src/layout/default/Header.tsx:120 +#: src/layout/default/HeaderMobile.tsx:143 msgid "crvUSD" msgstr "crvUSD" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:93 -msgid "crvUSD has been claimed and sent to your wallet." -msgstr "crvUSD has been claimed and sent to your wallet." - -#: src/components/PageCreatePool/constants.ts:103 -#: src/components/PagePoolList/index.tsx:103 +#: src/components/PageCreatePool/constants.ts:87 +#: src/components/PagePoolList/index.tsx:109 msgid "Crypto" msgstr "Crypto" @@ -810,7 +679,7 @@ msgstr "Crypto" #~ msgid "Crypto collateralized stablecoin" #~ msgstr "Crypto collateralized stablecoin" -#: src/components/PageCreatePool/constants.ts:78 +#: src/components/PageCreatePool/constants.ts:74 msgid "Crypto Collateralized Stablecoins" msgstr "Crypto Collateralized Stablecoins" @@ -819,37 +688,26 @@ msgstr "Crypto Collateralized Stablecoins" #~ msgid "Crypto Share" #~ msgstr "Crypto Share" -#: src/components/PagePool/index.tsx:219 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:13 +#: src/components/PagePool/index.tsx:201 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:11 msgid "CRYPTO V2" msgstr "CRYPTO V2" -#: src/layout/default/Header.tsx:71 +#: src/layout/default/HeaderMobile.tsx:225 +#: src/layout/default/HeaderSecondary.tsx:66 msgid "Crypto Volume Share" msgstr "Crypto Volume Share" -#: src/components/PageRiskDisclaimer/index.tsx:110 -msgid "Cryptocurrencies and ERC20 tokens have historically exhibited significant price volatility. They can experience rapid and substantial fluctuations in value, which may occur within short periods of time. The market value of any token may rise or fall, and there is no guarantee of any specific price stability." -msgstr "Cryptocurrencies and ERC20 tokens have historically exhibited significant price volatility. They can experience rapid and substantial fluctuations in value, which may occur within short periods of time. The market value of any token may rise or fall, and there is no guarantee of any specific price stability." - -#: src/components/PageCreatePool/PoolType/index.tsx:44 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 +#: src/components/PageCreatePool/PoolType/index.tsx:42 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Cryptoswap" msgstr "Cryptoswap" -#: src/components/PageCreatePool/PoolType/index.tsx:50 +#: src/components/PageCreatePool/PoolType/index.tsx:48 msgid "Cryptoswap pools are currently unavailable on this chain" msgstr "Cryptoswap pools are currently unavailable on this chain" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:70 -msgid "Cryptoswap pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." -msgstr "Cryptoswap pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." - -#: src/components/PageRiskDisclaimer/index.tsx:103 -msgid "CryptoSwap V2 pools" -msgstr "CryptoSwap V2 pools" - -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:38 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:40 msgid "Currency reserves" msgstr "Currency reserves" @@ -857,7 +715,7 @@ msgstr "Currency reserves" #~ msgid "Current" #~ msgstr "Current" -#: src/components/PagePool/UserDetails/index.tsx:124 +#: src/components/PagePool/UserDetails/index.tsx:127 msgid "Current Boost:" msgstr "Current Boost:" @@ -869,36 +727,16 @@ msgstr "Current unlock date:" #~ msgid "Current unlocked date" #~ msgstr "Current unlocked date" -#: src/components/PageRiskDisclaimer/index.tsx:20 -msgid "Curve Pool Risk Disclosures for Liquidity Providers" -msgstr "Curve Pool Risk Disclosures for Liquidity Providers" - -#: src/components/PageRiskDisclaimer/index.tsx:63 -msgid "Curve pool smart contracts are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and liquidity providers always retain full control of their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." -msgstr "Curve pool smart contracts are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and liquidity providers always retain full control of their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." - -#: src/components/PageRiskDisclaimer/index.tsx:44 -msgid "Curve relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. It is essential for users to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "Curve relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. It is essential for users to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." - -#: src/components/PageRiskDisclaimer/index.tsx:48 -msgid "Curve smart contracts have undergone multiple audits by reputable firms including Trail of Bits, MixBytes, QuantStamp, and ChainSecurity to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "Curve smart contracts have undergone multiple audits by reputable firms including Trail of Bits, MixBytes, QuantStamp, and ChainSecurity to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." - -#: src/components/PageRiskDisclaimer/index.tsx:31 -msgid "Curve Whitepapers" -msgstr "Curve Whitepapers" - -#: src/components/AdvancedSettings.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:358 +#: src/components/AdvancedSettings.tsx:195 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:357 msgid "Custom" msgstr "Custom" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:39 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:33 msgid "Daily" msgstr "Daily" -#: src/components/PageDashboard/components/Summary.tsx:63 +#: src/components/PageDashboard/components/Summary.tsx:64 msgid "Daily Profits" msgstr "Daily Profits" @@ -906,26 +744,26 @@ msgstr "Daily Profits" #~ msgid "Daily USD volume" #~ msgstr "Daily USD volume" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:57 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:69 msgid "Daily USD volume:" msgstr "Daily USD volume:" -#: src/layout/default/Header.tsx:70 +#: src/layout/default/HeaderMobile.tsx:216 +#: src/layout/default/HeaderSecondary.tsx:58 msgid "Daily Volume" msgstr "Daily Volume" #: src/layout/default/HeaderMobile.tsx:163 #: src/layout/default/HeaderSecondary.tsx:82 -#~ msgid "DAO" -#~ msgstr "DAO" +msgid "DAO" +msgstr "DAO" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:24 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:20 msgid "DAO fee:" msgstr "DAO fee:" -#: src/components/PageDashboard/Page.tsx:34 -#: src/layout/default/Header.tsx:79 -#: src/layout/default/Header.tsx:86 +#: src/components/PageDashboard/Page.tsx:32 +#: src/layout/default/Header.tsx:34 msgid "Dashboard" msgstr "Dashboard" @@ -933,102 +771,59 @@ msgstr "Dashboard" #~ msgid "days" #~ msgstr "days" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:200 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:86 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:646 #: src/components/PageDeployGauge/Page.tsx:28 msgid "Deploy Gauge" msgstr "Deploy Gauge" -#: src/components/PageDeployGauge/ProcessSummary.tsx:36 +#: src/components/PageDeployGauge/ProcessSummary.tsx:35 msgid "Deploy gauge on sidechain" msgstr "Deploy gauge on sidechain" -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Mainnet Gauge" msgstr "Deploy Mainnet Gauge" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:146 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:603 msgid "Deploy Mirror Gauge" msgstr "Deploy Mirror Gauge" -#: src/components/PageDeployGauge/ProcessSummary.tsx:67 +#: src/components/PageDeployGauge/ProcessSummary.tsx:55 msgid "Deploy mirror gauge on Ethereum using the same sidechain LP token address" msgstr "Deploy mirror gauge on Ethereum using the same sidechain LP token address" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:140 -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:598 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Sidechain Gauge" msgstr "Deploy Sidechain Gauge" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:205 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:91 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:651 msgid "Deploying Gauge" msgstr "Deploying Gauge" -#: src/store/createDeployGaugeSlice.ts:215 -#: src/store/createDeployGaugeSlice.ts:252 -#: src/store/createDeployGaugeSlice.ts:289 -#: src/store/createDeployGaugeSlice.ts:326 -#: src/store/createDeployGaugeSlice.ts:362 -msgid "Deploying gauge for {shortenAddress}..." -msgstr "Deploying gauge for {shortenAddress}..." - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:158 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:615 msgid "Deploying Mirror Gauge" msgstr "Deploying Mirror Gauge" -#: src/store/createDeployGaugeSlice.ts:611 -#: src/store/createDeployGaugeSlice.ts:650 -#: src/store/createDeployGaugeSlice.ts:689 -#: src/store/createDeployGaugeSlice.ts:728 -#: src/store/createDeployGaugeSlice.ts:764 -msgid "Deploying mirror gauge for {shortenAddress}..." -msgstr "Deploying mirror gauge for {shortenAddress}..." - -#: src/components/PageDeployGauge/ProcessSummary.tsx:72 -msgid "Deploying mirror gauge..." -msgstr "Deploying mirror gauge..." - -#: src/store/createCreatePoolSlice.ts:836 -#: src/store/createCreatePoolSlice.ts:917 -#: src/store/createCreatePoolSlice.ts:1015 -#: src/store/createCreatePoolSlice.ts:1086 -#: src/store/createCreatePoolSlice.ts:1175 -#: src/store/createCreatePoolSlice.ts:1254 -msgid "Deploying pool {poolName}..." -msgstr "Deploying pool {poolName}..." - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:201 -msgid "Deploying Pool {poolName}..." -msgstr "Deploying Pool {poolName}..." - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:152 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:609 msgid "Deploying Sidechain Gauge" msgstr "Deploying Sidechain Gauge" -#: src/store/createDeployGaugeSlice.ts:408 -#: src/store/createDeployGaugeSlice.ts:446 -#: src/store/createDeployGaugeSlice.ts:484 -#: src/store/createDeployGaugeSlice.ts:522 -#: src/store/createDeployGaugeSlice.ts:560 -msgid "Deploying sidechain gauge for {shortenAddress}..." -msgstr "Deploying sidechain gauge for {shortenAddress}..." - -#: src/components/PageDeployGauge/ProcessSummary.tsx:40 -msgid "Deploying sidechain gauge..." -msgstr "Deploying sidechain gauge..." - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 -#: src/components/PagePool/Deposit/index.tsx:35 -#: src/components/PagePool/index.tsx:196 -#: src/components/PagePoolList/components/TableRowMobile.tsx:159 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 +#: src/components/PagePool/Deposit/index.tsx:34 +#: src/components/PagePool/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:165 msgid "Deposit" msgstr "Deposit" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 -#: src/components/PagePool/Deposit/index.tsx:37 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 +#: src/components/PagePool/Deposit/index.tsx:36 msgid "Deposit & Stake" msgstr "Deposit & Stake" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 msgid "Deposit & Stake Complete" msgstr "Deposit & Stake Complete" @@ -1036,11 +831,11 @@ msgstr "Deposit & Stake Complete" #~ msgid "Deposit & Stake Failed" #~ msgstr "Deposit & Stake Failed" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:109 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 msgid "Deposit and staked {tokenText}" msgstr "Deposit and staked {tokenText}" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 msgid "Deposit Complete" msgstr "Deposit Complete" @@ -1060,35 +855,31 @@ msgstr "Deposit Wrapped" #~ msgid "Deposited {tokenText}, received {receivedLpTokens} LP Tokens" #~ msgstr "Deposited {tokenText}, received {receivedLpTokens} LP Tokens" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:106 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:103 msgid "Deposited {tokenText}." msgstr "Deposited {tokenText}." #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Desc" -#~ msgstr "Desc" +msgid "Desc" +msgstr "Desc" -#: src/layout/default/Footer.tsx:113 +#: src/layout/default/Footer.tsx:137 msgid "Developer Docs" msgstr "Developer Docs" -#: src/components/PagePoolList/index.tsx:276 +#: src/components/PagePoolList/index.tsx:261 msgid "Didn't find what you're looking for?" msgstr "Didn't find what you're looking for?" -#: src/components/AdvancedSettings.tsx:145 +#: src/components/AdvancedSettings.tsx:136 msgid "Discard" msgstr "Discard" -#: src/components/PageRiskDisclaimer/index.tsx:142 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." - -#: src/layout/default/Footer.tsx:52 +#: src/layout/default/Footer.tsx:47 msgid "Dodo" msgstr "Dodo" -#: src/components/PageCreatePool/Parameters/index.tsx:272 +#: src/components/PageCreatePool/Parameters/index.tsx:261 msgid "Dollar prices are fetched from coingecko." msgstr "Dollar prices are fetched from coingecko." @@ -1097,16 +888,8 @@ msgstr "Dollar prices are fetched from coingecko." #~ msgstr "Dollar prices are fetched from coingecko. {0}" #: src/layout/default/Footer.tsx:132 -#~ msgid "Donate" -#~ msgstr "Donate" - -#: src/components/PageRiskDisclaimer/index.tsx:128 -msgid "Due to composability within DeFi, it is possible for assets in Curve pools to be receipt tokens for deposits in third party lending platforms. Composability of this sort can amplify yields for liquidity providers, but it also exposes users to additional risks associated with the underlying lending protocol. Users interacting with pools that involve lending assets should be mindful of this additional risk and conduct due diligence on the associated lending protocol." -msgstr "Due to composability within DeFi, it is possible for assets in Curve pools to be receipt tokens for deposits in third party lending platforms. Composability of this sort can amplify yields for liquidity providers, but it also exposes users to additional risks associated with the underlying lending protocol. Users interacting with pools that involve lending assets should be mindful of this additional risk and conduct due diligence on the associated lending protocol." - -#: src/components/PageRiskDisclaimer/index.tsx:119 -msgid "Due to the permissionless pool factory and the absence of strict onboarding criteria, not every token included in Curve pools undergoes a detailed independent risk assessment. Curve pools may contain unvetted tokens that have uncertain value or potential fraudulent characteristics. The presence of unvetted tokens introduces potential risks, including exchange rate volatility, smart contract vulnerabilities, liquidity risks, and other unforeseen circumstances that could result in the loss of funds or other adverse consequences." -msgstr "Due to the permissionless pool factory and the absence of strict onboarding criteria, not every token included in Curve pools undergoes a detailed independent risk assessment. Curve pools may contain unvetted tokens that have uncertain value or potential fraudulent characteristics. The presence of unvetted tokens introduces potential risks, including exchange rate volatility, smart contract vulnerabilities, liquidity risks, and other unforeseen circumstances that could result in the loss of funds or other adverse consequences." +msgid "Donate" +msgstr "Donate" #: src/domain/dialogs/dialog-waves-provider.tsx:21 #~ msgid "Email" @@ -1116,16 +899,15 @@ msgstr "Due to the permissionless pool factory and the absence of strict onboard #~ msgid "Enable to process transaction." #~ msgstr "Enable to process transaction." -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:212 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:140 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:134 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:101 msgid "ERC4626" msgstr "ERC4626" #: src/components/Page404/Page.tsx:11 #: src/pages/404.tsx:11 -#~ msgid "Error 404" -#~ msgstr "Error 404" +msgid "Error 404" +msgstr "Error 404" #: src/components/PagePool/components/DetailInfoEstTokens.tsx:18 msgid "Estimated Received:" @@ -1135,15 +917,15 @@ msgstr "Estimated Received:" #~ msgid "Estimated TX cost" #~ msgstr "Estimated TX cost" -#: src/components/DetailInfoEstGas.tsx:84 +#: src/components/DetailInfoEstGas.tsx:78 msgid "Estimated TX cost:" msgstr "Estimated TX cost:" #: src/layout/default/Footer.tsx:109 -#~ msgid "Events" -#~ msgstr "Events" +msgid "Events" +msgstr "Events" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "Exchange rate" msgstr "Exchange rate" @@ -1151,38 +933,30 @@ msgstr "Exchange rate" #~ msgid "Exchange rate is too low!" #~ msgstr "Exchange rate is too low!" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:231 -msgid "existing pools" -msgstr "existing pools" - -#: src/components/PagePool/index.tsx:251 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:261 +#: src/components/PagePool/index.tsx:227 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:221 msgid "Expand chart" msgstr "Expand chart" -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:46 -msgid "Expected CRV tAPR:" -msgstr "Expected CRV tAPR:" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:53 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:47 msgid "EYWA fee:" msgstr "EYWA fee:" #: src/hooks/usePoolAlert.tsx:91 -#~ msgid "EYWA Links:" -#~ msgstr "EYWA Links:" +msgid "EYWA Links:" +msgstr "EYWA Links:" #: src/components/PagePoolList/components/TableCellFactory.tsx:15 -#~ msgid "Factory" -#~ msgstr "Factory" +msgid "Factory" +msgstr "Factory" #: src/components/PagePool/index.tsx:210 -#~ msgid "FACTORY" -#~ msgstr "FACTORY" +msgid "FACTORY" +msgstr "FACTORY" #: src/components/PagePoolList/components/TableCellFactory.tsx:14 -#~ msgid "Factory pools are permissionless, deployed by anyone." -#~ msgstr "Factory pools are permissionless, deployed by anyone." +msgid "Factory pools are permissionless, deployed by anyone." +msgstr "Factory pools are permissionless, deployed by anyone." #: src/layout/default/Footer.tsx:134 #~ msgid "FAQ" @@ -1192,20 +966,20 @@ msgstr "EYWA fee:" #~ msgid "Fee" #~ msgstr "Fee" -#: src/components/PageCreatePool/Parameters/index.tsx:369 +#: src/components/PageCreatePool/Parameters/index.tsx:364 msgid "Fee Gamma ({0} - {1})" msgstr "Fee Gamma ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:274 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 msgid "Fee Gamma:" msgstr "Fee Gamma:" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:84 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:91 msgid "Fee:" msgstr "Fee:" -#: src/components/PageCreatePool/Parameters/index.tsx:218 +#: src/components/PageCreatePool/Parameters/index.tsx:207 msgid "Fees" msgstr "Fees" @@ -1213,7 +987,7 @@ msgstr "Fees" #~ msgid "Fiat Redeemable Stablecoin" #~ msgstr "Fiat Redeemable Stablecoin" -#: src/components/PageCreatePool/constants.ts:66 +#: src/components/PageCreatePool/constants.ts:62 msgid "Fiat Redeemable Stablecoins" msgstr "Fiat Redeemable Stablecoins" @@ -1221,32 +995,27 @@ msgstr "Fiat Redeemable Stablecoins" #~ msgid "Filter by" #~ msgstr "Filter by" -#: src/components/PageCreatePool/constants.ts:218 +#: src/components/PageCreatePool/constants.ts:186 msgid "For pools containing native {0} (represented as 0xEE…EE)" msgstr "For pools containing native {0} (represented as 0xEE…EE)" -#: src/components/PageCreatePool/constants.ts:206 +#: src/components/PageCreatePool/constants.ts:174 msgid "For pools that supports any major ERC20 return implementation (”return True / revert”, “return None / revert”, “return True / return False”), and any number of decimal places up to 18" msgstr "For pools that supports any major ERC20 return implementation (”return True / revert”, “return None / revert”, “return True / return False”), and any number of decimal places up to 18" -#: src/components/PageCreatePool/constants.ts:212 +#: src/components/PageCreatePool/constants.ts:180 msgid "For pools with rebase tokens like aTokens, or where there's a fee-on-transfer." msgstr "For pools with rebase tokens like aTokens, or where there's a fee-on-transfer." -#: src/components/PageCreatePool/constants.ts:119 +#: src/components/PageCreatePool/constants.ts:103 msgid "Forex" msgstr "Forex" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:90 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:66 msgid "Function (e.g exchangeRate())" msgstr "Function (e.g exchangeRate())" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:168 -msgid "Function ID:" -msgstr "Function ID:" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:90 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:163 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:76 msgid "Function:" msgstr "Function:" @@ -1254,15 +1023,16 @@ msgstr "Function:" #~ msgid "Future" #~ msgstr "Future" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:44 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:42 msgid "Gauge" msgstr "Gauge" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:196 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:95 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:642 msgid "Gauge Deployed Successfully" msgstr "Gauge Deployed Successfully" -#: src/components/PageDeployGauge/index.tsx:131 +#: src/components/PageDeployGauge/index.tsx:136 msgid "Gauge deployment is not supported on this network." msgstr "Gauge deployment is not supported on this network." @@ -1271,27 +1041,27 @@ msgstr "Gauge deployment is not supported on this network." #~ msgstr "Gauge Weight Vote" #: src/components/PageCreatePool/ConfirmModal/index.tsx:290 -#~ msgid "Go to deploy sidechain gauge" -#~ msgstr "Go to deploy sidechain gauge" +msgid "Go to deploy sidechain gauge" +msgstr "Go to deploy sidechain gauge" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:173 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:297 msgid "Go to pool" msgstr "Go to pool" #: src/layout/default/HeaderMobile.tsx:164 #: src/layout/default/HeaderSecondary.tsx:83 -#~ msgid "Governance" -#~ msgstr "Governance" +msgid "Governance" +msgstr "Governance" #: src/components/layout/default/footer.tsx:46 #~ msgid "Help" #~ msgstr "Help" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:123 +#: src/components/ComboBoxSelectToken/index.tsx:136 msgid "Hide tokens from very small pools" msgstr "Hide tokens from very small pools" -#: src/components/PagePoolList/index.tsx:224 +#: src/components/PagePoolList/index.tsx:220 msgid "Hide very small pools" msgstr "Hide very small pools" @@ -1311,7 +1081,7 @@ msgstr "Hide very small pools" #~ msgid "High price impact warning!<0/>Swap will have {0}% price impact." #~ msgstr "High price impact warning!<0/>Swap will have {0}% price impact." -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "High price impact:" msgstr "High price impact:" @@ -1319,27 +1089,10 @@ msgstr "High price impact:" #~ msgid "High price impact!" #~ msgstr "High price impact!" -#: src/components/PagePool/components/WarningModal.tsx:65 +#: src/components/PagePool/components/WarningModal.tsx:56 msgid "High slippage!<0/>{0} will have {1}% loss." msgstr "High slippage!<0/>{0} will have {1}% loss." -#: src/components/PageRiskDisclaimer/index.tsx:87 -msgid "If the token fails to regain its peg, liquidity providers will encounter losses proportional to the severity of the depeg. The potential permanent loss highlights the importance of thorough consideration and caution when participating in activities involving stablecoins and/or derivative assets." -msgstr "If the token fails to regain its peg, liquidity providers will encounter losses proportional to the severity of the depeg. The potential permanent loss highlights the importance of thorough consideration and caution when participating in activities involving stablecoins and/or derivative assets." - -#: src/components/PageRiskDisclaimer/index.tsx:51 -msgid "Immutability and Irreversibility of Transactions:" -msgstr "Immutability and Irreversibility of Transactions:" - -#: src/components/PageRiskDisclaimer/index.tsx:90 -msgid "Impermanent Loss:" -msgstr "Impermanent Loss:" - -#: src/components/PageDashboard/index.tsx:55 -#: src/components/PagePoolList/Page.tsx:57 -msgid "Incentives" -msgstr "Incentives" - #: src/components/PageCrvLocker/index.tsx:28 msgid "Increase Amount" msgstr "Increase Amount" @@ -1353,7 +1106,7 @@ msgstr "Increase Lock" msgid "Increase Lock Amount" msgstr "Increase Lock Amount" -#: src/components/PageCreatePool/Parameters/index.tsx:266 +#: src/components/PageCreatePool/Parameters/index.tsx:255 msgid "Initial Liquidity Concentration Price" msgstr "Initial Liquidity Concentration Price" @@ -1361,26 +1114,25 @@ msgstr "Initial Liquidity Concentration Price" #~ msgid "Initial Price" #~ msgstr "Initial Price" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:77 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:75 msgid "Initial Price {0}" msgstr "Initial Price {0}" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:63 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:71 msgid "Initial Price B:" msgstr "Initial Price B:" -#: src/components/PageCreatePool/Parameters/index.tsx:278 +#: src/components/PageCreatePool/Parameters/index.tsx:273 msgid "Initial price can't be 0. The price fetch didn't return a price. Please enter the token dollar price manually in the input." msgstr "Initial price can't be 0. The price fetch didn't return a price. Please enter the token dollar price manually in the input." -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:46 msgid "Initial Price{0}:" msgstr "Initial Price{0}:" #: src/components/PageIntegrations/Page.tsx:38 -#: src/layout/default/Footer.tsx:126 -#: src/layout/default/Header.tsx:80 -#: src/layout/default/Header.tsx:88 +#: src/layout/default/Footer.tsx:127 +#: src/layout/default/Header.tsx:35 msgid "Integrations" msgstr "Integrations" @@ -1388,21 +1140,16 @@ msgstr "Integrations" msgid "Invalid date" msgstr "Invalid date" -#: src/components/PagePoolList/index.tsx:278 +#: src/components/PagePoolList/index.tsx:263 msgid "Join the Telegram" msgstr "Join the Telegram" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:204 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:38 -msgid "Last change occurred between {0} and {1}, when A ramped from {initial_A} to {future_A}." -msgstr "Last change occurred between {0} and {1}, when A ramped from {initial_A} to {future_A}." - -#: src/components/PageDeployGauge/InfoBox.tsx:25 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:60 +#: src/components/PageDeployGauge/InfoBox.tsx:26 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 msgid "Learn more" msgstr "Learn more" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:139 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:136 msgid "Learn more about Boosting your CRV rewards" msgstr "Learn more about Boosting your CRV rewards" @@ -1418,60 +1165,47 @@ msgstr "Learn more about Boosting your CRV rewards" #~ msgid "Learn more about V2 pools" #~ msgstr "Learn more about V2 pools" -#: src/components/PageCreatePool/index.tsx:213 +#: src/components/PageCreatePool/index.tsx:152 msgid "Learn more: Creating Cryptoswap pools" msgstr "Learn more: Creating Cryptoswap pools" -#: src/components/PageCreatePool/index.tsx:209 +#: src/components/PageCreatePool/index.tsx:148 msgid "Learn more: Creating Stableswap pools" msgstr "Learn more: Creating Stableswap pools" -#: src/components/PageCreatePool/index.tsx:225 +#: src/components/PageCreatePool/index.tsx:164 msgid "Learn more: Read about Cryptoswap parameters" msgstr "Learn more: Read about Cryptoswap parameters" -#: src/components/PageCreatePool/index.tsx:221 +#: src/components/PageCreatePool/index.tsx:160 msgid "Learn more: Understanding Cryptoswap" msgstr "Learn more: Understanding Cryptoswap" -#: src/components/PageCreatePool/index.tsx:233 +#: src/components/PageCreatePool/index.tsx:172 msgid "Learn more: Understanding Stableswap" msgstr "Learn more: Understanding Stableswap" #: src/components/PageCreatePool/components/InfoBox.tsx:28 #: src/components/PageCreatePool/components/InfoBox.tsx:34 -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:79 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:218 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:65 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:140 msgid "Link to address" msgstr "Link to address" -#: src/components/PageCreatePool/constants.ts:90 -#: src/components/PageCreatePool/constants.ts:151 -msgid "Liquid Restaking Tokens" -msgstr "Liquid Restaking Tokens" - -#: src/components/PageCreatePool/constants.ts:135 +#: src/components/PageCreatePool/constants.ts:119 msgid "Liquid Staking Derivatives" msgstr "Liquid Staking Derivatives" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:61 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:62 msgid "Liquidity" msgstr "Liquidity" -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:20 -msgid "Liquidity providers in this pool also earn additional tokens!" -msgstr "Liquidity providers in this pool also earn additional tokens!" - -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:19 -msgid "Liquidity providers in this pool also earn points!" -msgstr "Liquidity providers in this pool also earn points!" - #: src/domain/transfer/pool-stats/pool-parameters.tsx:142 #~ msgid "Liquidity utilization" #~ msgstr "Liquidity utilization" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:63 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:72 msgid "Liquidity utilization:" msgstr "Liquidity utilization:" @@ -1479,8 +1213,9 @@ msgstr "Liquidity utilization:" #~ msgid "Llama Airforce" #~ msgstr "Llama Airforce" -#: src/components/FormConnectWallet.tsx:29 #: src/components/PageCrvLocker/components/FormActions.tsx:27 +#: src/components/PagePool/components/TransferActions.tsx:66 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:35 msgid "Loading" msgstr "Loading" @@ -1528,7 +1263,7 @@ msgstr "Lock Increased" #~ msgid "Locked until" #~ msgstr "Locked until" -#: src/components/PageDashboard/components/FormVecrv.tsx:191 +#: src/components/PageDashboard/components/FormVecrv.tsx:184 msgid "Locked until:" msgstr "Locked until:" @@ -1536,20 +1271,20 @@ msgstr "Locked until:" #~ msgid "Low Exchange Rate!" #~ msgstr "Low Exchange Rate!" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:178 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:139 msgid "LP Token ({0})" msgstr "LP Token ({0})" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:175 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:142 msgid "LP Token (USD)" msgstr "LP Token (USD)" -#: src/components/PageDeployGauge/DeploySidechain.tsx:118 +#: src/components/PageDeployGauge/DeploySidechain.tsx:109 msgid "LP Token Address" msgstr "LP Token Address" #: src/components/PagePool/components/FieldLpToken.tsx:42 -#: src/components/PagePool/UserDetails/index.tsx:99 +#: src/components/PagePool/UserDetails/index.tsx:102 msgid "LP Tokens" msgstr "LP Tokens" @@ -1557,14 +1292,6 @@ msgstr "LP Tokens" msgid "LP Tokens Avail." msgstr "LP Tokens Avail." -#: src/store/createDeployGaugeSlice.ts:227 -#: src/store/createDeployGaugeSlice.ts:264 -#: src/store/createDeployGaugeSlice.ts:301 -#: src/store/createDeployGaugeSlice.ts:338 -#: src/store/createDeployGaugeSlice.ts:374 -msgid "Mainnet gauge deployment successful." -msgstr "Mainnet gauge deployment successful." - #: src/components/input-comp/input-max-button.tsx:35 #~ msgid "MAX" #~ msgstr "MAX" @@ -1573,7 +1300,7 @@ msgstr "Mainnet gauge deployment successful." #~ msgid "Max amount" #~ msgstr "Max amount" -#: src/components/AdvancedSettings.tsx:166 +#: src/components/AdvancedSettings.tsx:157 msgid "Max Slippage" msgstr "Max Slippage" @@ -1581,11 +1308,11 @@ msgstr "Max Slippage" #~ msgid "MAX*" #~ msgstr "MAX*" -#: src/components/AdvancedSettings.tsx:168 +#: src/components/AdvancedSettings.tsx:159 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "Maximum difference between expected price of the trade, versus the price when the trade is executed." -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:107 msgid "Measures pool growth; this is not a dollar value" msgstr "Measures pool growth; this is not a dollar value" @@ -1593,16 +1320,12 @@ msgstr "Measures pool growth; this is not a dollar value" #~ msgid "MetaMask" #~ msgstr "MetaMask" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:99 -msgid "Metapool" -msgstr "Metapool" - -#: src/components/PageCreatePool/Parameters/index.tsx:250 +#: src/components/PageCreatePool/Parameters/index.tsx:239 msgid "Mid fee governs fees charged during low volatility." msgstr "Mid fee governs fees charged during low volatility." #: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:30 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:181 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:53 msgid "Mid Fee:" msgstr "Mid Fee:" @@ -1611,14 +1334,10 @@ msgstr "Mid Fee:" #~ msgstr "Mid fee: ({0} - {1}%)" #: src/components/PageCreatePool/Parameters/index.tsx:230 -#~ msgid "Mid Fee: ({0} - {1}%)" -#~ msgstr "Mid Fee: ({0} - {1}%)" +msgid "Mid Fee: ({0} - {1}%)" +msgstr "Mid Fee: ({0} - {1}%)" -#: src/components/PageCreatePool/Parameters/index.tsx:241 -msgid "Mid Fee: ({0}% - {1}%)" -msgstr "Mid Fee: ({0}% - {1}%)" - -#: src/components/PagePool/UserDetails/index.tsx:72 +#: src/components/PagePool/UserDetails/index.tsx:75 msgid "min. CRV tAPR %" msgstr "min. CRV tAPR %" @@ -1626,7 +1345,7 @@ msgstr "min. CRV tAPR %" #~ msgid "Min. Curve {0} LP Tokens:" #~ msgstr "Min. Curve {0} LP Tokens:" -#: src/components/AdvancedSettings.tsx:117 +#: src/components/AdvancedSettings.tsx:111 msgid "Min. slippage is {MIN_SLIPPAGE}%" msgstr "Min. slippage is {MIN_SLIPPAGE}%" @@ -1634,7 +1353,7 @@ msgstr "Min. slippage is {MIN_SLIPPAGE}%" #~ msgid "Min. slippage is 0.01%" #~ msgstr "Min. slippage is 0.01%" -#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:40 +#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:42 msgid "Minimum LP Tokens:" msgstr "Minimum LP Tokens:" @@ -1642,56 +1361,48 @@ msgstr "Minimum LP Tokens:" #~ msgid "Minter" #~ msgstr "Minter" -#: src/store/createDeployGaugeSlice.ts:623 -#: src/store/createDeployGaugeSlice.ts:662 -#: src/store/createDeployGaugeSlice.ts:701 -#: src/store/createDeployGaugeSlice.ts:740 -#: src/store/createDeployGaugeSlice.ts:776 -msgid "Mirror gauge deployment successful." -msgstr "Mirror gauge deployment successful." - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:125 -#: src/components/PageDeployGauge/ProcessSummary.tsx:79 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:584 +#: src/components/PageDeployGauge/ProcessSummary.tsx:61 msgid "Mirror gauge successfully deployed" msgstr "Mirror gauge successfully deployed" #: src/layout/default/HeaderMobile.tsx:146 -#~ msgid "Mode" -#~ msgstr "Mode" +msgid "Mode" +msgstr "Mode" #: src/layout/default/HeaderMobile.tsx:154 -#~ msgid "More" -#~ msgstr "More" +msgid "More" +msgstr "More" -#: src/components/PageCreatePool/Parameters/index.tsx:318 -#: src/components/PageCreatePool/Parameters/index.tsx:391 +#: src/components/PageCreatePool/Parameters/index.tsx:313 +#: src/components/PageCreatePool/Parameters/index.tsx:386 msgid "Moving Average Time ({0} - {1}) seconds" msgstr "Moving Average Time ({0} - {1}) seconds" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:123 #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:57 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:286 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:124 msgid "Moving Average Time:" msgstr "Moving Average Time:" -#: src/components/PagePoolList/index.tsx:106 +#: src/components/PagePoolList/index.tsx:111 msgid "My Pools" msgstr "My Pools" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:37 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:59 msgid "Name:" msgstr "Name:" -#: src/components/PageDeployGauge/DeploySidechain.tsx:93 +#: src/components/PageDeployGauge/DeploySidechain.tsx:84 msgid "Network:" msgstr "Network:" -#: src/layout/default/Footer.tsx:146 +#: src/layout/default/Footer.tsx:142 msgid "News" msgstr "News" -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Next" msgstr "Next" @@ -1705,7 +1416,7 @@ msgstr "Next" #~ msgid "No A value set" #~ msgstr "No A value set" -#: src/components/PageDashboard/index.tsx:161 +#: src/components/PageDashboard/index.tsx:166 msgid "No active pool found for" msgstr "No active pool found for" @@ -1713,23 +1424,19 @@ msgstr "No active pool found for" #~ msgid "No active pool found." #~ msgstr "No active pool found." -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:73 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 msgid "No address set" msgstr "No address set" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:78 msgid "No asset type set" msgstr "No asset type set" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:212 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:213 msgid "No claimable rewards" msgstr "No claimable rewards" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:84 -msgid "No controller data found." -msgstr "No controller data found." - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:92 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:78 msgid "No function set" msgstr "No function set" @@ -1740,19 +1447,19 @@ msgstr "No function set" #~ msgid "No initial price set" #~ msgstr "No initial price set" -#: src/components/PageIntegrations/index.tsx:130 +#: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "No integration apps found with for {0} {1}{2}" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:39 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:61 msgid "No name set" msgstr "No name set" -#: src/components/PagePoolList/index.tsx:283 +#: src/components/PagePoolList/index.tsx:268 msgid "No pool found for \"{0}\". Feel free to search other tabs, or" msgstr "No pool found for \"{0}\". Feel free to search other tabs, or" -#: src/components/PagePoolList/index.tsx:290 +#: src/components/PagePoolList/index.tsx:275 msgid "No pool found in this category" msgstr "No pool found in this category" @@ -1771,39 +1478,32 @@ msgstr "No preset set" #~ msgid "No swap fee set" #~ msgstr "No swap fee set" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:47 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:69 msgid "No symbol set" msgstr "No symbol set" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:148 -msgid "No token found for \"{filterValue}\"" -msgstr "No token found for \"{filterValue}\"" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:278 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:235 msgid "No token found for address {0}" msgstr "No token found for address {0}" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:76 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:69 msgid "No tokens selected" msgstr "No tokens selected" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:77 -msgid "No trades data found." -msgstr "No trades data found." - -#: src/components/PageDashboard/components/TableRow.tsx:89 +#: src/components/PageDashboard/components/TableRow.tsx:92 msgid "None" msgstr "None" #: src/components/PagePool/Swap/index.tsx:396 -#~ msgid "Not enough balance for {0}" -#~ msgstr "Not enough balance for {0}" +msgid "Not enough balance for {0}" +msgstr "Not enough balance for {0}" -#: src/store/createPoolDepositSlice.ts:279 -msgid "Not enough balance for {amountsError}." -msgstr "Not enough balance for {amountsError}." +#: src/domain/transfer/deposit/form-deposit/index.tsx:95 +#: src/domain/transfer/deposit/form-deposit-stake/index.tsx:96 +#~ msgid "Not enough balance for {amountsError}." +#~ msgstr "Not enough balance for {amountsError}." -#: src/components/PagePool/Deposit/components/FormStake.tsx:206 +#: src/components/PagePool/Deposit/components/FormStake.tsx:198 msgid "Not enough LP Tokens balances." msgstr "Not enough LP Tokens balances." @@ -1867,15 +1567,15 @@ msgstr "Nudging" msgid "Nudging and Claiming" msgstr "Nudging and Claiming" -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "of pool" msgstr "of pool" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 msgid "Off Peg Multiplier:" msgstr "Off Peg Multiplier:" -#: src/components/PageCreatePool/Parameters/index.tsx:310 +#: src/components/PageCreatePool/Parameters/index.tsx:305 msgid "Offpeg Fee Multiplier ({0} - {1})" msgstr "Offpeg Fee Multiplier ({0} - {1})" @@ -1887,47 +1587,34 @@ msgstr "Offpeg Fee Multiplier:" #~ msgid "On March 15th, all protocol owned dex liquidity will be removed. You must remove your own dex liquidity before March 15th. After the new STG token is airdropped, the old STG will be worthless. If you continue to provide LP at this point, the old STG token will be sold into your LP removing the other asset you are providing and you will lose funds!!. It is recommended you withdraw and unwrap the LP and (if you wish) re-add the LP with the new STG token after you receive it." #~ msgstr "On March 15th, all protocol owned dex liquidity will be removed. You must remove your own dex liquidity before March 15th. After the new STG token is airdropped, the old STG will be worthless. If you continue to provide LP at this point, the old STG token will be sold into your LP removing the other asset you are providing and you will lose funds!!. It is recommended you withdraw and unwrap the LP and (if you wish) re-add the LP with the new STG token after you receive it." -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:351 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:350 msgid "One coin" msgstr "One coin" -#: src/components/PageDeployGauge/InfoBox.tsx:17 +#: src/components/PageDeployGauge/InfoBox.tsx:18 msgid "Only admin/manager can set reward token, set reward token distributor address." msgstr "Only admin/manager can set reward token, set reward token distributor address." -#: src/components/PageCreatePool/constants.ts:222 +#: src/components/PageCreatePool/constants.ts:190 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:44 msgid "Optimised" msgstr "Optimised" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:210 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:130 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:85 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:132 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:91 msgid "Oracle" msgstr "Oracle" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:83 -msgid "Oracle address needs to be 42 characters long." -msgstr "Oracle address needs to be 42 characters long." - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:80 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 msgid "Oracle address needs to start with '0x'." msgstr "Oracle address needs to start with '0x'." -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 -msgid "Oracle Address:" -msgstr "Oracle Address:" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:93 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:69 msgid "Oracle function name needs to end with '()'." msgstr "Oracle function name needs to end with '()'." -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:95 -msgid "Oracle must have a precision of 18 decimals." -msgstr "Oracle must have a precision of 18 decimals." - -#: src/components/PagePool/index.tsx:220 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:14 +#: src/components/PagePool/index.tsx:202 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:12 msgid "OTHER" msgstr "OTHER" @@ -1935,22 +1622,18 @@ msgstr "OTHER" #~ msgid "Others" #~ msgstr "Others" -#: src/components/PageCreatePool/Parameters/index.tsx:263 +#: src/components/PageCreatePool/Parameters/index.tsx:252 msgid "Out fee governs fees charged during high volatility." msgstr "Out fee governs fees charged during high volatility." -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:187 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:59 msgid "Out Fee:" msgstr "Out Fee:" #: src/components/PageCreatePool/Parameters/index.tsx:242 -#~ msgid "Out fee: ({midFee} - {0}%)" -#~ msgstr "Out fee: ({midFee} - {0}%)" - -#: src/components/PageCreatePool/Parameters/index.tsx:253 -msgid "Out fee: ({midFee}% - {0}%)" -msgstr "Out fee: ({midFee}% - {0}%)" +msgid "Out fee: ({midFee} - {0}%)" +msgstr "Out fee: ({midFee} - {0}%)" #: src/domain/page404.tsx:44 #~ msgid "Page not found" @@ -1963,11 +1646,11 @@ msgstr "Out fee: ({midFee}% - {0}%)" #~ msgid "Parameters" #~ msgstr "Parameters" -#: src/components/PageCreatePool/components/Navigation.tsx:54 +#: src/components/PageCreatePool/components/Navigation.tsx:106 msgid "PARAMETERS" msgstr "PARAMETERS" -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:26 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:47 msgid "Parameters:" msgstr "Parameters:" @@ -1975,15 +1658,11 @@ msgstr "Parameters:" #~ msgid "Percent share in pool" #~ msgstr "Percent share in pool" -#: src/components/PageRiskDisclaimer/index.tsx:81 -msgid "Permanent Loss of a Peg:" -msgstr "Permanent Loss of a Peg:" - #: src/domain/quick-swap/index.tsx:330 #~ msgid "Please approve {0} {1} for exchange" #~ msgstr "Please approve {0} {1} for exchange" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:64 +#: src/components/PageDashboard/components/FormClaimFees.tsx:57 msgid "Please approve claim veCRV rewards." msgstr "Please approve claim veCRV rewards." @@ -1991,23 +1670,25 @@ msgstr "Please approve claim veCRV rewards." #~ msgid "Please approve spending {fromToken}" #~ msgstr "Please approve spending {fromToken}" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:90 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:93 -#: src/components/PagePool/Swap/index.tsx:183 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:87 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:88 +#: src/components/PagePool/Swap/index.tsx:179 +#: src/components/PageRouterSwap/index.tsx:206 msgid "Please approve spending your {0}." msgstr "Please approve spending your {0}." -#: src/components/PageRouterSwap/index.tsx:211 -msgid "Please approve spending your {fromToken}." -msgstr "Please approve spending your {fromToken}." +#: src/domain/quick-swap/index.tsx:278 +#: src/domain/transfer/swap/index.tsx:278 +#~ msgid "Please approve spending your {fromToken}." +#~ msgstr "Please approve spending your {fromToken}." #: src/components/PageCrvLocker/components/FormLockCreate.tsx:101 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:52 msgid "Please approve spending your CRV." msgstr "Please approve spending your CRV." -#: src/components/PagePool/Deposit/components/FormStake.tsx:59 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:95 +#: src/components/PagePool/Deposit/components/FormStake.tsx:57 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:94 msgid "Please approve spending your LP Tokens." msgstr "Please approve spending your LP Tokens." @@ -2027,7 +1708,7 @@ msgstr "Please confirm claim {balance} compensation." msgid "Please confirm claim of {tokensMessage}" msgstr "Please confirm claim of {tokensMessage}" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:99 msgid "Please confirm deposit and staking of {tokenText} LP Tokens at max {maxSlippage}% slippage." msgstr "Please confirm deposit and staking of {tokenText} LP Tokens at max {maxSlippage}% slippage." @@ -2035,7 +1716,7 @@ msgstr "Please confirm deposit and staking of {tokenText} LP Tokens at max {maxS #~ msgid "Please confirm deposit and staking of {tokenText} LP Tokens." #~ msgstr "Please confirm deposit and staking of {tokenText} LP Tokens." -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:101 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:98 msgid "Please confirm deposit of {tokenText} at max {maxSlippage}% slippage." msgstr "Please confirm deposit of {tokenText} at max {maxSlippage}% slippage." @@ -2071,7 +1752,7 @@ msgstr "Please confirm nudge and claim of {tokensMessage}" msgid "Please confirm nudge rewards" msgstr "Please confirm nudge rewards" -#: src/components/PagePool/Deposit/components/FormStake.tsx:69 +#: src/components/PagePool/Deposit/components/FormStake.tsx:67 msgid "Please confirm staking of {0} LP Tokens" msgstr "Please confirm staking of {0} LP Tokens" @@ -2087,7 +1768,8 @@ msgstr "Please confirm staking of {0} LP Tokens" #~ msgid "Please confirm swap {fromAmount} {fromToken} for {toToken} at max {maxSlippage}% slippage." #~ msgstr "Please confirm swap {fromAmount} {fromToken} for {toToken} at max {maxSlippage}% slippage." -#: src/components/PagePool/Swap/index.tsx:130 +#: src/components/PagePool/Swap/index.tsx:126 +#: src/components/PageRouterSwap/index.tsx:155 msgid "Please confirm swap {fromAmount} {fromToken} for {toToken} at max slippage {maxSlippage}%." msgstr "Please confirm swap {fromAmount} {fromToken} for {toToken} at max slippage {maxSlippage}%." @@ -2107,21 +1789,17 @@ msgstr "Please confirm swap {fromAmount} {fromToken} for {toToken} at max slippa #~ msgid "Please confirm swapping {fromAmount} {fromToken} at max {maxSlippage}% slippage." #~ msgstr "Please confirm swapping {fromAmount} {fromToken} at max {maxSlippage}% slippage." -#: src/store/createCreatePoolSlice.ts:793 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:80 msgid "Please confirm to create pool {poolName}." msgstr "Please confirm to create pool {poolName}." #: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:116 -#~ msgid "Please confirm to deploy gauge for {0}." -#~ msgstr "Please confirm to deploy gauge for {0}." - -#: src/store/createDeployGaugeSlice.ts:189 -msgid "Please confirm to deploy gauge for {shortenAddress}." -msgstr "Please confirm to deploy gauge for {shortenAddress}." +msgid "Please confirm to deploy gauge for {0}." +msgstr "Please confirm to deploy gauge for {0}." #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:46 -#~ msgid "Please confirm to deploy gauge." -#~ msgstr "Please confirm to deploy gauge." +msgid "Please confirm to deploy gauge." +msgstr "Please confirm to deploy gauge." #: src/components/PagePool/Withdraw/components/FormUnstake.tsx:51 msgid "Please confirm unstaking of {0} LP Tokens" @@ -2135,7 +1813,7 @@ msgstr "Please confirm unstaking of {0} LP Tokens" msgid "Please confirm withdraw of {lockedAmount} CRV." msgstr "Please confirm withdraw of {lockedAmount} CRV." -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:106 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:105 msgid "Please confirm withdrawal of {0} LP Tokens at max {maxSlippage}% slippage." msgstr "Please confirm withdrawal of {0} LP Tokens at max {maxSlippage}% slippage." @@ -2147,11 +1825,11 @@ msgstr "Please confirm withdrawal of {0} LP Tokens at max {maxSlippage}% slippag #~ msgid "Please confirm withdrawal of {lpTokenPayload} LP Tokens." #~ msgstr "Please confirm withdrawal of {lpTokenPayload} LP Tokens." -#: src/components/PageCreatePool/TokensInPool/index.tsx:751 +#: src/components/PageCreatePool/TokensInPool/index.tsx:583 msgid "Please connect a wallet to select tokens" msgstr "Please connect a wallet to select tokens" -#: src/components/PageDashboard/index.tsx:148 +#: src/components/PageDashboard/index.tsx:153 msgid "Please connect wallet or enter a wallet address to view active pools." msgstr "Please connect wallet or enter a wallet address to view active pools." @@ -2159,7 +1837,7 @@ msgstr "Please connect wallet or enter a wallet address to view active pools." #~ msgid "Please connect wallet to view active pools." #~ msgstr "Please connect wallet to view active pools." -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:28 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:26 msgid "Please select tokens to be able to set initial price" msgstr "Please select tokens to be able to set initial price" @@ -2171,54 +1849,41 @@ msgstr "Please select tokens to be able to set initial price" #~ msgid "Please switch your wallet's network to" #~ msgstr "Please switch your wallet's network to" -#: src/components/PagePoolList/Page.tsx:60 -msgid "Points" -msgstr "Points" - -#: src/components/PageDashboard/index.tsx:52 -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 -#: src/components/PagePoolList/Page.tsx:54 +#: src/components/PageDashboard/index.tsx:54 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 +#: src/components/PagePoolList/Page.tsx:56 msgid "Pool" msgstr "Pool" -#: src/store/createCreatePoolSlice.ts:853 -#: src/store/createCreatePoolSlice.ts:934 -#: src/store/createCreatePoolSlice.ts:1033 -#: src/store/createCreatePoolSlice.ts:1103 -#: src/store/createCreatePoolSlice.ts:1192 -#: src/store/createCreatePoolSlice.ts:1272 -msgid "Pool {poolName} deployment successful." -msgstr "Pool {poolName} deployment successful." - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:163 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:265 msgid "Pool {poolName} was successfully created!" msgstr "Pool {poolName} was successfully created!" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 msgid "Pool / Token" msgstr "Pool / Token" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:216 msgid "Pool Activity" msgstr "Pool Activity" -#: src/components/PageDeployGauge/DeployMainnet.tsx:70 +#: src/components/PageDeployGauge/DeployMainnet.tsx:61 msgid "Pool Address" msgstr "Pool Address" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:16 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:15 msgid "Pool APY" msgstr "Pool APY" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:27 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:26 msgid "Pool APY + Interest APY" msgstr "Pool APY + Interest APY" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:19 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:18 msgid "Pool APY + Lending APY" msgstr "Pool APY + Lending APY" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:22 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:21 msgid "Pool APY + Staking APY" msgstr "Pool APY + Staking APY" @@ -2226,22 +1891,23 @@ msgstr "Pool APY + Staking APY" #~ msgid "Pool contains rebasing tokens" #~ msgstr "Pool contains rebasing tokens" -#: src/components/PageCreatePool/index.tsx:180 -#: src/layout/default/Header.tsx:78 -#: src/layout/default/Header.tsx:87 +#: src/components/PageCreatePool/index.tsx:119 +#: src/layout/default/Header.tsx:33 msgid "Pool Creation" msgstr "Pool Creation" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:51 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:70 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:392 msgid "Pool Creation Complete" msgstr "Pool Creation Complete" -#: src/components/PageCreatePool/index.tsx:305 +#: src/components/PageCreatePool/index.tsx:256 msgid "Pool creation is not yet available on this network." msgstr "Pool creation is not yet available on this network." -#: src/components/PagePool/index.tsx:123 +#: src/components/PagePool/index.tsx:104 +#: src/components/PagePool/index.tsx:109 +#: src/components/PagePool/index.tsx:114 +#: src/components/PagePool/index.tsx:117 msgid "Pool Details" msgstr "Pool Details" @@ -2253,12 +1919,11 @@ msgstr "Pool Implementation" msgid "Pool Implementation:" msgstr "Pool Implementation:" -#: src/components/PageCreatePool/components/Navigation.tsx:67 +#: src/components/PageCreatePool/components/Navigation.tsx:157 msgid "POOL INFO" msgstr "POOL INFO" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 msgid "Pool Info:" msgstr "Pool Info:" @@ -2267,25 +1932,18 @@ msgstr "Pool Info:" #~ msgstr "Pool name (e.g. CRV/ETH)" #: src/components/PageCreatePool/PoolInfo/index.tsx:30 -#~ msgid "Pool Name (e.g. CRV/ETH)" -#~ msgstr "Pool Name (e.g. CRV/ETH)" +msgid "Pool Name (e.g. CRV/ETH)" +msgstr "Pool Name (e.g. CRV/ETH)" -#: src/components/PageCreatePool/PoolInfo/index.tsx:30 -msgid "Pool Name (e.g. stETH/ETH)" -msgstr "Pool Name (e.g. stETH/ETH)" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:152 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:50 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:159 msgid "Pool Parameters" msgstr "Pool Parameters" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:58 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:45 msgid "Pool Parameters Presets" msgstr "Pool Parameters Presets" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 -msgid "Pool Parameters:" -msgstr "Pool Parameters:" - #: src/domain/create-pool/components/navigation.tsx:59 #~ msgid "POOL PRESETS" #~ msgstr "POOL PRESETS" @@ -2299,7 +1957,7 @@ msgstr "Pool Parameters:" #~ msgid "POOL SETUP" #~ msgstr "POOL SETUP" -#: src/components/PageCreatePool/Summary/index.tsx:27 +#: src/components/PageCreatePool/Summary/index.tsx:40 msgid "Pool Summary" msgstr "Pool Summary" @@ -2308,18 +1966,14 @@ msgstr "Pool Summary" #~ msgstr "Pool symbol (e.g. CRVETH)" #: src/components/PageCreatePool/PoolInfo/index.tsx:35 -#~ msgid "Pool Symbol (e.g. CRVETH)" -#~ msgstr "Pool Symbol (e.g. CRVETH)" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:35 -msgid "Pool Symbol (e.g. stETHETH)" -msgstr "Pool Symbol (e.g. stETHETH)" +msgid "Pool Symbol (e.g. CRVETH)" +msgstr "Pool Symbol (e.g. CRVETH)" -#: src/components/PageCreatePool/PoolType/index.tsx:26 +#: src/components/PageCreatePool/PoolType/index.tsx:24 msgid "Pool Type" msgstr "Pool Type" -#: src/components/PageCreatePool/components/Navigation.tsx:28 +#: src/components/PageCreatePool/components/Navigation.tsx:40 msgid "POOL TYPE" msgstr "POOL TYPE" @@ -2329,106 +1983,72 @@ msgstr "POOL TYPE" #~ msgstr "Pool type needs to be set before adjusting mid fee" #: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:29 -#: src/components/PageDeployGauge/DeployMainnet.tsx:60 -#: src/components/PageDeployGauge/DeploySidechain.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:96 +#: src/components/PageDeployGauge/DeployMainnet.tsx:51 +#: src/components/PageDeployGauge/DeploySidechain.tsx:98 msgid "Pool Type:" msgstr "Pool Type:" -#: src/components/PagePoolList/Page.tsx:114 -#: src/layout/default/Header.tsx:77 -#: src/layout/default/Header.tsx:85 +#: src/components/PagePoolList/Page.tsx:122 +#: src/layout/default/Header.tsx:32 msgid "Pools" msgstr "Pools" #: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#~ msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" -#~ msgstr "Pools with basepools ({0}) allow a maximum of 2 tokens" +msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" +msgstr "Pools with basepools ({0}) allow a maximum of 2 tokens" #: src/domain/create-pool/tokens-in-pool/index.tsx:757 #~ msgid "Pools with basepools (3Crv, FRAXBP, sbtc2Crv) allow a maximum of 2 tokens" #~ msgstr "Pools with basepools (3Crv, FRAXBP, sbtc2Crv) allow a maximum of 2 tokens" -#: src/components/PageCreatePool/TokensInPool/index.tsx:770 -msgid "Pools with basepools allow a maximum of 2 tokens" -msgstr "Pools with basepools allow a maximum of 2 tokens" - -#: src/components/PageRiskDisclaimer/index.tsx:126 -msgid "Pools with Lending Assets:" -msgstr "Pools with Lending Assets:" - #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:22 #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:27 msgid "Preset:" msgstr "Preset:" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Previous" msgstr "Previous" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:82 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:80 msgid "Price A ({0})" msgstr "Price A ({0})" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:87 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:85 msgid "Price B ({0})" msgstr "Price B ({0})" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:24 msgid "Price change in the market that happens when a trader buys or sells an asset." msgstr "Price change in the market that happens when a trader buys or sells an asset." -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "Price impact:" msgstr "Price impact:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:298 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:118 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:135 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:125 msgid "Price Oracle:" msgstr "Price Oracle:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:317 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:136 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:143 msgid "Price Scale:" msgstr "Price Scale:" -#: src/components/PageRiskDisclaimer/index.tsx:108 -msgid "Price Volatility:" -msgstr "Price Volatility:" - -#: src/components/PageRiskDisclaimer/index.tsx:23 -msgid "Providing liquidity on Curve doesn't come without risks. Before making a deposit, it is best to research and understand the risks involved." -msgstr "Providing liquidity on Curve doesn't come without risks. Before making a deposit, it is best to research and understand the risks involved." - -#: src/components/PageRiskDisclaimer/index.tsx:92 -msgid "Providing liquidity to Curve pools may expose users to the risk of impermanent loss. Fluctuations in asset prices after supplying to a pool can result in losses when users remove liquidity. Before engaging in liquidity provision activities, users are advised to carefully evaluate the potential for impermanent loss and consider their own risk tolerance." -msgstr "Providing liquidity to Curve pools may expose users to the risk of impermanent loss. Fluctuations in asset prices after supplying to a pool can result in losses when users remove liquidity. Before engaging in liquidity provision activities, users are advised to carefully evaluate the potential for impermanent loss and consider their own risk tolerance." - #: src/components/layout/default/header.tsx:26 #~ msgid "Quick Swap" #~ msgstr "Quick Swap" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:246 -msgid "Ramp {0} A ends on:" -msgstr "Ramp {0} A ends on:" - #: src/domain/transfer/pool-stats/pool-parameters.tsx:134 #~ msgid "Ramp up A ends on" #~ msgstr "Ramp up A ends on" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:202 -#~ msgid "Ramp up A ends on:" -#~ msgstr "Ramp up A ends on:" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:224 -msgid "Ramping {0} A:" -msgstr "Ramping {0} A:" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:55 -msgid "Ramping A:" -msgstr "Ramping A:" +msgid "Ramp up A ends on:" +msgstr "Ramp up A ends on:" #: src/domain/transfer/pool-stats/pool-parameters.tsx:124 #~ msgid "Ramping up A" @@ -2436,40 +2056,27 @@ msgstr "Ramping A:" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:72 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:186 -#~ msgid "Ramping up A:" -#~ msgstr "Ramping up A:" +msgid "Ramping up A:" +msgstr "Ramping up A:" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:211 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:135 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:86 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:133 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:96 msgid "Rebasing" msgstr "Rebasing" -#: src/components/PageCreatePool/TokensInPool/index.tsx:778 +#: src/components/PageCreatePool/TokensInPool/index.tsx:622 msgid "Rebasing tokens are not supported in {CRYPTOSWAP} pools" msgstr "Rebasing tokens are not supported in {CRYPTOSWAP} pools" -#: src/components/PageCreatePool/TokensInPool/index.tsx:771 +#: src/components/PageCreatePool/TokensInPool/index.tsx:613 msgid "Rebasing tokens are not supported in this version of Stableswap" msgstr "Rebasing tokens are not supported in this version of Stableswap" -#: src/components/PageDashboard/components/Summary.tsx:130 +#: src/components/PageDashboard/components/Summary.tsx:136 msgid "Recently viewed addresses" msgstr "Recently viewed addresses" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:116 -msgid "Registry:" -msgstr "Registry:" - -#: src/components/PageRiskDisclaimer/index.tsx:134 -msgid "Regulatory Risk" -msgstr "Regulatory Risk" - -#: src/components/PageRiskDisclaimer/index.tsx:136 -msgid "Regulatory Uncertainty:" -msgstr "Regulatory Uncertainty:" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:69 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:68 msgid "Remove" msgstr "Remove" @@ -2477,21 +2084,21 @@ msgstr "Remove" #~ msgid "Remove Liquidity Approved" #~ msgstr "Remove Liquidity Approved" -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:85 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:102 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:57 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 msgid "Remove token" msgstr "Remove token" -#: src/components/PageCreatePool/Parameters/index.tsx:294 +#: src/components/PageCreatePool/Parameters/index.tsx:289 msgid "Reset advanced" msgstr "Reset advanced" -#: src/components/PageCreatePool/Parameters/index.tsx:220 +#: src/components/PageCreatePool/Parameters/index.tsx:209 msgid "Reset Fees" msgstr "Reset Fees" -#: src/layout/default/Footer.tsx:105 -#: src/layout/default/Header.tsx:195 +#: src/layout/default/Footer.tsx:147 +#: src/layout/default/HeaderMobile.tsx:189 msgid "Resources" msgstr "Resources" @@ -2507,45 +2114,29 @@ msgstr "Resources" #~ msgid "Retry Claim Rewards" #~ msgstr "Retry Claim Rewards" -#: src/components/PagePoolList/Page.tsx:55 -msgid "Rewards Base" -msgstr "Rewards Base" - #: src/components/PagePoolList/Page.tsx:57 -#~ msgid "Rewards Base vAPY" -#~ msgstr "Rewards Base vAPY" - -#: src/components/PagePoolList/Page.tsx:56 -msgid "Rewards CRV" -msgstr "Rewards CRV" +msgid "Rewards Base vAPY" +msgstr "Rewards Base vAPY" #: src/components/PagePoolList/Page.tsx:66 -#~ msgid "Rewards CRV tAPR" -#~ msgstr "Rewards CRV tAPR" - -#: src/components/PagePoolList/Page.tsx:57 -msgid "Rewards Incentives" -msgstr "Rewards Incentives" +msgid "Rewards CRV tAPR" +msgstr "Rewards CRV tAPR" #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "Rewards Incentives tAPR" -#~ msgstr "Rewards Incentives tAPR" +msgid "Rewards Incentives tAPR" +msgstr "Rewards Incentives tAPR" -#: src/components/PageDashboard/components/TableHead.tsx:72 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:26 +#: src/components/PageDashboard/index.tsx:59 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:94 +#: src/components/PagePoolList/Page.tsx:61 msgid "Rewards tAPR" msgstr "Rewards tAPR" -#: src/components/PagePoolList/components/TableRowMobile.tsx:134 -msgid "REWARDS tAPR" -msgstr "REWARDS tAPR" - -#: src/components/PageDashboard/index.tsx:54 +#: src/components/PageDashboard/index.tsx:64 msgid "Rewards tAPR (CRV)" msgstr "Rewards tAPR (CRV)" -#: src/components/PageDashboard/index.tsx:55 +#: src/components/PageDashboard/index.tsx:66 msgid "Rewards tAPR (Incentives)" msgstr "Rewards tAPR (Incentives)" @@ -2553,33 +2144,29 @@ msgstr "Rewards tAPR (Incentives)" #~ msgid "Risk" #~ msgstr "Risk" -#: src/components/PageRiskDisclaimer/Page.tsx:28 -msgid "Risk Disclaimer" -msgstr "Risk Disclaimer" - -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:89 msgid "Risks of using {0}" msgstr "Risks of using {0}" -#: src/components/AdvancedSettings.tsx:158 +#: src/components/AdvancedSettings.tsx:149 msgid "Save" msgstr "Save" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:191 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:151 msgid "Search by name or paste address" msgstr "Search by name or paste address" -#: src/components/PagePoolList/index.tsx:189 +#: src/components/PagePoolList/index.tsx:185 msgid "Search by pool name, pool address, token name or token address" msgstr "Search by pool name, pool address, token name or token address" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:83 -#: src/components/ComboBoxSelectToken/ComboBox.tsx:84 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:203 +#: src/components/ComboBoxSelectToken/index.tsx:117 +#: src/components/ComboBoxSelectToken/index.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:163 msgid "Search by token name or address" msgstr "Search by token name or address" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:261 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:219 msgid "Search generated no results" msgstr "Search generated no results" @@ -2591,12 +2178,12 @@ msgstr "Search generated no results" #~ msgid "Select" #~ msgstr "Select" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:176 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:136 msgid "Select a token" msgstr "Select a token" -#: src/components/PagePool/Swap/index.tsx:371 -#: src/components/PagePool/Swap/index.tsx:454 +#: src/components/PagePool/Swap/index.tsx:366 +#: src/components/PagePool/Swap/index.tsx:449 msgid "Select a Token" msgstr "Select a Token" @@ -2604,7 +2191,7 @@ msgstr "Select a Token" #~ msgid "Select date" #~ msgstr "Select date" -#: src/components/PageDeployGauge/DeploySidechain.tsx:96 +#: src/components/PageDeployGauge/DeploySidechain.tsx:87 msgid "Select Network" msgstr "Select Network" @@ -2612,15 +2199,11 @@ msgstr "Select Network" #~ msgid "Select pool asset type tag" #~ msgstr "Select pool asset type tag" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:68 -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:74 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:55 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:61 msgid "Select preset" msgstr "Select preset" -#: src/components/PageIntegrations/components/SelectIntegrationTags.tsx:25 -msgid "Select tag" -msgstr "Select tag" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:91 msgid "Select unlock date" msgstr "Select unlock date" @@ -2629,25 +2212,17 @@ msgstr "Select unlock date" msgid "Set pool asset type tag:" msgstr "Set pool asset type tag:" -#: src/components/PageDeployGauge/DeployMainnet.tsx:62 -#: src/components/PageDeployGauge/DeploySidechain.tsx:109 +#: src/components/PageDeployGauge/DeployMainnet.tsx:53 +#: src/components/PageDeployGauge/DeploySidechain.tsx:100 msgid "Set Pool Type" msgstr "Set Pool Type" -#: src/components/PageDashboard/components/FormVecrv.tsx:181 +#: src/components/PageDashboard/components/FormVecrv.tsx:174 msgid "share of total" msgstr "share of total" -#: src/store/createDeployGaugeSlice.ts:422 -#: src/store/createDeployGaugeSlice.ts:460 -#: src/store/createDeployGaugeSlice.ts:498 -#: src/store/createDeployGaugeSlice.ts:536 -#: src/store/createDeployGaugeSlice.ts:574 -msgid "Sidechain gauge deployment successful." -msgstr "Sidechain gauge deployment successful." - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:122 -#: src/components/PageDeployGauge/ProcessSummary.tsx:47 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:581 +#: src/components/PageDeployGauge/ProcessSummary.tsx:40 msgid "Sidechain gauge successfully deployed" msgstr "Sidechain gauge successfully deployed" @@ -2667,89 +2242,58 @@ msgstr "Slippage comes from depositing too many coins not in balance, and curren msgid "Slippage Loss" msgstr "Slippage Loss" -#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:14 +#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:18 msgid "Slippage tolerance:" msgstr "Slippage tolerance:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:229 -msgid "Slowly changing {0} A so that it doesn't negatively change virtual price growth of shares" -msgstr "Slowly changing {0} A so that it doesn't negatively change virtual price growth of shares" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:59 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:190 msgid "Slowly changing up A so that it doesn't negatively change virtual price growth of shares" msgstr "Slowly changing up A so that it doesn't negatively change virtual price growth of shares" -#: src/components/PageRiskDisclaimer/index.tsx:35 -msgid "Smart Contract Audits" -msgstr "Smart Contract Audits" - -#: src/components/PageRiskDisclaimer/index.tsx:42 -msgid "Smart Contract Risk:" -msgstr "Smart Contract Risk:" - -#: src/components/PagePoolList/index.tsx:272 +#: src/components/PagePoolList/index.tsx:257 msgid "Sorry, we are unable to load your pools." msgstr "Sorry, we are unable to load your pools." #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:40 #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:47 -#~ msgid "Sort by" -#~ msgstr "Sort by" +msgid "Sort by" +msgstr "Sort by" #: src/components/PagePoolList/components/DialogSort/DialogSortMobile.tsx:57 -#~ msgid "Sort By" -#~ msgstr "Sort By" +msgid "Sort By" +msgstr "Sort By" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Spending Approved" msgstr "Spending Approved" -#: src/components/PagePoolList/index.tsx:104 +#: src/components/PagePoolList/index.tsx:110 msgid "Stable NG" msgstr "Stable NG" -#: src/components/PageRiskDisclaimer/index.tsx:83 -msgid "Stablecoins and other derivative assets are designed to maintain a peg to a reference asset. If one of the pool assets drops below its peg, it effectively means that liquidity providers in the pool hold almost all their liquidity in that token. The depegged token may never recover as a result of a technical failure, insolvency, or other adverse situations." -msgstr "Stablecoins and other derivative assets are designed to maintain a peg to a reference asset. If one of the pool assets drops below its peg, it effectively means that liquidity providers in the pool hold almost all their liquidity in that token. The depegged token may never recover as a result of a technical failure, insolvency, or other adverse situations." - -#: src/components/PageCreatePool/PoolType/index.tsx:31 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:75 +#: src/components/PageCreatePool/PoolType/index.tsx:29 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Stableswap" msgstr "Stableswap" -#: src/components/PageRiskDisclaimer/index.tsx:97 -msgid "StableSwap pools" -msgstr "StableSwap pools" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:769 -msgid "Stableswap pools allow up to 8 tokens" -msgstr "Stableswap pools allow up to 8 tokens" - -#: src/components/PageCreatePool/PoolType/index.tsx:37 +#: src/components/PageCreatePool/PoolType/index.tsx:35 msgid "Stableswap pools are currently unavailable on this chain" msgstr "Stableswap pools are currently unavailable on this chain" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:76 -msgid "Stableswap-NG" -msgstr "Stableswap-NG" - -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 -msgid "Stableswap{0}" -msgstr "Stableswap{0}" - -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 -#: src/components/PagePool/Deposit/index.tsx:36 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 +#: src/components/PagePool/Deposit/index.tsx:35 msgid "Stake" msgstr "Stake" -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 msgid "Stake Complete" msgstr "Stake Complete" @@ -2761,26 +2305,21 @@ msgstr "Stake Complete" #~ msgid "Staked LP Tokens" #~ msgstr "Staked LP Tokens" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:31 -msgid "Staked percent" -msgstr "Staked percent" - -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "Staked share:" msgstr "Staked share:" -#: src/components/PagePool/UserDetails/index.tsx:101 +#: src/components/PagePool/UserDetails/index.tsx:104 msgid "Staked:" msgstr "Staked:" -#: src/components/PagePool/Deposit/index.tsx:121 -#: src/components/PagePool/Deposit/index.tsx:130 +#: src/components/PagePool/Deposit/index.tsx:119 +#: src/components/PagePool/Deposit/index.tsx:128 msgid "Staking is disabled due to inactive Gauge." msgstr "Staking is disabled due to inactive Gauge." -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:209 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:125 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:84 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:131 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:86 msgid "Standard" msgstr "Standard" @@ -2788,27 +2327,27 @@ msgstr "Standard" #~ msgid "Stats" #~ msgstr "Stats" -#: src/components/DetailInfoEstGas.tsx:88 +#: src/components/DetailInfoEstGas.tsx:82 msgid "Step {0} of {1}" msgstr "Step {0} of {1}" -#: src/components/PageDeployGauge/index.tsx:94 +#: src/components/PageDeployGauge/index.tsx:93 msgid "Step 1" msgstr "Step 1" -#: src/components/PageDeployGauge/ProcessSummary.tsx:93 +#: src/components/PageDeployGauge/ProcessSummary.tsx:72 msgid "Step 1 and Step 2 must be completed using the same wallet" msgstr "Step 1 and Step 2 must be completed using the same wallet" -#: src/components/PageDeployGauge/ProcessSummary.tsx:32 +#: src/components/PageDeployGauge/ProcessSummary.tsx:33 msgid "Step 1:" msgstr "Step 1:" -#: src/components/PageDeployGauge/index.tsx:106 +#: src/components/PageDeployGauge/index.tsx:105 msgid "Step 2" msgstr "Step 2" -#: src/components/PageDeployGauge/ProcessSummary.tsx:62 +#: src/components/PageDeployGauge/ProcessSummary.tsx:52 msgid "Step 2:" msgstr "Step 2:" @@ -2844,60 +2383,51 @@ msgstr "Successfully locked {0} CRV until {1}" #~ msgid "Successfully locked additional {0} CRV." #~ msgstr "Successfully locked additional {0} CRV." -#: src/components/PageCreatePool/constants.ts:120 +#: src/components/PageCreatePool/constants.ts:104 msgid "Suitable for forex pairs with low relative volatility" msgstr "Suitable for forex pairs with low relative volatility" -#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PageCreatePool/constants.ts:120 msgid "Suitable for liquid staking derivatives soft-pegged to its underlying asset." msgstr "Suitable for liquid staking derivatives soft-pegged to its underlying asset." -#: src/components/PageCreatePool/constants.ts:91 -#: src/components/PageCreatePool/constants.ts:152 -msgid "Suitable for LRTs" -msgstr "Suitable for LRTs" - -#: src/components/PageCreatePool/constants.ts:104 +#: src/components/PageCreatePool/constants.ts:88 msgid "Suitable for most volatile pairs such as LDO <> ETH" msgstr "Suitable for most volatile pairs such as LDO <> ETH" -#: src/components/PageCreatePool/constants.ts:79 +#: src/components/PageCreatePool/constants.ts:75 msgid "Suitable for stablecoins that are crypto-backed" msgstr "Suitable for stablecoins that are crypto-backed" -#: src/components/PageCreatePool/constants.ts:67 +#: src/components/PageCreatePool/constants.ts:63 msgid "Suitable for stablecoins that are fiat-redeemable" msgstr "Suitable for stablecoins that are fiat-redeemable" -#: src/components/PageCreatePool/constants.ts:169 +#: src/components/PageCreatePool/constants.ts:137 msgid "Suitable for USD stablecoin <> BTC stablecoin <> ETH." msgstr "Suitable for USD stablecoin <> BTC stablecoin <> ETH." -#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:153 msgid "Suitable for volatile tokens paired against ETH and USD stablecoins" msgstr "Suitable for volatile tokens paired against ETH and USD stablecoins" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:104 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:167 msgid "Summary" msgstr "Summary" -#: src/components/PagePool/index.tsx:198 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PagePoolList/components/TableRowMobile.tsx:165 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/index.tsx:191 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:171 +#: src/components/PageRouterSwap/index.tsx:216 +#: src/components/PageRouterSwap/Page.tsx:112 #: src/components/PageRouterSwap/Page.tsx:116 -#: src/components/PageRouterSwap/Page.tsx:127 -#: src/layout/default/Header.tsx:95 +#: src/layout/default/Header.tsx:31 msgid "Swap" msgstr "Swap" -#: src/components/PageRouterSwap/index.tsx:159 -msgid "swap {fromAmount} {fromToken} for {0} {toToken} at max slippage {maxSlippage}%." -msgstr "swap {fromAmount} {fromToken} for {0} {toToken} at max slippage {maxSlippage}%." - -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PageRouterSwap/index.tsx:216 msgid "Swap Complete" msgstr "Swap Complete" @@ -2906,12 +2436,8 @@ msgstr "Swap Complete" #~ msgstr "Swap fee ({0} - {1}%)" #: src/components/PageCreatePool/Parameters/index.tsx:215 -#~ msgid "Swap Fee ({0} - {1}%)" -#~ msgstr "Swap Fee ({0} - {1}%)" - -#: src/components/PageCreatePool/Parameters/index.tsx:226 -msgid "Swap Fee ({0}% - {1}%)" -msgstr "Swap Fee ({0}% - {1}%)" +msgid "Swap Fee ({0} - {1}%)" +msgstr "Swap Fee ({0} - {1}%)" #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:32 msgid "Swap Fee:" @@ -2929,7 +2455,7 @@ msgstr "Swap is not available." #~ msgid "Swap type:" #~ msgstr "Swap type:" -#: src/components/PagePool/Swap/index.tsx:511 +#: src/components/PagePool/Swap/index.tsx:512 msgid "Swap Wrapped" msgstr "Swap Wrapped" @@ -2946,19 +2472,19 @@ msgstr "Swap Wrapped" #~ msgstr "Swapped {0} to {1} approved" #: src/components/PageRouterSwap/index.tsx:162 -#~ msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" -#~ msgstr "Swapped {fromAmount} {fromToken} for {0} {toToken}" +msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" +msgstr "Swapped {fromAmount} {fromToken} for {0} {toToken}" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:54 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:55 msgid "Swaps" msgstr "Swaps" -#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:75 +#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:37 msgid "Switch tokens" msgstr "Switch tokens" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:45 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:67 msgid "Symbol:" msgstr "Symbol:" @@ -2970,11 +2496,7 @@ msgstr "tBTC v1 is in sunset mode: Threshold Network is offering bonds to bring #~ msgid "Technical Docs" #~ msgstr "Technical Docs" -#: src/components/PageRiskDisclaimer/index.tsx:40 -msgid "Technology Risk" -msgstr "Technology Risk" - -#: src/layout/default/Footer.tsx:38 +#: src/layout/default/Footer.tsx:33 msgid "Telegram" msgstr "Telegram" @@ -2987,33 +2509,21 @@ msgstr "Telegram" #~ msgstr "Telegram CN" #: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -#~ msgid "The address needs to be 42 characters long." -#~ msgstr "The address needs to be 42 characters long." +msgid "The address needs to be 42 characters long." +msgstr "The address needs to be 42 characters long." -#: src/components/PageDeployGauge/InfoBox.tsx:12 +#: src/components/PageDeployGauge/InfoBox.tsx:13 msgid "The address that deploys a gauge is set as the gauge admin/manager." msgstr "The address that deploys a gauge is set as the gauge admin/manager." -#: src/components/PageRiskDisclaimer/index.tsx:70 -msgid "The Curve Emergency Admin is a" -msgstr "The Curve Emergency Admin is a" - #: src/domain/create-pool/index.tsx:204 #~ msgid "The Curve pool creation factory is not yet available on this network." #~ msgstr "The Curve pool creation factory is not yet available on this network." -#: src/components/PageRiskDisclaimer/index.tsx:67 -msgid "The Curve protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including the implementation of new system contracts and the adjustment of system parameters." -msgstr "The Curve protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including the implementation of new system contracts and the adjustment of system parameters." - -#: src/components/PagePool/Swap/index.tsx:558 +#: src/components/PagePool/Swap/index.tsx:478 msgid "The entered amount exceeds the available currency reserves." msgstr "The entered amount exceeds the available currency reserves." -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:50 -msgid "The expected amount you would like to receive, {0}, will actually be {toAmountOutput}." -msgstr "The expected amount you would like to receive, {0}, will actually be {toAmountOutput}." - #: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." @@ -3023,16 +2533,8 @@ msgstr "The following application all allege they are building atop the Curve ec #~ msgstr "The next step is depositing liquidity." #: src/components/PageCreatePool/ConfirmModal/index.tsx:268 -#~ msgid "The next step is to deploy a gauge." -#~ msgstr "The next step is to deploy a gauge." - -#: src/components/PageRiskDisclaimer/index.tsx:114 -msgid "The overall market dynamics, including price volatility, liquidity fluctuations, and broader economic factors, can impact the value of user funds when providing liquidity. Sudden market movements or unexpected events can result in losses that may be difficult to anticipate or mitigate." -msgstr "The overall market dynamics, including price volatility, liquidity fluctuations, and broader economic factors, can impact the value of user funds when providing liquidity. Sudden market movements or unexpected events can result in losses that may be difficult to anticipate or mitigate." - -#: src/components/PageRiskDisclaimer/index.tsx:138 -msgid "The regulatory landscape surrounding blockchain technology, DeFi protocols, tokens, cryptocurrencies, and related activities is constantly evolving, resulting in regulatory uncertainty. The lack of clear and consistent regulations may impact legal obligations, compliance requirements, and potential risks associated with the protocol activities." -msgstr "The regulatory landscape surrounding blockchain technology, DeFi protocols, tokens, cryptocurrencies, and related activities is constantly evolving, resulting in regulatory uncertainty. The lack of clear and consistent regulations may impact legal obligations, compliance requirements, and potential risks associated with the protocol activities." +msgid "The next step is to deploy a gauge." +msgstr "The next step is to deploy a gauge." #: src/hooks/useTokenAlert.tsx:27 msgid "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown." @@ -3043,26 +2545,22 @@ msgstr "The Ren network is currently operational but is expected to go offline i #~ msgstr "The Ren network is currently operational but is expected to go offline in the near future. The exact date is currently unknown. This is out of our control, but we will do everything in our power to make sure the peg of Ren assets is maintained." #: src/components/PageDashboard/components/FormClaimFees.tsx:68 -#~ msgid "The rewards you claimed are viewable in 3pool." -#~ msgstr "The rewards you claimed are viewable in 3pool." +msgid "The rewards you claimed are viewable in 3pool." +msgstr "The rewards you claimed are viewable in 3pool." -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:29 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:25 msgid "The total fee on each trade is split in two parts: one part goes to the pool’s Liquidity Providers, another part goes to the DAO (i.e. Curve veCRV holders)" msgstr "The total fee on each trade is split in two parts: one part goes to the pool’s Liquidity Providers, another part goes to the DAO (i.e. Curve veCRV holders)" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:99 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:90 msgid "There was an error fetching the pool activity data." msgstr "There was an error fetching the pool activity data." -#: src/components/PagePoolList/components/ChipVolatileBaseApy.tsx:15 -msgid "This is a volatile number that will very likely not persist." -msgstr "This is a volatile number that will very likely not persist." - -#: src/components/PoolRewardsCrv.tsx:48 +#: src/components/PoolRewardsCrv.tsx:43 msgid "This pool has CRV rewards that aren’t currently being distributed.<0/>This pool has a very small amount of rewards waiting to be distributed to it; but since the amount of rewards is very small, the bridge used to send these CRV tokens over is holding onto those tokens until they grow to an amount big enough to be bridged. If this pool continues receiving votes, the amount of tokens to be distributed will grow every Thursday, and eventually unlock and be distributed then." msgstr "This pool has CRV rewards that aren’t currently being distributed.<0/>This pool has a very small amount of rewards waiting to be distributed to it; but since the amount of rewards is very small, the bridge used to send these CRV tokens over is holding onto those tokens until they grow to an amount big enough to be bridged. If this pool continues receiving votes, the amount of tokens to be distributed will grow every Thursday, and eventually unlock and be distributed then." -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:218 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:219 msgid "This pool has CRV rewards that aren’t streaming yet. Click ‘Claim CRV’ to resume reward streaming for you and everyone else!" msgstr "This pool has CRV rewards that aren’t streaming yet. Click ‘Claim CRV’ to resume reward streaming for you and everyone else!" @@ -3070,156 +2568,91 @@ msgstr "This pool has CRV rewards that aren’t streaming yet. Click ‘Claim CR #~ msgid "This pool has CRV rewards that aren’t streaming yet. Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" #~ msgstr "This pool has CRV rewards that aren’t streaming yet. Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" -#: src/components/PoolRewardsCrv.tsx:30 +#: src/components/PoolRewardsCrv.tsx:28 msgid "This pool has CRV rewards that aren’t streaming yet.<0/>Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" msgstr "This pool has CRV rewards that aren’t streaming yet.<0/>Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" -#: src/components/PagePool/components/AlertSeedAmounts.tsx:52 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amount of the other token should be {1}." -msgstr "This pool is empty. Assuming you are adding {0}, the equivalent amount of the other token should be {1}." - -#: src/components/PagePool/components/AlertSeedAmounts.tsx:54 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amounts of the other tokens should be:" -msgstr "This pool is empty. Assuming you are adding {0}, the equivalent amounts of the other tokens should be:" - #: src/components/PagePool/components/TransferActions.tsx:47 -#~ msgid "This pool is still empty, it should be seeded with the following rate {0}" -#~ msgstr "This pool is still empty, it should be seeded with the following rate {0}" +msgid "This pool is still empty, it should be seeded with the following rate {0}" +msgstr "This pool is still empty, it should be seeded with the following rate {0}" #: src/components/PagePool/components/TransferActions.tsx:48 -#~ msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." -#~ msgstr "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." +msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." +msgstr "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." #: src/domain/transfer/components/transfer-actions.tsx:49 #~ msgid "This pool is still empty. It needs to be seeded with an initial deposit in order to enable swaps." #~ msgstr "This pool is still empty. It needs to be seeded with an initial deposit in order to enable swaps." #: src/components/PagePool/components/WarningModal.tsx:71 -#~ msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." -#~ msgstr "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." +msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." +msgstr "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." #: src/components/PagePool/components/WarningModal.tsx:69 -#~ msgid "This swap has a high price impact ({0}%)." -#~ msgstr "This swap has a high price impact ({0}%)." - -#: src/components/PagePool/components/WarningModal.tsx:80 -msgid "This swap has a high price impact ({formattedValue}) and low exchange rate ({formattedExchangeRate})." -msgstr "This swap has a high price impact ({formattedValue}) and low exchange rate ({formattedExchangeRate})." - -#: src/components/PagePool/components/WarningModal.tsx:78 -msgid "This swap has a high price impact ({formattedValue})." -msgstr "This swap has a high price impact ({formattedValue})." +msgid "This swap has a high price impact ({0}%)." +msgstr "This swap has a high price impact ({0}%)." #: src/components/PagePool/components/WarningModal.tsx:67 -#~ msgid "This swap has a low exchange rate ({0}%)." -#~ msgstr "This swap has a low exchange rate ({0}%)." - -#: src/components/PagePool/components/WarningModal.tsx:76 -msgid "This swap has a low exchange rate ({formattedExchangeRate})." -msgstr "This swap has a low exchange rate ({formattedExchangeRate})." +msgid "This swap has a low exchange rate ({0}%)." +msgstr "This swap has a low exchange rate ({0}%)." -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:80 -msgid "Three Coin Cryptoswap-NG" -msgstr "Three Coin Cryptoswap-NG" - -#: src/components/PageCreatePool/constants.ts:184 +#: src/components/PageCreatePool/constants.ts:152 msgid "Three Coin Volatile" msgstr "Three Coin Volatile" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:71 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:72 msgid "Time" msgstr "Time" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:234 -msgid "to sim)." -msgstr "to sim)." - -#: src/components/PageDeployGauge/index.tsx:84 +#: src/components/PageDeployGauge/index.tsx:83 msgid "Toggle between mainnet and sidechain gauge deployment" msgstr "Toggle between mainnet and sidechain gauge deployment" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:36 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:34 msgid "Token" msgstr "Token" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:38 -#: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:38 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:36 +#: src/components/PageCreatePool/TokensInPool/index.tsx:510 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:26 msgid "Token A" msgstr "Token A" -#: src/components/PageDashboard/components/TableHead.tsx:73 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:27 -#: src/components/PagePoolList/components/TableRowMobile.tsx:137 +#: src/components/PageDashboard/index.tsx:60 +#: src/components/PagePoolList/Page.tsx:62 msgid "Token APR based on current prices of tokens and reward rates" msgstr "Token APR based on current prices of tokens and reward rates" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 msgid "Token APR based on current prices of tokens and reward rates." msgstr "Token APR based on current prices of tokens and reward rates." -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:41 -#: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:41 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:39 +#: src/components/PageCreatePool/TokensInPool/index.tsx:529 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:29 msgid "Token B" msgstr "Token B" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:44 -#: src/components/PageCreatePool/TokensInPool/index.tsx:642 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:79 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:44 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:42 +#: src/components/PageCreatePool/TokensInPool/index.tsx:550 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:53 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:32 msgid "Token C" msgstr "Token C" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:47 -#: src/components/PageCreatePool/TokensInPool/index.tsx:662 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:62 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:45 +#: src/components/PageCreatePool/TokensInPool/index.tsx:574 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:35 msgid "Token D" msgstr "Token D" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:50 -#: src/components/PageCreatePool/TokensInPool/index.tsx:682 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:63 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:50 -msgid "Token E" -msgstr "Token E" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:53 -#: src/components/PageCreatePool/TokensInPool/index.tsx:702 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 -msgid "Token F" -msgstr "Token F" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:56 -#: src/components/PageCreatePool/TokensInPool/index.tsx:722 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:65 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 -msgid "Token G" -msgstr "Token G" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 -#: src/components/PageCreatePool/TokensInPool/index.tsx:742 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -msgid "Token H" -msgstr "Token H" - #: src/components/PageCreatePool/TokensInPool/index.tsx:589 -#~ msgid "" -#~ "Tokens appear to be unpegged (>5% deviation from 1:1).\n" -#~ "Consider using Cryptoswap instead." -#~ msgstr "" -#~ "Tokens appear to be unpegged (>5% deviation from 1:1).\n" -#~ "Consider using Cryptoswap instead." - -#: src/components/PageCreatePool/TokensInPool/index.tsx:757 msgid "" -"Tokens appear to be unpegged (above 5% deviation from 1:1).\n" +"Tokens appear to be unpegged (>5% deviation from 1:1).\n" "Consider using Cryptoswap instead." msgstr "" -"Tokens appear to be unpegged (above 5% deviation from 1:1).\n" +"Tokens appear to be unpegged (>5% deviation from 1:1).\n" "Consider using Cryptoswap instead." #: src/domain/create-pool/tokens-in-pool/index.tsx:753 @@ -3230,31 +2663,28 @@ msgstr "" #~ msgid "Tokens Approval Failed" #~ msgstr "Tokens Approval Failed" -#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:63 msgid "TOKENS IN POOL" msgstr "TOKENS IN POOL" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:61 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:58 msgid "Tokens In Pool:" msgstr "Tokens In Pool:" -#: src/components/PageDashboard/components/Summary.tsx:95 +#: src/components/PageDashboard/components/Summary.tsx:96 msgid "Total Balances" msgstr "Total Balances" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:31 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:32 msgid "Total Daily Profits" msgstr "Total Daily Profits" -#: src/layout/default/Header.tsx:69 +#: src/layout/default/HeaderMobile.tsx:207 +#: src/layout/default/HeaderSecondary.tsx:50 msgid "Total Deposits" msgstr "Total Deposits" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:20 -msgid "Total LP Tokens staked:" -msgstr "Total LP Tokens staked:" - -#: src/components/PageDashboard/components/Summary.tsx:159 +#: src/components/PageDashboard/components/Summary.tsx:165 msgid "Total Summary" msgstr "Total Summary" @@ -3270,27 +2700,21 @@ msgstr "Trade routed through:" #~ msgid "trading fees distributed to CRV lockers" #~ msgstr "trading fees distributed to CRV lockers" -#: src/components/PageDashboard/components/FormClaimFees.tsx:43 +#: src/components/PageDashboard/components/FormClaimFees.tsx:93 msgid "Trading fees distributed to CRV lockers" msgstr "Trading fees distributed to CRV lockers" -#: src/components/PageRouterSwap/index.tsx:168 -msgid "Transaction complete. Received {0} {toToken}." -msgstr "Transaction complete. Received {0} {toToken}." - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:204 -#: src/components/PageDeployGauge/ProcessSummary.tsx:53 -#: src/components/PageDeployGauge/ProcessSummary.tsx:85 +#: src/components/PageDeployGauge/ProcessSummary.tsx:43 +#: src/components/PageDeployGauge/ProcessSummary.tsx:64 msgid "Transaction:" msgstr "Transaction:" -#: src/components/PageCreatePool/constants.ts:168 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:78 -#: src/components/PagePoolList/index.tsx:102 +#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PagePoolList/index.tsx:108 msgid "Tricrypto" msgstr "Tricrypto" -#: src/components/PagePoolList/Page.tsx:58 +#: src/components/PagePoolList/Page.tsx:69 msgid "TVL" msgstr "TVL" @@ -3298,34 +2722,31 @@ msgstr "TVL" #~ msgid "Twitter" #~ msgstr "Twitter" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 -msgid "Two Coin Cryptoswap" -msgstr "Two Coin Cryptoswap" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:79 -msgid "Two Coin Cryptoswap-NG" -msgstr "Two Coin Cryptoswap-NG" - #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:122 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:165 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:227 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:262 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:301 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:351 -#~ msgid "Tx: {0} created" -#~ msgstr "Tx: {0} created" - -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:34 -msgid "Tx: {poolId} created" -msgstr "Tx: {poolId} created" +msgid "Tx: {0} created" +msgstr "Tx: {0} created" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:64 -#~ msgid "Tx: Gauge deployed" -#~ msgstr "Tx: Gauge deployed" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:106 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:115 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:185 +msgid "Tx: Gauge deployed" +msgstr "Tx: Gauge deployed" + +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:148 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:184 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:220 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:256 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:294 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:328 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:362 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:396 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:434 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:467 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:500 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:533 msgid "Tx: Gauge for {0} deployed" msgstr "Tx: Gauge for {0} deployed" @@ -3460,32 +2881,33 @@ msgid "Unable to get locked CRV info" msgstr "Unable to get locked CRV info" #: src/components/AlertFormError.tsx:61 -#: src/components/PageDashboard/index.tsx:154 +#: src/components/PageDashboard/index.tsx:159 msgid "Unable to get pool list" msgstr "Unable to get pool list" -#: src/store/createUserSlice.ts:90 -msgid "Unable to get pools" -msgstr "Unable to get pools" +#: src/store/createDashboardSlice.ts:279 +#: src/store/createUserSlice.ts:104 +#~ msgid "Unable to get pools" +#~ msgstr "Unable to get pools" #: src/domain/transfer/withdraw/form-claim/index.tsx:122 #~ msgid "Unable to get rewards" #~ msgstr "Unable to get rewards" #: src/components/PagePool/index.tsx:151 -#~ msgid "Unable to get seed initial rate" -#~ msgstr "Unable to get seed initial rate" +msgid "Unable to get seed initial rate" +msgstr "Unable to get seed initial rate" #: src/domain/transfer/deposit/form-deposit/index.tsx:191 #: src/domain/transfer/deposit/form-deposit-stake/index.tsx:189 #~ msgid "Unable to get slippage" #~ msgstr "Unable to get slippage" -#: src/components/DetailInfoEstGas.tsx:105 +#: src/components/DetailInfoEstGas.tsx:98 msgid "Unable to get USD rate" msgstr "Unable to get USD rate" -#: src/components/PagePool/components/TransferActions.tsx:46 +#: src/components/PagePool/components/TransferActions.tsx:58 msgid "Unable to get wallet balances" msgstr "Unable to get wallet balances" @@ -3579,7 +3001,7 @@ msgstr "Unstaked {0} LP Tokens" #~ msgid "Unstaked {lpTokenPayload} LP Tokens" #~ msgstr "Unstaked {lpTokenPayload} LP Tokens" -#: src/components/PagePool/UserDetails/index.tsx:104 +#: src/components/PagePool/UserDetails/index.tsx:107 msgid "Unstaked:" msgstr "Unstaked:" @@ -3587,11 +3009,7 @@ msgstr "Unstaked:" #~ msgid "Unstaking" #~ msgstr "Unstaking" -#: src/components/PageRiskDisclaimer/index.tsx:117 -msgid "Unvetted Tokens:" -msgstr "Unvetted Tokens:" - -#: src/components/PageCreatePool/Parameters/index.tsx:268 +#: src/components/PageCreatePool/Parameters/index.tsx:257 msgid "Update Quote" msgstr "Update Quote" @@ -3599,24 +3017,24 @@ msgstr "Update Quote" #~ msgid "Update Unlock Date" #~ msgstr "Update Unlock Date" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:190 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:304 msgid "Upload an icon for a new token" msgstr "Upload an icon for a new token" -#: src/components/PagePool/UserDetails/index.tsx:175 +#: src/components/PagePool/UserDetails/index.tsx:174 msgid "USD balance" msgstr "USD balance" -#: src/components/PageDashboard/index.tsx:57 +#: src/components/PageDashboard/index.tsx:68 msgid "USD Profits" msgstr "USD Profits" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:58 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:60 msgid "USD total" msgstr "USD total" -#: src/components/PageDashboard/components/SummaryClaimable.tsx:65 -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:71 +#: src/components/PageDashboard/components/SummaryClaimable.tsx:59 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:65 msgid "USD Total" msgstr "USD Total" @@ -3624,7 +3042,7 @@ msgstr "USD Total" #~ msgid "USD total balance updates every ~1 minute" #~ msgstr "USD total balance updates every ~1 minute" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:61 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:64 msgid "USD total balance updates every ~5 minute" msgstr "USD total balance updates every ~5 minute" @@ -3632,31 +3050,32 @@ msgstr "USD total balance updates every ~5 minute" msgid "User rejected action" msgstr "User rejected action" -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:18 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:16 msgid "V2 pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." msgstr "V2 pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." -#: src/components/PageDashboard/components/TableHead.tsx:67 -#: src/components/PagePoolList/components/TableHead.tsx:80 -#: src/components/PagePoolList/components/TableHead.tsx:100 +#: src/components/PageDashboard/components/TableHead.tsx:85 +#: src/components/PagePoolList/components/TableHead.tsx:91 +#: src/components/PagePoolList/components/TableHead.tsx:113 msgid "Variable APY based on today's trading activity" msgstr "Variable APY based on today's trading activity" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:49 msgid "Variable APY based on today's trading activity." msgstr "Variable APY based on today's trading activity." -#: src/components/PageDashboard/components/FormClaimFees.tsx:42 -msgid "veCRV rewards" -msgstr "veCRV rewards" +#: src/domain/user-dashboard/summary.tsx:215 +#~ msgid "veCRV rewards" +#~ msgstr "veCRV rewards" #: src/domain/user-dashboard/summary.tsx:215 #~ msgid "veCRV rewards:" #~ msgstr "veCRV rewards:" #: src/components/PageDashboard/components/FormClaimFees.tsx:89 -#~ msgid "veCRV rewards: <0>{0} 3CRV" -#~ msgstr "veCRV rewards: <0>{0} 3CRV" +msgid "veCRV rewards: <0>{0} 3CRV" +msgstr "veCRV rewards: <0>{0} 3CRV" #: src/domain/user-dashboard/components/form-claim-lp-rewards.tsx:95 #~ msgid "veCRV rewards: <0>{claimFeesAmount} 3CRV" @@ -3666,11 +3085,11 @@ msgstr "veCRV rewards" #~ msgid "Vesting" #~ msgstr "Vesting" -#: src/components/PageDashboard/components/Summary.tsx:122 +#: src/components/PageDashboard/components/Summary.tsx:128 msgid "View address" msgstr "View address" -#: src/components/PagePoolList/index.tsx:285 +#: src/components/PagePoolList/index.tsx:270 msgid "view all pools." msgstr "view all pools." @@ -3678,7 +3097,7 @@ msgstr "view all pools." #~ msgid "Virtual price" #~ msgstr "Virtual price" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:96 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:103 msgid "Virtual price:" msgstr "Virtual price:" @@ -3699,95 +3118,66 @@ msgstr "Virtual price:" #~ msgid "Visit old UI" #~ msgstr "Visit old UI" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:59 -msgid "Visit pool" -msgstr "Visit pool" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:166 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:295 msgid "Visit the new pool to deposit liquidity." msgstr "Visit the new pool to deposit liquidity." -#: src/components/PageDeployGauge/ProcessSummary.tsx:97 +#: src/components/PageDeployGauge/ProcessSummary.tsx:76 msgid "Visit the pool" msgstr "Visit the pool" -#: src/components/PagePoolList/Page.tsx:59 +#: src/components/PagePoolList/Page.tsx:70 msgid "Volume" msgstr "Volume" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 -msgid "Vyper Version:" -msgstr "Vyper Version:" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:147 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:150 -#: src/components/PagePool/Swap/index.tsx:197 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:160 -#: src/components/PageRouterSwap/index.tsx:226 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:144 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:145 +#: src/components/PagePool/Swap/index.tsx:193 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:159 +#: src/components/PageRouterSwap/index.tsx:221 msgid "Warning!" msgstr "Warning!" #: src/components/PageRouterSwap/index.tsx:500 -#~ msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" -#~ msgstr "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" +msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" +msgstr "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" #: src/components/AlertFormWarning.tsx:22 -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:48 msgid "Warning! Exchange rate is too low!" msgstr "Warning! Exchange rate is too low!" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:47 -msgid "Warning! High price impact!" -msgstr "Warning! High price impact!" - #: src/components/PageRouterSwap/index.tsx:496 -#~ msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." -#~ msgstr "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." +msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." +msgstr "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:40 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:34 msgid "Weekly" msgstr "Weekly" -#: src/components/PageRiskDisclaimer/index.tsx:123 -msgid "When participating as a liquidity provider in any pool, users should carefully assess the tokens' functionality, security audits, team credibility, community feedback, and other relevant factors to make informed decisions and mitigate potential risks associated with the pool assets." -msgstr "When participating as a liquidity provider in any pool, users should carefully assess the tokens' functionality, security audits, team credibility, community feedback, and other relevant factors to make informed decisions and mitigate potential risks associated with the pool assets." - -#: src/components/PageRiskDisclaimer/index.tsx:53 -msgid "When you engage in transactions on Ethereum or EVM-compatible blockchains, it is important to understand that these transactions are immutable and irreversible. Once a transaction is confirmed and recorded on the blockchain, it cannot be modified, reversed, or deleted. This means that if a user sends funds to an incorrect address or engage in a fraudulent transaction, it may not be possible to recover the funds. It is crucial to exercise caution, verify transaction details, and use secure wallets to minimize the risk of irreversible transactions." -msgstr "When you engage in transactions on Ethereum or EVM-compatible blockchains, it is important to understand that these transactions are immutable and irreversible. Once a transaction is confirmed and recorded on the blockchain, it cannot be modified, reversed, or deleted. This means that if a user sends funds to an incorrect address or engage in a fraudulent transaction, it may not be possible to recover the funds. It is crucial to exercise caution, verify transaction details, and use secure wallets to minimize the risk of irreversible transactions." - -#: src/layout/default/Footer.tsx:131 +#: src/layout/default/Footer.tsx:97 msgid "Whitepaper" msgstr "Whitepaper" -#: src/layout/default/Footer.tsx:73 +#: src/layout/default/Footer.tsx:68 msgid "Wiki CN" msgstr "Wiki CN" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:232 -msgid "with similar assets for inspiration (or use" -msgstr "with similar assets for inspiration (or use" - #: src/components/AlertSlippage.tsx:24 -msgid "With your current slippage tolerance setting ({0}), the expected output displayed above might incur up to <0>{1} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -msgstr "With your current slippage tolerance setting ({0}), the expected output displayed above might incur up to <0>{1} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." +msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." +msgstr "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -#: src/components/AlertSlippage.tsx:24 -#~ msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -#~ msgstr "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." - -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 #: src/components/PagePool/Withdraw/index.tsx:31 -#: src/components/PagePoolList/components/TableRowMobile.tsx:162 +#: src/components/PagePoolList/components/TableRowMobile.tsx:168 msgid "Withdraw" msgstr "Withdraw" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw Claim" msgstr "Withdraw Claim" #: src/components/PageDashboard/components/FormVecrv.tsx:72 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 msgid "Withdraw Complete" msgstr "Withdraw Complete" @@ -3809,7 +3199,7 @@ msgstr "Withdraw CRV Complete" #~ msgid "Withdraw Liquidity Approval Failed" #~ msgstr "Withdraw Liquidity Approval Failed" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:460 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:459 msgid "Withdraw Wrapped" msgstr "Withdraw Wrapped" @@ -3817,7 +3207,7 @@ msgstr "Withdraw Wrapped" #~ msgid "Withdraw/ Claim" #~ msgstr "Withdraw/ Claim" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw/Claim" msgstr "Withdraw/Claim" @@ -3825,7 +3215,7 @@ msgstr "Withdraw/Claim" #~ msgid "Withdrawing" #~ msgstr "Withdrawing" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:111 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:110 msgid "Withdrew {0} LP Tokens for {tokenText}" msgstr "Withdrew {0} LP Tokens for {tokenText}" @@ -3837,11 +3227,11 @@ msgstr "Withdrew {0} LP Tokens for {tokenText}" #~ msgid "Withdrew CRV" #~ msgstr "Withdrew CRV" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:341 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 msgid "Xcp Profit A:" msgstr "Xcp Profit A:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:335 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:172 msgid "Xcp Profit:" msgstr "Xcp Profit:" @@ -3854,20 +3244,21 @@ msgstr "Xcp Profit:" msgid "You have a balance in this pool" msgstr "You have a balance in this pool" -#: src/components/PageCrvLocker/components/FormLockDate.tsx:214 +#: src/components/PageCrvLocker/components/FormLockDate.tsx:215 msgid "You have reached the maximum locked date." msgstr "You have reached the maximum locked date." -#: src/components/PagePool/UserDetails/index.tsx:76 +#: src/components/PagePool/UserDetails/index.tsx:79 msgid "your boost" msgstr "your boost" -#: src/components/PagePool/UserDetails/index.tsx:111 -#: src/components/PagePool/UserDetails/index.tsx:116 +#: src/components/PagePool/UserDetails/index.tsx:114 +#: src/components/PagePool/UserDetails/index.tsx:119 msgid "Your CRV Rewards tAPR:" msgstr "Your CRV Rewards tAPR:" -#: src/components/PagePool/index.tsx:126 +#: src/components/PagePool/index.tsx:105 +#: src/components/PagePool/index.tsx:110 msgid "Your Details" msgstr "Your Details" @@ -3875,6 +3266,6 @@ msgstr "Your Details" msgid "Your lock has expired, claim your <0>{lockedAmountDisplay} CRV" msgstr "Your lock has expired, claim your <0>{lockedAmountDisplay} CRV" -#: src/components/PagePool/UserDetails/index.tsx:92 +#: src/components/PagePool/UserDetails/index.tsx:95 msgid "Your position" msgstr "Your position" diff --git a/apps/main/src/locales/pseudo/messages.po b/apps/main/src/locales/pseudo/messages.po index d5929fb22..aa8edcbe1 100644 --- a/apps/main/src/locales/pseudo/messages.po +++ b/apps/main/src/locales/pseudo/messages.po @@ -13,26 +13,26 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/components/PageDashboard/index.tsx:199 +#: src/components/PageDashboard/index.tsx:205 msgid ". Please click on the pool name to view them on" msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "(incl. fees):" msgstr "" -#: src/components/PageCreatePool/constants.ts:217 -#: src/components/PageCreatePool/constants.ts:223 +#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:191 msgid "(only available for pools with pegged assets)" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:763 +#: src/components/PageCreatePool/TokensInPool/index.tsx:595 msgid "(Switch)" msgstr "" #: src/components/PageCreatePool/components/InfoBox.tsx:27 #: src/components/PageCreatePool/components/InfoBox.tsx:33 -#: src/components/PageCreatePool/constants.ts:216 +#: src/components/PageCreatePool/constants.ts:184 msgid "{0}" msgstr "" @@ -64,22 +64,18 @@ msgstr "" #~ msgid "{0} deposited and staked approved" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:69 -msgid "{0} is a Cryptoswap pool" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:78 -#~ msgid "{0} is a v2 pool" -#~ msgstr "" +msgid "{0} is a v2 pool" +msgstr "" #: src/domain/create-pool/parameters/initial-price.tsx:33 #: src/domain/create-pool/parameters/initial-price.tsx:42 #~ msgid "{0} price" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:34 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:45 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:57 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:32 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:43 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:55 msgid "{0} price in USD" msgstr "" @@ -103,27 +99,19 @@ msgstr "" #~ msgid "{0} withdraw approved" #~ msgstr "" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:291 -msgid "{filterValue} is a disabled token in Pool Creation" -msgstr "" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:293 -msgid "{filterValue} is a disabled token in this pool configuration." -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:68 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:54 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 msgid "{title} {0} Oracle" msgstr "" -#: src/components/PageDashboard/index.tsx:188 +#: src/components/PageDashboard/index.tsx:194 msgid "*This UI does not support the following pools:" msgstr "" #: src/components/PageDashboard/index.tsx:66 #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "+ Incentives)" -#~ msgstr "" +msgid "+ Incentives)" +msgstr "" #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:18 msgid "1 month" @@ -137,7 +125,7 @@ msgstr "" msgid "1 year" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:67 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:76 msgid "24h Volume/Liquidity ratio" msgstr "" @@ -145,46 +133,34 @@ msgstr "" msgid "3 months" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:92 -msgid "3CRV have been claimed and sent to 3pool." -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:22 msgid "4 years" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:72 -msgid "5-of-9 multisig" -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:20 msgid "6 months" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:301 -#: src/components/PageCreatePool/Parameters/index.tsx:334 +#: src/components/PageCreatePool/Parameters/index.tsx:296 +#: src/components/PageCreatePool/Parameters/index.tsx:329 msgid "A ({0} - {1})" msgstr "" -#: src/components/PageCreatePool/constants.ts:224 +#: src/components/PageCreatePool/constants.ts:192 msgid "A more gas-efficient implementation that can be used when every token in the pool has 18 decimals and returns True on success / reverts on error" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:75 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:193 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:28 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:83 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:65 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:169 msgid "A:" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:61 -msgid "Access Control:" -msgstr "" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 msgid "Action" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:41 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:42 msgid "Add" msgstr "" @@ -192,33 +168,28 @@ msgstr "" msgid "Add all coins in a balanced proportion" msgstr "" -#: src/components/PagePool/components/AddGaugeLink.tsx:58 +#: src/components/PagePool/components/AddGaugeLink.tsx:50 msgid "Add Gauge" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:796 +#: src/components/PageCreatePool/TokensInPool/index.tsx:639 msgid "Add token" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:146 -#: src/components/PagePoolList/components/TableRowMobile.tsx:149 -msgid "Additional external rewards" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:291 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:280 msgid "Additional slippage tolerance" msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:291 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:476 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:288 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:475 msgid "Additional slippage tolerance:" msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:77 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 msgid "Address (e.g 0x123...)" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:57 msgid "Address:" msgstr "" @@ -226,50 +197,41 @@ msgstr "" msgid "Adjust veCrv" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:380 +#: src/components/PageCreatePool/Parameters/index.tsx:375 msgid "Adjustment Step ({0} - {1})" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:280 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:118 msgid "Adjustment Step:" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:289 -#: src/components/PageCreatePool/Summary/index.tsx:28 -#: src/components/PagePool/index.tsx:129 +#: src/components/PageCreatePool/Parameters/index.tsx:284 +#: src/components/PageCreatePool/Summary/index.tsx:41 +#: src/components/PagePool/index.tsx:106 +#: src/components/PagePool/index.tsx:115 msgid "Advanced" msgstr "" -#: src/components/AdvancedSettings.tsx:140 +#: src/components/AdvancedSettings.tsx:131 msgid "Advanced Settings" msgstr "" -#: src/components/PagePoolList/index.tsx:96 +#: src/components/PagePoolList/index.tsx:102 msgid "ALL" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:358 +#: src/components/PageCreatePool/Parameters/index.tsx:353 msgid "Allowed Extra Profit ({0} - {1})" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:91 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:268 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:106 msgid "Allowed Extra Profit:" msgstr "" -#: src/components/PagePool/Swap/index.tsx:402 -#: src/components/PageRouterSwap/index.tsx:431 -msgid "Amount > wallet balance {0}" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:173 -#~ msgid "Amplification coefficient chosen from fluctuation of prices around 1" -#~ msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:200 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:34 -msgid "Amplification coefficient chosen from fluctuation of prices around 1." +msgid "Amplification coefficient chosen from fluctuation of prices around 1" msgstr "" #: src/domain/transfer/withdraw/form-withdraw/withdraw-actions.tsx:311 @@ -278,12 +240,12 @@ msgstr "" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Approve Spending" msgstr "" @@ -291,31 +253,11 @@ msgstr "" #~ msgid "Approving" #~ msgstr "" -#: src/layout/default/Header.tsx:193 -msgid "Apps" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:99 -msgid "are designed to mitigate impermanent loss by pairing assets that are expected to exhibit mean-reverting behavior. This assumption may not hold true in every case, requiring diligent assessment when interacting with these pools." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:105 -msgid "are designed with an internal oracle to concentrate liquidity around the current market price. The algorithm attempts to offset the effects of impermanent loss by calculating fees generated by the pool and ensuring the pool is in profit before re-pegging. Impermanent loss may still occur in CryptoSwap V2 pools, particularly when the earned fees are insufficient to counterbalance the impact of re-pegging. This underscores the need for users to be attentive about the dynamics of these pools when making decisions about liquidity provision." -msgstr "" - -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:48 -msgid "As the number of staked LP Tokens increases, the CRV tAPR will decrease." -msgstr "" - #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Asc" -#~ msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:79 -msgid "Asset Risk" +msgid "Asc" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:54 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:76 msgid "Asset Type:" msgstr "" @@ -323,15 +265,15 @@ msgstr "" #~ msgid "Audit" #~ msgstr "" -#: src/layout/default/Footer.tsx:136 +#: src/layout/default/Footer.tsx:102 msgid "Audits" msgstr "" #: src/components/PagePool/components/FieldToken.tsx:69 -#: src/components/PagePool/Swap/index.tsx:352 -#: src/components/PagePool/Swap/index.tsx:443 -#: src/components/PageRouterSwap/index.tsx:391 -#: src/components/PageRouterSwap/index.tsx:457 +#: src/components/PagePool/Swap/index.tsx:347 +#: src/components/PagePool/Swap/index.tsx:438 +#: src/components/PageRouterSwap/index.tsx:370 +#: src/components/PageRouterSwap/index.tsx:427 msgid "Avail." msgstr "" @@ -339,8 +281,8 @@ msgstr "" #~ msgid "Avail. {0}" #~ msgstr "" -#: src/components/PageDashboard/components/TableRow.tsx:181 -#: src/components/PageDashboard/index.tsx:56 +#: src/components/PageDashboard/components/TableRow.tsx:179 +#: src/components/PageDashboard/index.tsx:67 msgid "Balance" msgstr "" @@ -352,7 +294,7 @@ msgstr "" #~ msgid "Balance minus estimated gas" #~ msgstr "" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:354 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:353 msgid "Balanced" msgstr "" @@ -360,47 +302,35 @@ msgstr "" #~ msgid "Balanced amounts" #~ msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:140 +#: src/components/PagePool/UserDetails/index.tsx:139 msgid "Balanced withdraw amounts" msgstr "" -#: src/components/PageCreatePool/constants.ts:210 +#: src/components/PageCreatePool/constants.ts:178 msgid "Balances" msgstr "" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:39 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:40 msgid "Base" msgstr "" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:169 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:243 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:205 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:201 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:126 msgid "BASE" msgstr "" -#: src/components/PageDashboard/index.tsx:53 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 -#: src/components/PagePoolList/Page.tsx:55 +#: src/components/PageDashboard/index.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:48 +#: src/components/PagePoolList/Page.tsx:57 msgid "Base vAPY" msgstr "" -#: src/components/PagePoolList/components/TableRowMobile.tsx:123 -msgid "BASE vAPY" -msgstr "" - -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:42 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:41 msgid "Base vAPY can temporarily be negative when A parameter is ramped down, or crypto pools spend profit to rebalance." msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:100 -msgid "Basepool" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:105 -msgid "Basepool:" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:204 +#: src/components/PageCreatePool/constants.ts:172 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:34 msgid "Basic" msgstr "" @@ -409,11 +339,11 @@ msgstr "" #~ msgid "Beta" #~ msgstr "" -#: src/components/PageCreatePool/PoolType/index.tsx:32 +#: src/components/PageCreatePool/PoolType/index.tsx:30 msgid "Bonding Curve specialising in pegged assets." msgstr "" -#: src/components/PageCreatePool/PoolType/index.tsx:45 +#: src/components/PageCreatePool/PoolType/index.tsx:43 msgid "Bonding Curve specialising in unpegged assets." msgstr "" @@ -421,7 +351,7 @@ msgstr "" msgid "Bonus comes as an advantage from current coin prices which usually appears for coins which are low in balance" msgstr "" -#: src/layout/default/Footer.tsx:141 +#: src/layout/default/Footer.tsx:119 msgid "Bug Bounty" msgstr "" @@ -429,15 +359,11 @@ msgstr "" #~ msgid "Calc" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:228 -msgid "Can't find the pool preset you want? Check out" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:159 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:162 -#: src/components/PagePool/Swap/index.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:172 -#: src/components/PageRouterSwap/index.tsx:237 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:156 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:157 +#: src/components/PagePool/Swap/index.tsx:200 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:171 +#: src/components/PageRouterSwap/index.tsx:232 msgid "Cancel" msgstr "" @@ -453,42 +379,38 @@ msgstr "" #~ msgid "Change network" #~ msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:249 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:209 msgid "Chart" msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:27 -#: src/components/PageCreatePool/components/Navigation.tsx:39 -#: src/components/PageCreatePool/components/Navigation.tsx:52 -#: src/components/PageCreatePool/components/Navigation.tsx:65 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:130 -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:24 -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:32 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:27 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:59 -#: src/components/PageDeployGauge/ProcessSummary.tsx:46 -#: src/components/PageDeployGauge/ProcessSummary.tsx:78 +#: src/components/PageCreatePool/components/Navigation.tsx:38 +#: src/components/PageCreatePool/components/Navigation.tsx:62 +#: src/components/PageCreatePool/components/Navigation.tsx:105 +#: src/components/PageCreatePool/components/Navigation.tsx:156 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:236 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:46 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:55 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:26 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:57 +#: src/components/PageDeployGauge/ProcessSummary.tsx:39 +#: src/components/PageDeployGauge/ProcessSummary.tsx:60 msgid "Checkmark filled" msgstr "" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Chevron left" msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:29 -#: src/components/PageCreatePool/components/Navigation.tsx:42 -#: src/components/PageCreatePool/components/Navigation.tsx:55 -#: src/components/PageCreatePool/components/Navigation.tsx:68 -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:64 +#: src/components/PageCreatePool/components/Navigation.tsx:107 +#: src/components/PageCreatePool/components/Navigation.tsx:158 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Chevron right" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:56 -msgid "Claim 3CRV" -msgstr "" - #: src/components/PagePool/Withdraw/utils.ts:87 msgid "Claim CRV" msgstr "" @@ -497,20 +419,16 @@ msgstr "" msgid "Claim CRV Complete" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:57 -msgid "Claim crvUSD" -msgstr "" - #: src/domain/transfer/withdraw/form-claim/index.tsx:149 #~ msgid "Claim Failed" #~ msgstr "" #: src/components/PageDashboard/components/FormClaimFees.tsx:119 -#~ msgid "Claim LP rewards" -#~ msgstr "" +msgid "Claim LP rewards" +msgstr "" #: src/components/PagePool/Withdraw/components/FormClaim.tsx:110 -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:246 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:247 #: src/components/PagePool/Withdraw/index.tsx:33 msgid "Claim Rewards" msgstr "" @@ -519,9 +437,9 @@ msgstr "" msgid "Claim Rewards Complete" msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:64 -#: src/components/PageDashboard/components/TableRow.tsx:176 -#: src/components/PageDashboard/index.tsx:59 +#: src/components/PageDashboard/components/Summary.tsx:65 +#: src/components/PageDashboard/components/TableRow.tsx:174 +#: src/components/PageDashboard/index.tsx:70 msgid "Claimable Tokens" msgstr "" @@ -529,10 +447,6 @@ msgstr "" msgid "Claimed {balance}" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:85 -msgid "Claimed {key}" -msgstr "" - #: src/components/PagePool/Withdraw/utils.ts:82 msgid "Claimed {tokensMessage}" msgstr "" @@ -547,13 +461,7 @@ msgstr "" #: src/layout/default/HeaderMobile.tsx:162 #: src/layout/default/HeaderSecondary.tsx:79 -#~ msgid "Classic UI" -#~ msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:74 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:81 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:100 -msgid "Clear" +msgid "Classic UI" msgstr "" #: src/domain/transfer/pool-stats/rewards.tsx:45 @@ -564,45 +472,29 @@ msgstr "" #~ msgid "Click here to learn more about Boosting your CRV rewards." #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:72 -msgid "Click here to learn more about Cryptoswap pools" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:81 -#~ msgid "Click here to learn more about v2 pools" -#~ msgstr "" - -#: src/layout/default/Footer.tsx:44 -#: src/layout/default/Footer.tsx:65 -msgid "CN" +msgid "Click here to learn more about v2 pools" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:125 -msgid "Coins:" +#: src/layout/default/Footer.tsx:39 +#: src/layout/default/Footer.tsx:60 +msgid "CN" msgstr "" -#: src/layout/default/Header.tsx:194 +#: src/layout/default/HeaderMobile.tsx:172 msgid "Community" msgstr "" -#: src/components/PageCompensation/Page.tsx:67 -#: src/components/PageCompensation/Page.tsx:71 +#: src/components/PageCompensation/Page.tsx:60 +#: src/components/PageCompensation/Page.tsx:64 msgid "Compensation" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:74 -msgid "composed of Curve community members. It has restricted rights to undertake actions that do not directly impact users' funds, including canceling parameter changes authorized by the DAO and halting CRV emissions to a pool. Early pool implementations included a timelimited function to freeze swaps and deposits in case of emergency, but this precautionary function has since been deprecated in current pool implementations." -msgstr "" - #: src/components/PageCreatePool/ConfirmModal/index.tsx:253 -#~ msgid "Confirm pool setup" -#~ msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:71 -msgid "Confirm Pool Setup" +msgid "Confirm pool setup" msgstr "" -#: src/components/PagePool/components/WarningModal.tsx:89 +#: src/components/PagePool/components/WarningModal.tsx:82 msgid "Confirm warning to proceed." msgstr "" @@ -610,76 +502,59 @@ msgstr "" #~ msgid "Connect" #~ msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:88 +#: src/components/PageDeployGauge/DeploySidechain.tsx:79 msgid "Connect to a sidechain in order to complete the first step and deploy a sidechain gauge." msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:87 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:168 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:560 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:625 msgid "Connect to Ethereum" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:73 +#: src/components/PageDeployGauge/DeployMainnet.tsx:64 msgid "Connect to Ethereum in order to deploy gauge." msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:84 +#: src/components/PageDeployGauge/DeploySidechain.tsx:75 msgid "Connect to Ethereum in order to deploy mirror gauge." msgstr "" -#: src/components/FormConnectWallet.tsx:25 -#: src/components/PageCompensation/Page.tsx:90 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:30 +#: src/components/ConnectWallet.tsx:46 +#: src/components/PageCompensation/Page.tsx:77 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:375 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:78 #: src/components/PageCrvLocker/components/FormActions.tsx:23 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:97 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:178 -#: src/components/PagePool/Page.tsx:81 -#: src/components/PagePoolList/index.tsx:245 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:570 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:635 +#: src/components/PagePool/components/TransferActions.tsx:62 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:29 msgid "Connect Wallet" msgstr "" -#: src/components/PagePool/Page.tsx:80 -msgid "Connect wallet to view pool" -msgstr "" - -#: src/components/PagePoolList/index.tsx:244 -msgid "Connect wallet to view pool list" -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:91 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:172 -#: src/components/PagePool/Page.tsx:82 -#: src/components/PagePoolList/index.tsx:246 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:564 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:629 msgid "Connecting" msgstr "" -#: src/components/PageCreatePool/index.tsx:174 +#: src/components/PageCreatePool/index.tsx:113 msgid "Connecting to network" msgstr "" #: src/components/PageCreatePool/Parameters/index.tsx:268 #: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#~ msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" -#~ msgstr "" +msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" +msgstr "" #: src/domain/create-pool/confirm-modal/index.tsx:318 #: src/domain/create-pool/summary/index.tsx:146 #~ msgid "Contains rebasing tokens:" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:25 -#: src/layout/default/Footer.tsx:118 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:23 +#: src/layout/default/Footer.tsx:114 msgid "Contracts" msgstr "" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:53 -msgid "Copy address" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:59 -msgid "Counterparty Risk" -msgstr "" - #: src/domain/create-pool/index.tsx:82 #~ msgid "CREATE CURVE POOL" #~ msgstr "" @@ -692,23 +567,19 @@ msgstr "" #~ msgid "Create lock spending approved" #~ msgstr "" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:42 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:47 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:121 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:145 -#: src/components/PageCreatePool/Page.tsx:31 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:383 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:388 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:218 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:248 +#: src/components/PageCreatePool/Page.tsx:28 msgid "Create Pool" msgstr "" -#: src/components/PagePoolList/index.tsx:105 -msgid "Cross-chain" -msgstr "" - #: src/components/PageCrvLocker/components/FieldLockedAmt.tsx:42 msgid "CRV Avail." msgstr "" -#: src/components/PageDashboard/components/FormVecrv.tsx:188 +#: src/components/PageDashboard/components/FormVecrv.tsx:181 msgid "CRV locked:" msgstr "" @@ -716,29 +587,27 @@ msgstr "" msgid "CRV Locked: {0}" msgstr "" -#: src/components/PageCrvLocker/Page.tsx:74 -#: src/components/PageCrvLocker/Page.tsx:78 +#: src/components/PageCrvLocker/Page.tsx:75 +#: src/components/PageCrvLocker/Page.tsx:79 msgid "CRV Locker" msgstr "" -#: src/components/PoolRewardsCrv.tsx:96 +#: src/components/PoolRewardsCrv.tsx:73 msgid "CRV LP reward annualized (max tAPR can be reached with max boost of 2.50)" msgstr "" -#: src/components/PageDashboard/index.tsx:58 +#: src/components/PageDashboard/index.tsx:69 msgid "CRV Profits" msgstr "" -#: src/components/PagePoolList/index.tsx:101 +#: src/components/PagePoolList/index.tsx:107 +#: src/layout/default/Header.tsx:120 +#: src/layout/default/HeaderMobile.tsx:143 msgid "crvUSD" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:93 -msgid "crvUSD has been claimed and sent to your wallet." -msgstr "" - -#: src/components/PageCreatePool/constants.ts:103 -#: src/components/PagePoolList/index.tsx:103 +#: src/components/PageCreatePool/constants.ts:87 +#: src/components/PagePoolList/index.tsx:109 msgid "Crypto" msgstr "" @@ -746,7 +615,7 @@ msgstr "" #~ msgid "Crypto collateralized stablecoin" #~ msgstr "" -#: src/components/PageCreatePool/constants.ts:78 +#: src/components/PageCreatePool/constants.ts:74 msgid "Crypto Collateralized Stablecoins" msgstr "" @@ -755,41 +624,30 @@ msgstr "" #~ msgid "Crypto Share" #~ msgstr "" -#: src/components/PagePool/index.tsx:219 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:13 +#: src/components/PagePool/index.tsx:201 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:11 msgid "CRYPTO V2" msgstr "" -#: src/layout/default/Header.tsx:71 +#: src/layout/default/HeaderMobile.tsx:225 +#: src/layout/default/HeaderSecondary.tsx:66 msgid "Crypto Volume Share" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:110 -msgid "Cryptocurrencies and ERC20 tokens have historically exhibited significant price volatility. They can experience rapid and substantial fluctuations in value, which may occur within short periods of time. The market value of any token may rise or fall, and there is no guarantee of any specific price stability." -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:44 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 +#: src/components/PageCreatePool/PoolType/index.tsx:42 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Cryptoswap" msgstr "" -#: src/components/PageCreatePool/PoolType/index.tsx:50 +#: src/components/PageCreatePool/PoolType/index.tsx:48 msgid "Cryptoswap pools are currently unavailable on this chain" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:70 -msgid "Cryptoswap pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:103 -msgid "CryptoSwap V2 pools" -msgstr "" - -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:38 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:40 msgid "Currency reserves" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:124 +#: src/components/PagePool/UserDetails/index.tsx:127 msgid "Current Boost:" msgstr "" @@ -797,158 +655,95 @@ msgstr "" msgid "Current unlock date:" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:20 -msgid "Curve Pool Risk Disclosures for Liquidity Providers" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:63 -msgid "Curve pool smart contracts are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and liquidity providers always retain full control of their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:44 -msgid "Curve relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. It is essential for users to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:48 -msgid "Curve smart contracts have undergone multiple audits by reputable firms including Trail of Bits, MixBytes, QuantStamp, and ChainSecurity to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:31 -msgid "Curve Whitepapers" -msgstr "" - -#: src/components/AdvancedSettings.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:358 +#: src/components/AdvancedSettings.tsx:195 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:357 msgid "Custom" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:39 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:33 msgid "Daily" msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:63 +#: src/components/PageDashboard/components/Summary.tsx:64 msgid "Daily Profits" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:57 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:69 msgid "Daily USD volume:" msgstr "" -#: src/layout/default/Header.tsx:70 +#: src/layout/default/HeaderMobile.tsx:216 +#: src/layout/default/HeaderSecondary.tsx:58 msgid "Daily Volume" msgstr "" #: src/layout/default/HeaderMobile.tsx:163 #: src/layout/default/HeaderSecondary.tsx:82 -#~ msgid "DAO" -#~ msgstr "" +msgid "DAO" +msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:24 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:20 msgid "DAO fee:" msgstr "" -#: src/components/PageDashboard/Page.tsx:34 -#: src/layout/default/Header.tsx:79 -#: src/layout/default/Header.tsx:86 +#: src/components/PageDashboard/Page.tsx:32 +#: src/layout/default/Header.tsx:34 msgid "Dashboard" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:200 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:86 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:646 #: src/components/PageDeployGauge/Page.tsx:28 msgid "Deploy Gauge" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:36 +#: src/components/PageDeployGauge/ProcessSummary.tsx:35 msgid "Deploy gauge on sidechain" msgstr "" -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Mainnet Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:146 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:603 msgid "Deploy Mirror Gauge" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:67 +#: src/components/PageDeployGauge/ProcessSummary.tsx:55 msgid "Deploy mirror gauge on Ethereum using the same sidechain LP token address" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:140 -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:598 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Sidechain Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:205 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:91 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:651 msgid "Deploying Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:215 -#: src/store/createDeployGaugeSlice.ts:252 -#: src/store/createDeployGaugeSlice.ts:289 -#: src/store/createDeployGaugeSlice.ts:326 -#: src/store/createDeployGaugeSlice.ts:362 -msgid "Deploying gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:158 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:615 msgid "Deploying Mirror Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:611 -#: src/store/createDeployGaugeSlice.ts:650 -#: src/store/createDeployGaugeSlice.ts:689 -#: src/store/createDeployGaugeSlice.ts:728 -#: src/store/createDeployGaugeSlice.ts:764 -msgid "Deploying mirror gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/ProcessSummary.tsx:72 -msgid "Deploying mirror gauge..." -msgstr "" - -#: src/store/createCreatePoolSlice.ts:836 -#: src/store/createCreatePoolSlice.ts:917 -#: src/store/createCreatePoolSlice.ts:1015 -#: src/store/createCreatePoolSlice.ts:1086 -#: src/store/createCreatePoolSlice.ts:1175 -#: src/store/createCreatePoolSlice.ts:1254 -msgid "Deploying pool {poolName}..." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:201 -msgid "Deploying Pool {poolName}..." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:152 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:609 msgid "Deploying Sidechain Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:408 -#: src/store/createDeployGaugeSlice.ts:446 -#: src/store/createDeployGaugeSlice.ts:484 -#: src/store/createDeployGaugeSlice.ts:522 -#: src/store/createDeployGaugeSlice.ts:560 -msgid "Deploying sidechain gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/ProcessSummary.tsx:40 -msgid "Deploying sidechain gauge..." -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 -#: src/components/PagePool/Deposit/index.tsx:35 -#: src/components/PagePool/index.tsx:196 -#: src/components/PagePoolList/components/TableRowMobile.tsx:159 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 +#: src/components/PagePool/Deposit/index.tsx:34 +#: src/components/PagePool/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:165 msgid "Deposit" msgstr "" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 -#: src/components/PagePool/Deposit/index.tsx:37 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 +#: src/components/PagePool/Deposit/index.tsx:36 msgid "Deposit & Stake" msgstr "" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 msgid "Deposit & Stake Complete" msgstr "" @@ -956,11 +751,11 @@ msgstr "" #~ msgid "Deposit & Stake Failed" #~ msgstr "" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:109 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 msgid "Deposit and staked {tokenText}" msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 msgid "Deposit Complete" msgstr "" @@ -980,35 +775,31 @@ msgstr "" #~ msgid "Deposited {tokenText}, received {receivedLpTokens} LP Tokens" #~ msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:106 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:103 msgid "Deposited {tokenText}." msgstr "" #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Desc" -#~ msgstr "" +msgid "Desc" +msgstr "" -#: src/layout/default/Footer.tsx:113 +#: src/layout/default/Footer.tsx:137 msgid "Developer Docs" msgstr "" -#: src/components/PagePoolList/index.tsx:276 +#: src/components/PagePoolList/index.tsx:261 msgid "Didn't find what you're looking for?" msgstr "" -#: src/components/AdvancedSettings.tsx:145 +#: src/components/AdvancedSettings.tsx:136 msgid "Discard" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:142 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "" - -#: src/layout/default/Footer.tsx:52 +#: src/layout/default/Footer.tsx:47 msgid "Dodo" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:272 +#: src/components/PageCreatePool/Parameters/index.tsx:261 msgid "Dollar prices are fetched from coingecko." msgstr "" @@ -1017,45 +808,36 @@ msgstr "" #~ msgstr "" #: src/layout/default/Footer.tsx:132 -#~ msgid "Donate" -#~ msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:128 -msgid "Due to composability within DeFi, it is possible for assets in Curve pools to be receipt tokens for deposits in third party lending platforms. Composability of this sort can amplify yields for liquidity providers, but it also exposes users to additional risks associated with the underlying lending protocol. Users interacting with pools that involve lending assets should be mindful of this additional risk and conduct due diligence on the associated lending protocol." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:119 -msgid "Due to the permissionless pool factory and the absence of strict onboarding criteria, not every token included in Curve pools undergoes a detailed independent risk assessment. Curve pools may contain unvetted tokens that have uncertain value or potential fraudulent characteristics. The presence of unvetted tokens introduces potential risks, including exchange rate volatility, smart contract vulnerabilities, liquidity risks, and other unforeseen circumstances that could result in the loss of funds or other adverse consequences." +msgid "Donate" msgstr "" #: src/domain/dialogs/dialog-waves-provider.tsx:21 #~ msgid "Email" #~ msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:212 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:140 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:134 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:101 msgid "ERC4626" msgstr "" #: src/components/Page404/Page.tsx:11 #: src/pages/404.tsx:11 -#~ msgid "Error 404" -#~ msgstr "" +msgid "Error 404" +msgstr "" #: src/components/PagePool/components/DetailInfoEstTokens.tsx:18 msgid "Estimated Received:" msgstr "" -#: src/components/DetailInfoEstGas.tsx:84 +#: src/components/DetailInfoEstGas.tsx:78 msgid "Estimated TX cost:" msgstr "" #: src/layout/default/Footer.tsx:109 -#~ msgid "Events" -#~ msgstr "" +msgid "Events" +msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "Exchange rate" msgstr "" @@ -1063,57 +845,49 @@ msgstr "" #~ msgid "Exchange rate is too low!" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:231 -msgid "existing pools" -msgstr "" - -#: src/components/PagePool/index.tsx:251 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:261 +#: src/components/PagePool/index.tsx:227 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:221 msgid "Expand chart" msgstr "" -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:46 -msgid "Expected CRV tAPR:" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:53 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:47 msgid "EYWA fee:" msgstr "" #: src/hooks/usePoolAlert.tsx:91 -#~ msgid "EYWA Links:" -#~ msgstr "" +msgid "EYWA Links:" +msgstr "" #: src/components/PagePoolList/components/TableCellFactory.tsx:15 -#~ msgid "Factory" -#~ msgstr "" +msgid "Factory" +msgstr "" #: src/components/PagePool/index.tsx:210 -#~ msgid "FACTORY" -#~ msgstr "" +msgid "FACTORY" +msgstr "" #: src/components/PagePoolList/components/TableCellFactory.tsx:14 -#~ msgid "Factory pools are permissionless, deployed by anyone." -#~ msgstr "" +msgid "Factory pools are permissionless, deployed by anyone." +msgstr "" #: src/layout/default/Footer.tsx:134 #~ msgid "FAQ" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:369 +#: src/components/PageCreatePool/Parameters/index.tsx:364 msgid "Fee Gamma ({0} - {1})" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:274 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 msgid "Fee Gamma:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:84 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:91 msgid "Fee:" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:218 +#: src/components/PageCreatePool/Parameters/index.tsx:207 msgid "Fees" msgstr "" @@ -1121,7 +895,7 @@ msgstr "" #~ msgid "Fiat Redeemable Stablecoin" #~ msgstr "" -#: src/components/PageCreatePool/constants.ts:66 +#: src/components/PageCreatePool/constants.ts:62 msgid "Fiat Redeemable Stablecoins" msgstr "" @@ -1129,44 +903,40 @@ msgstr "" #~ msgid "Filter by" #~ msgstr "" -#: src/components/PageCreatePool/constants.ts:218 +#: src/components/PageCreatePool/constants.ts:186 msgid "For pools containing native {0} (represented as 0xEE…EE)" msgstr "" -#: src/components/PageCreatePool/constants.ts:206 +#: src/components/PageCreatePool/constants.ts:174 msgid "For pools that supports any major ERC20 return implementation (”return True / revert”, “return None / revert”, “return True / return False”), and any number of decimal places up to 18" msgstr "" -#: src/components/PageCreatePool/constants.ts:212 +#: src/components/PageCreatePool/constants.ts:180 msgid "For pools with rebase tokens like aTokens, or where there's a fee-on-transfer." msgstr "" -#: src/components/PageCreatePool/constants.ts:119 +#: src/components/PageCreatePool/constants.ts:103 msgid "Forex" msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:90 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:66 msgid "Function (e.g exchangeRate())" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:168 -msgid "Function ID:" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:90 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:163 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:76 msgid "Function:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:44 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:42 msgid "Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:196 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:95 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:642 msgid "Gauge Deployed Successfully" msgstr "" -#: src/components/PageDeployGauge/index.tsx:131 +#: src/components/PageDeployGauge/index.tsx:136 msgid "Gauge deployment is not supported on this network." msgstr "" @@ -1175,23 +945,23 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/ConfirmModal/index.tsx:290 -#~ msgid "Go to deploy sidechain gauge" -#~ msgstr "" +msgid "Go to deploy sidechain gauge" +msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:173 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:297 msgid "Go to pool" msgstr "" #: src/layout/default/HeaderMobile.tsx:164 #: src/layout/default/HeaderSecondary.tsx:83 -#~ msgid "Governance" -#~ msgstr "" +msgid "Governance" +msgstr "" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:123 +#: src/components/ComboBoxSelectToken/index.tsx:136 msgid "Hide tokens from very small pools" msgstr "" -#: src/components/PagePoolList/index.tsx:224 +#: src/components/PagePoolList/index.tsx:220 msgid "Hide very small pools" msgstr "" @@ -1203,31 +973,14 @@ msgstr "" #~ msgid "High price impact warning!<0/>Swap will have {0}% price impact." #~ msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "High price impact:" msgstr "" -#: src/components/PagePool/components/WarningModal.tsx:65 +#: src/components/PagePool/components/WarningModal.tsx:56 msgid "High slippage!<0/>{0} will have {1}% loss." msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:87 -msgid "If the token fails to regain its peg, liquidity providers will encounter losses proportional to the severity of the depeg. The potential permanent loss highlights the importance of thorough consideration and caution when participating in activities involving stablecoins and/or derivative assets." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:51 -msgid "Immutability and Irreversibility of Transactions:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:90 -msgid "Impermanent Loss:" -msgstr "" - -#: src/components/PageDashboard/index.tsx:55 -#: src/components/PagePoolList/Page.tsx:57 -msgid "Incentives" -msgstr "" - #: src/components/PageCrvLocker/index.tsx:28 msgid "Increase Amount" msgstr "" @@ -1241,7 +994,7 @@ msgstr "" msgid "Increase Lock Amount" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:266 +#: src/components/PageCreatePool/Parameters/index.tsx:255 msgid "Initial Liquidity Concentration Price" msgstr "" @@ -1249,26 +1002,25 @@ msgstr "" #~ msgid "Initial Price" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:77 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:75 msgid "Initial Price {0}" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:63 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:71 msgid "Initial Price B:" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:278 +#: src/components/PageCreatePool/Parameters/index.tsx:273 msgid "Initial price can't be 0. The price fetch didn't return a price. Please enter the token dollar price manually in the input." msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:46 msgid "Initial Price{0}:" msgstr "" #: src/components/PageIntegrations/Page.tsx:38 -#: src/layout/default/Footer.tsx:126 -#: src/layout/default/Header.tsx:80 -#: src/layout/default/Header.tsx:88 +#: src/layout/default/Footer.tsx:127 +#: src/layout/default/Header.tsx:35 msgid "Integrations" msgstr "" @@ -1276,21 +1028,16 @@ msgstr "" msgid "Invalid date" msgstr "" -#: src/components/PagePoolList/index.tsx:278 +#: src/components/PagePoolList/index.tsx:263 msgid "Join the Telegram" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:204 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:38 -msgid "Last change occurred between {0} and {1}, when A ramped from {initial_A} to {future_A}." -msgstr "" - -#: src/components/PageDeployGauge/InfoBox.tsx:25 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:60 +#: src/components/PageDeployGauge/InfoBox.tsx:26 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 msgid "Learn more" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:139 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:136 msgid "Learn more about Boosting your CRV rewards" msgstr "" @@ -1306,56 +1053,43 @@ msgstr "" #~ msgid "Learn more about V2 pools" #~ msgstr "" -#: src/components/PageCreatePool/index.tsx:213 +#: src/components/PageCreatePool/index.tsx:152 msgid "Learn more: Creating Cryptoswap pools" msgstr "" -#: src/components/PageCreatePool/index.tsx:209 +#: src/components/PageCreatePool/index.tsx:148 msgid "Learn more: Creating Stableswap pools" msgstr "" -#: src/components/PageCreatePool/index.tsx:225 +#: src/components/PageCreatePool/index.tsx:164 msgid "Learn more: Read about Cryptoswap parameters" msgstr "" -#: src/components/PageCreatePool/index.tsx:221 +#: src/components/PageCreatePool/index.tsx:160 msgid "Learn more: Understanding Cryptoswap" msgstr "" -#: src/components/PageCreatePool/index.tsx:233 +#: src/components/PageCreatePool/index.tsx:172 msgid "Learn more: Understanding Stableswap" msgstr "" #: src/components/PageCreatePool/components/InfoBox.tsx:28 #: src/components/PageCreatePool/components/InfoBox.tsx:34 -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:79 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:218 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:65 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:140 msgid "Link to address" msgstr "" -#: src/components/PageCreatePool/constants.ts:90 -#: src/components/PageCreatePool/constants.ts:151 -msgid "Liquid Restaking Tokens" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:135 +#: src/components/PageCreatePool/constants.ts:119 msgid "Liquid Staking Derivatives" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:61 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:62 msgid "Liquidity" msgstr "" -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:20 -msgid "Liquidity providers in this pool also earn additional tokens!" -msgstr "" - -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:19 -msgid "Liquidity providers in this pool also earn points!" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:63 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:72 msgid "Liquidity utilization:" msgstr "" @@ -1363,8 +1097,9 @@ msgstr "" #~ msgid "Llama Airforce" #~ msgstr "" -#: src/components/FormConnectWallet.tsx:29 #: src/components/PageCrvLocker/components/FormActions.tsx:27 +#: src/components/PagePool/components/TransferActions.tsx:66 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:35 msgid "Loading" msgstr "" @@ -1392,24 +1127,24 @@ msgstr "" msgid "Lock Increased" msgstr "" -#: src/components/PageDashboard/components/FormVecrv.tsx:191 +#: src/components/PageDashboard/components/FormVecrv.tsx:184 msgid "Locked until:" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:178 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:139 msgid "LP Token ({0})" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:175 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:142 msgid "LP Token (USD)" msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:118 +#: src/components/PageDeployGauge/DeploySidechain.tsx:109 msgid "LP Token Address" msgstr "" #: src/components/PagePool/components/FieldLpToken.tsx:42 -#: src/components/PagePool/UserDetails/index.tsx:99 +#: src/components/PagePool/UserDetails/index.tsx:102 msgid "LP Tokens" msgstr "" @@ -1417,19 +1152,11 @@ msgstr "" msgid "LP Tokens Avail." msgstr "" -#: src/store/createDeployGaugeSlice.ts:227 -#: src/store/createDeployGaugeSlice.ts:264 -#: src/store/createDeployGaugeSlice.ts:301 -#: src/store/createDeployGaugeSlice.ts:338 -#: src/store/createDeployGaugeSlice.ts:374 -msgid "Mainnet gauge deployment successful." -msgstr "" - #: src/components/input-comp/input-max-button.tsx:35 #~ msgid "MAX" #~ msgstr "" -#: src/components/AdvancedSettings.tsx:166 +#: src/components/AdvancedSettings.tsx:157 msgid "Max Slippage" msgstr "" @@ -1437,11 +1164,11 @@ msgstr "" #~ msgid "MAX*" #~ msgstr "" -#: src/components/AdvancedSettings.tsx:168 +#: src/components/AdvancedSettings.tsx:159 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:107 msgid "Measures pool growth; this is not a dollar value" msgstr "" @@ -1449,16 +1176,12 @@ msgstr "" #~ msgid "MetaMask" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:99 -msgid "Metapool" -msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:250 +#: src/components/PageCreatePool/Parameters/index.tsx:239 msgid "Mid fee governs fees charged during low volatility." msgstr "" #: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:30 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:181 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:53 msgid "Mid Fee:" msgstr "" @@ -1467,22 +1190,18 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/Parameters/index.tsx:230 -#~ msgid "Mid Fee: ({0} - {1}%)" -#~ msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:241 -msgid "Mid Fee: ({0}% - {1}%)" +msgid "Mid Fee: ({0} - {1}%)" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:72 +#: src/components/PagePool/UserDetails/index.tsx:75 msgid "min. CRV tAPR %" msgstr "" -#: src/components/AdvancedSettings.tsx:117 +#: src/components/AdvancedSettings.tsx:111 msgid "Min. slippage is {MIN_SLIPPAGE}%" msgstr "" -#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:40 +#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:42 msgid "Minimum LP Tokens:" msgstr "" @@ -1490,56 +1209,48 @@ msgstr "" #~ msgid "Minter" #~ msgstr "" -#: src/store/createDeployGaugeSlice.ts:623 -#: src/store/createDeployGaugeSlice.ts:662 -#: src/store/createDeployGaugeSlice.ts:701 -#: src/store/createDeployGaugeSlice.ts:740 -#: src/store/createDeployGaugeSlice.ts:776 -msgid "Mirror gauge deployment successful." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:125 -#: src/components/PageDeployGauge/ProcessSummary.tsx:79 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:584 +#: src/components/PageDeployGauge/ProcessSummary.tsx:61 msgid "Mirror gauge successfully deployed" msgstr "" #: src/layout/default/HeaderMobile.tsx:146 -#~ msgid "Mode" -#~ msgstr "" +msgid "Mode" +msgstr "" #: src/layout/default/HeaderMobile.tsx:154 -#~ msgid "More" -#~ msgstr "" +msgid "More" +msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:318 -#: src/components/PageCreatePool/Parameters/index.tsx:391 +#: src/components/PageCreatePool/Parameters/index.tsx:313 +#: src/components/PageCreatePool/Parameters/index.tsx:386 msgid "Moving Average Time ({0} - {1}) seconds" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:123 #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:57 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:286 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:124 msgid "Moving Average Time:" msgstr "" -#: src/components/PagePoolList/index.tsx:106 +#: src/components/PagePoolList/index.tsx:111 msgid "My Pools" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:37 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:59 msgid "Name:" msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:93 +#: src/components/PageDeployGauge/DeploySidechain.tsx:84 msgid "Network:" msgstr "" -#: src/layout/default/Footer.tsx:146 +#: src/layout/default/Footer.tsx:142 msgid "News" msgstr "" -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Next" msgstr "" @@ -1553,27 +1264,23 @@ msgstr "" #~ msgid "No A value set" #~ msgstr "" -#: src/components/PageDashboard/index.tsx:161 +#: src/components/PageDashboard/index.tsx:166 msgid "No active pool found for" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:73 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 msgid "No address set" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:78 msgid "No asset type set" msgstr "" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:212 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:213 msgid "No claimable rewards" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:84 -msgid "No controller data found." -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:92 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:78 msgid "No function set" msgstr "" @@ -1584,19 +1291,19 @@ msgstr "" #~ msgid "No initial price set" #~ msgstr "" -#: src/components/PageIntegrations/index.tsx:130 +#: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:39 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:61 msgid "No name set" msgstr "" -#: src/components/PagePoolList/index.tsx:283 +#: src/components/PagePoolList/index.tsx:268 msgid "No pool found for \"{0}\". Feel free to search other tabs, or" msgstr "" -#: src/components/PagePoolList/index.tsx:290 +#: src/components/PagePoolList/index.tsx:275 msgid "No pool found in this category" msgstr "" @@ -1615,39 +1322,32 @@ msgstr "" #~ msgid "No swap fee set" #~ msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:47 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:69 msgid "No symbol set" msgstr "" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:148 -msgid "No token found for \"{filterValue}\"" -msgstr "" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:278 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:235 msgid "No token found for address {0}" msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:76 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:69 msgid "No tokens selected" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:77 -msgid "No trades data found." -msgstr "" - -#: src/components/PageDashboard/components/TableRow.tsx:89 +#: src/components/PageDashboard/components/TableRow.tsx:92 msgid "None" msgstr "" #: src/components/PagePool/Swap/index.tsx:396 -#~ msgid "Not enough balance for {0}" -#~ msgstr "" - -#: src/store/createPoolDepositSlice.ts:279 -msgid "Not enough balance for {amountsError}." +msgid "Not enough balance for {0}" msgstr "" -#: src/components/PagePool/Deposit/components/FormStake.tsx:206 +#: src/domain/transfer/deposit/form-deposit/index.tsx:95 +#: src/domain/transfer/deposit/form-deposit-stake/index.tsx:96 +#~ msgid "Not enough balance for {amountsError}." +#~ msgstr "" + +#: src/components/PagePool/Deposit/components/FormStake.tsx:198 msgid "Not enough LP Tokens balances." msgstr "" @@ -1699,15 +1399,15 @@ msgstr "" msgid "Nudging and Claiming" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "of pool" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 msgid "Off Peg Multiplier:" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:310 +#: src/components/PageCreatePool/Parameters/index.tsx:305 msgid "Offpeg Fee Multiplier ({0} - {1})" msgstr "" @@ -1715,47 +1415,34 @@ msgstr "" msgid "Offpeg Fee Multiplier:" msgstr "" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:351 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:350 msgid "One coin" msgstr "" -#: src/components/PageDeployGauge/InfoBox.tsx:17 +#: src/components/PageDeployGauge/InfoBox.tsx:18 msgid "Only admin/manager can set reward token, set reward token distributor address." msgstr "" -#: src/components/PageCreatePool/constants.ts:222 +#: src/components/PageCreatePool/constants.ts:190 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:44 msgid "Optimised" msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:210 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:130 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:85 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:132 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:91 msgid "Oracle" msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:83 -msgid "Oracle address needs to be 42 characters long." -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:80 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 msgid "Oracle address needs to start with '0x'." msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 -msgid "Oracle Address:" -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:93 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:69 msgid "Oracle function name needs to end with '()'." msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:95 -msgid "Oracle must have a precision of 18 decimals." -msgstr "" - -#: src/components/PagePool/index.tsx:220 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:14 +#: src/components/PagePool/index.tsx:202 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:12 msgid "OTHER" msgstr "" @@ -1763,21 +1450,17 @@ msgstr "" #~ msgid "Others" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:263 +#: src/components/PageCreatePool/Parameters/index.tsx:252 msgid "Out fee governs fees charged during high volatility." msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:187 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:59 msgid "Out Fee:" msgstr "" #: src/components/PageCreatePool/Parameters/index.tsx:242 -#~ msgid "Out fee: ({midFee} - {0}%)" -#~ msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:253 -msgid "Out fee: ({midFee}% - {0}%)" +msgid "Out fee: ({midFee} - {0}%)" msgstr "" #: src/domain/create-pool/confirm-modal/index.tsx:366 @@ -1787,39 +1470,37 @@ msgstr "" #~ msgid "Parameters" #~ msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:54 +#: src/components/PageCreatePool/components/Navigation.tsx:106 msgid "PARAMETERS" msgstr "" -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:26 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:47 msgid "Parameters:" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:81 -msgid "Permanent Loss of a Peg:" -msgstr "" - -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:64 +#: src/components/PageDashboard/components/FormClaimFees.tsx:57 msgid "Please approve claim veCRV rewards." msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:90 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:93 -#: src/components/PagePool/Swap/index.tsx:183 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:87 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:88 +#: src/components/PagePool/Swap/index.tsx:179 +#: src/components/PageRouterSwap/index.tsx:206 msgid "Please approve spending your {0}." msgstr "" -#: src/components/PageRouterSwap/index.tsx:211 -msgid "Please approve spending your {fromToken}." -msgstr "" +#: src/domain/quick-swap/index.tsx:278 +#: src/domain/transfer/swap/index.tsx:278 +#~ msgid "Please approve spending your {fromToken}." +#~ msgstr "" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:101 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:52 msgid "Please approve spending your CRV." msgstr "" -#: src/components/PagePool/Deposit/components/FormStake.tsx:59 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:95 +#: src/components/PagePool/Deposit/components/FormStake.tsx:57 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:94 msgid "Please approve spending your LP Tokens." msgstr "" @@ -1835,11 +1516,11 @@ msgstr "" msgid "Please confirm claim of {tokensMessage}" msgstr "" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:99 msgid "Please confirm deposit and staking of {tokenText} LP Tokens at max {maxSlippage}% slippage." msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:101 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:98 msgid "Please confirm deposit of {tokenText} at max {maxSlippage}% slippage." msgstr "" @@ -1863,29 +1544,26 @@ msgstr "" msgid "Please confirm nudge rewards" msgstr "" -#: src/components/PagePool/Deposit/components/FormStake.tsx:69 +#: src/components/PagePool/Deposit/components/FormStake.tsx:67 msgid "Please confirm staking of {0} LP Tokens" msgstr "" -#: src/components/PagePool/Swap/index.tsx:130 +#: src/components/PagePool/Swap/index.tsx:126 +#: src/components/PageRouterSwap/index.tsx:155 msgid "Please confirm swap {fromAmount} {fromToken} for {toToken} at max slippage {maxSlippage}%." msgstr "" -#: src/store/createCreatePoolSlice.ts:793 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:80 msgid "Please confirm to create pool {poolName}." msgstr "" #: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:116 -#~ msgid "Please confirm to deploy gauge for {0}." -#~ msgstr "" - -#: src/store/createDeployGaugeSlice.ts:189 -msgid "Please confirm to deploy gauge for {shortenAddress}." +msgid "Please confirm to deploy gauge for {0}." msgstr "" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:46 -#~ msgid "Please confirm to deploy gauge." -#~ msgstr "" +msgid "Please confirm to deploy gauge." +msgstr "" #: src/components/PagePool/Withdraw/components/FormUnstake.tsx:51 msgid "Please confirm unstaking of {0} LP Tokens" @@ -1899,7 +1577,7 @@ msgstr "" msgid "Please confirm withdraw of {lockedAmount} CRV." msgstr "" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:106 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:105 msgid "Please confirm withdrawal of {0} LP Tokens at max {maxSlippage}% slippage." msgstr "" @@ -1911,15 +1589,15 @@ msgstr "" #~ msgid "Please confirm withdrawal of {lpTokenPayload} LP Tokens." #~ msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:751 +#: src/components/PageCreatePool/TokensInPool/index.tsx:583 msgid "Please connect a wallet to select tokens" msgstr "" -#: src/components/PageDashboard/index.tsx:148 +#: src/components/PageDashboard/index.tsx:153 msgid "Please connect wallet or enter a wallet address to view active pools." msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:28 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:26 msgid "Please select tokens to be able to set initial price" msgstr "" @@ -1931,54 +1609,41 @@ msgstr "" #~ msgid "Please switch your wallet's network to" #~ msgstr "" -#: src/components/PagePoolList/Page.tsx:60 -msgid "Points" -msgstr "" - -#: src/components/PageDashboard/index.tsx:52 -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 -#: src/components/PagePoolList/Page.tsx:54 +#: src/components/PageDashboard/index.tsx:54 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 +#: src/components/PagePoolList/Page.tsx:56 msgid "Pool" msgstr "" -#: src/store/createCreatePoolSlice.ts:853 -#: src/store/createCreatePoolSlice.ts:934 -#: src/store/createCreatePoolSlice.ts:1033 -#: src/store/createCreatePoolSlice.ts:1103 -#: src/store/createCreatePoolSlice.ts:1192 -#: src/store/createCreatePoolSlice.ts:1272 -msgid "Pool {poolName} deployment successful." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:163 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:265 msgid "Pool {poolName} was successfully created!" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 msgid "Pool / Token" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:216 msgid "Pool Activity" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:70 +#: src/components/PageDeployGauge/DeployMainnet.tsx:61 msgid "Pool Address" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:16 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:15 msgid "Pool APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:27 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:26 msgid "Pool APY + Interest APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:19 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:18 msgid "Pool APY + Lending APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:22 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:21 msgid "Pool APY + Staking APY" msgstr "" @@ -1986,22 +1651,23 @@ msgstr "" #~ msgid "Pool contains rebasing tokens" #~ msgstr "" -#: src/components/PageCreatePool/index.tsx:180 -#: src/layout/default/Header.tsx:78 -#: src/layout/default/Header.tsx:87 +#: src/components/PageCreatePool/index.tsx:119 +#: src/layout/default/Header.tsx:33 msgid "Pool Creation" msgstr "" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:51 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:70 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:392 msgid "Pool Creation Complete" msgstr "" -#: src/components/PageCreatePool/index.tsx:305 +#: src/components/PageCreatePool/index.tsx:256 msgid "Pool creation is not yet available on this network." msgstr "" -#: src/components/PagePool/index.tsx:123 +#: src/components/PagePool/index.tsx:104 +#: src/components/PagePool/index.tsx:109 +#: src/components/PagePool/index.tsx:114 +#: src/components/PagePool/index.tsx:117 msgid "Pool Details" msgstr "" @@ -2013,12 +1679,11 @@ msgstr "" msgid "Pool Implementation:" msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:67 +#: src/components/PageCreatePool/components/Navigation.tsx:157 msgid "POOL INFO" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 msgid "Pool Info:" msgstr "" @@ -2027,25 +1692,18 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/PoolInfo/index.tsx:30 -#~ msgid "Pool Name (e.g. CRV/ETH)" -#~ msgstr "" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:30 -msgid "Pool Name (e.g. stETH/ETH)" +msgid "Pool Name (e.g. CRV/ETH)" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:152 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:50 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:159 msgid "Pool Parameters" msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:58 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:45 msgid "Pool Parameters Presets" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 -msgid "Pool Parameters:" -msgstr "" - #: src/domain/create-pool/components/navigation.tsx:59 #~ msgid "POOL PRESETS" #~ msgstr "" @@ -2059,7 +1717,7 @@ msgstr "" #~ msgid "POOL SETUP" #~ msgstr "" -#: src/components/PageCreatePool/Summary/index.tsx:27 +#: src/components/PageCreatePool/Summary/index.tsx:40 msgid "Pool Summary" msgstr "" @@ -2068,18 +1726,14 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/PoolInfo/index.tsx:35 -#~ msgid "Pool Symbol (e.g. CRVETH)" -#~ msgstr "" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:35 -msgid "Pool Symbol (e.g. stETHETH)" +msgid "Pool Symbol (e.g. CRVETH)" msgstr "" -#: src/components/PageCreatePool/PoolType/index.tsx:26 +#: src/components/PageCreatePool/PoolType/index.tsx:24 msgid "Pool Type" msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:28 +#: src/components/PageCreatePool/components/Navigation.tsx:40 msgid "POOL TYPE" msgstr "" @@ -2089,139 +1743,92 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:29 -#: src/components/PageDeployGauge/DeployMainnet.tsx:60 -#: src/components/PageDeployGauge/DeploySidechain.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:96 +#: src/components/PageDeployGauge/DeployMainnet.tsx:51 +#: src/components/PageDeployGauge/DeploySidechain.tsx:98 msgid "Pool Type:" msgstr "" -#: src/components/PagePoolList/Page.tsx:114 -#: src/layout/default/Header.tsx:77 -#: src/layout/default/Header.tsx:85 +#: src/components/PagePoolList/Page.tsx:122 +#: src/layout/default/Header.tsx:32 msgid "Pools" msgstr "" #: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#~ msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" -#~ msgstr "" +msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" +msgstr "" #: src/domain/create-pool/tokens-in-pool/index.tsx:757 #~ msgid "Pools with basepools (3Crv, FRAXBP, sbtc2Crv) allow a maximum of 2 tokens" #~ msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:770 -msgid "Pools with basepools allow a maximum of 2 tokens" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:126 -msgid "Pools with Lending Assets:" -msgstr "" - #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:22 #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:27 msgid "Preset:" msgstr "" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Previous" msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:82 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:80 msgid "Price A ({0})" msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:87 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:85 msgid "Price B ({0})" msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:24 msgid "Price change in the market that happens when a trader buys or sells an asset." msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "Price impact:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:298 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:118 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:135 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:125 msgid "Price Oracle:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:317 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:136 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:143 msgid "Price Scale:" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:108 -msgid "Price Volatility:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:23 -msgid "Providing liquidity on Curve doesn't come without risks. Before making a deposit, it is best to research and understand the risks involved." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:92 -msgid "Providing liquidity to Curve pools may expose users to the risk of impermanent loss. Fluctuations in asset prices after supplying to a pool can result in losses when users remove liquidity. Before engaging in liquidity provision activities, users are advised to carefully evaluate the potential for impermanent loss and consider their own risk tolerance." -msgstr "" - #: src/components/layout/default/header.tsx:26 #~ msgid "Quick Swap" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:246 -msgid "Ramp {0} A ends on:" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:202 -#~ msgid "Ramp up A ends on:" -#~ msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:224 -msgid "Ramping {0} A:" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:55 -msgid "Ramping A:" +msgid "Ramp up A ends on:" msgstr "" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:72 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:186 -#~ msgid "Ramping up A:" -#~ msgstr "" +msgid "Ramping up A:" +msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:211 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:135 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:86 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:133 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:96 msgid "Rebasing" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:778 +#: src/components/PageCreatePool/TokensInPool/index.tsx:622 msgid "Rebasing tokens are not supported in {CRYPTOSWAP} pools" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:771 +#: src/components/PageCreatePool/TokensInPool/index.tsx:613 msgid "Rebasing tokens are not supported in this version of Stableswap" msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:130 +#: src/components/PageDashboard/components/Summary.tsx:136 msgid "Recently viewed addresses" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:116 -msgid "Registry:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:134 -msgid "Regulatory Risk" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:136 -msgid "Regulatory Uncertainty:" -msgstr "" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:69 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:68 msgid "Remove" msgstr "" @@ -2229,21 +1836,21 @@ msgstr "" #~ msgid "Remove Liquidity Approved" #~ msgstr "" -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:85 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:102 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:57 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 msgid "Remove token" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:294 +#: src/components/PageCreatePool/Parameters/index.tsx:289 msgid "Reset advanced" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:220 +#: src/components/PageCreatePool/Parameters/index.tsx:209 msgid "Reset Fees" msgstr "" -#: src/layout/default/Footer.tsx:105 -#: src/layout/default/Header.tsx:195 +#: src/layout/default/Footer.tsx:147 +#: src/layout/default/HeaderMobile.tsx:189 msgid "Resources" msgstr "" @@ -2255,75 +1862,55 @@ msgstr "" #~ msgid "Restart Withdraw" #~ msgstr "" -#: src/components/PagePoolList/Page.tsx:55 -msgid "Rewards Base" -msgstr "" - #: src/components/PagePoolList/Page.tsx:57 -#~ msgid "Rewards Base vAPY" -#~ msgstr "" - -#: src/components/PagePoolList/Page.tsx:56 -msgid "Rewards CRV" +msgid "Rewards Base vAPY" msgstr "" #: src/components/PagePoolList/Page.tsx:66 -#~ msgid "Rewards CRV tAPR" -#~ msgstr "" - -#: src/components/PagePoolList/Page.tsx:57 -msgid "Rewards Incentives" +msgid "Rewards CRV tAPR" msgstr "" #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "Rewards Incentives tAPR" -#~ msgstr "" - -#: src/components/PageDashboard/components/TableHead.tsx:72 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:26 -msgid "Rewards tAPR" +msgid "Rewards Incentives tAPR" msgstr "" -#: src/components/PagePoolList/components/TableRowMobile.tsx:134 -msgid "REWARDS tAPR" +#: src/components/PageDashboard/index.tsx:59 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:94 +#: src/components/PagePoolList/Page.tsx:61 +msgid "Rewards tAPR" msgstr "" -#: src/components/PageDashboard/index.tsx:54 +#: src/components/PageDashboard/index.tsx:64 msgid "Rewards tAPR (CRV)" msgstr "" -#: src/components/PageDashboard/index.tsx:55 +#: src/components/PageDashboard/index.tsx:66 msgid "Rewards tAPR (Incentives)" msgstr "" -#: src/components/PageRiskDisclaimer/Page.tsx:28 -msgid "Risk Disclaimer" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:89 msgid "Risks of using {0}" msgstr "" -#: src/components/AdvancedSettings.tsx:158 +#: src/components/AdvancedSettings.tsx:149 msgid "Save" msgstr "" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:191 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:151 msgid "Search by name or paste address" msgstr "" -#: src/components/PagePoolList/index.tsx:189 +#: src/components/PagePoolList/index.tsx:185 msgid "Search by pool name, pool address, token name or token address" msgstr "" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:83 -#: src/components/ComboBoxSelectToken/ComboBox.tsx:84 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:203 +#: src/components/ComboBoxSelectToken/index.tsx:117 +#: src/components/ComboBoxSelectToken/index.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:163 msgid "Search by token name or address" msgstr "" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:261 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:219 msgid "Search generated no results" msgstr "" @@ -2335,12 +1922,12 @@ msgstr "" #~ msgid "Select" #~ msgstr "" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:176 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:136 msgid "Select a token" msgstr "" -#: src/components/PagePool/Swap/index.tsx:371 -#: src/components/PagePool/Swap/index.tsx:454 +#: src/components/PagePool/Swap/index.tsx:366 +#: src/components/PagePool/Swap/index.tsx:449 msgid "Select a Token" msgstr "" @@ -2348,7 +1935,7 @@ msgstr "" #~ msgid "Select date" #~ msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:96 +#: src/components/PageDeployGauge/DeploySidechain.tsx:87 msgid "Select Network" msgstr "" @@ -2356,15 +1943,11 @@ msgstr "" #~ msgid "Select pool asset type tag" #~ msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:68 -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:74 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:55 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:61 msgid "Select preset" msgstr "" -#: src/components/PageIntegrations/components/SelectIntegrationTags.tsx:25 -msgid "Select tag" -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:91 msgid "Select unlock date" msgstr "" @@ -2373,25 +1956,17 @@ msgstr "" msgid "Set pool asset type tag:" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:62 -#: src/components/PageDeployGauge/DeploySidechain.tsx:109 +#: src/components/PageDeployGauge/DeployMainnet.tsx:53 +#: src/components/PageDeployGauge/DeploySidechain.tsx:100 msgid "Set Pool Type" msgstr "" -#: src/components/PageDashboard/components/FormVecrv.tsx:181 +#: src/components/PageDashboard/components/FormVecrv.tsx:174 msgid "share of total" msgstr "" -#: src/store/createDeployGaugeSlice.ts:422 -#: src/store/createDeployGaugeSlice.ts:460 -#: src/store/createDeployGaugeSlice.ts:498 -#: src/store/createDeployGaugeSlice.ts:536 -#: src/store/createDeployGaugeSlice.ts:574 -msgid "Sidechain gauge deployment successful." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:122 -#: src/components/PageDeployGauge/ProcessSummary.tsx:47 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:581 +#: src/components/PageDeployGauge/ProcessSummary.tsx:40 msgid "Sidechain gauge successfully deployed" msgstr "" @@ -2411,89 +1986,58 @@ msgstr "" msgid "Slippage Loss" msgstr "" -#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:14 +#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:18 msgid "Slippage tolerance:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:229 -msgid "Slowly changing {0} A so that it doesn't negatively change virtual price growth of shares" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:59 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:190 msgid "Slowly changing up A so that it doesn't negatively change virtual price growth of shares" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:35 -msgid "Smart Contract Audits" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:42 -msgid "Smart Contract Risk:" -msgstr "" - -#: src/components/PagePoolList/index.tsx:272 +#: src/components/PagePoolList/index.tsx:257 msgid "Sorry, we are unable to load your pools." msgstr "" #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:40 #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:47 -#~ msgid "Sort by" -#~ msgstr "" +msgid "Sort by" +msgstr "" #: src/components/PagePoolList/components/DialogSort/DialogSortMobile.tsx:57 -#~ msgid "Sort By" -#~ msgstr "" +msgid "Sort By" +msgstr "" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Spending Approved" msgstr "" -#: src/components/PagePoolList/index.tsx:104 +#: src/components/PagePoolList/index.tsx:110 msgid "Stable NG" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:83 -msgid "Stablecoins and other derivative assets are designed to maintain a peg to a reference asset. If one of the pool assets drops below its peg, it effectively means that liquidity providers in the pool hold almost all their liquidity in that token. The depegged token may never recover as a result of a technical failure, insolvency, or other adverse situations." -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:31 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:75 +#: src/components/PageCreatePool/PoolType/index.tsx:29 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Stableswap" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:97 -msgid "StableSwap pools" -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:769 -msgid "Stableswap pools allow up to 8 tokens" -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:37 +#: src/components/PageCreatePool/PoolType/index.tsx:35 msgid "Stableswap pools are currently unavailable on this chain" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:76 -msgid "Stableswap-NG" -msgstr "" - -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 -msgid "Stableswap{0}" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 -#: src/components/PagePool/Deposit/index.tsx:36 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 +#: src/components/PagePool/Deposit/index.tsx:35 msgid "Stake" msgstr "" -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 msgid "Stake Complete" msgstr "" @@ -2501,26 +2045,21 @@ msgstr "" #~ msgid "Staked LP Tokens" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:31 -msgid "Staked percent" -msgstr "" - -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "Staked share:" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:101 +#: src/components/PagePool/UserDetails/index.tsx:104 msgid "Staked:" msgstr "" -#: src/components/PagePool/Deposit/index.tsx:121 -#: src/components/PagePool/Deposit/index.tsx:130 +#: src/components/PagePool/Deposit/index.tsx:119 +#: src/components/PagePool/Deposit/index.tsx:128 msgid "Staking is disabled due to inactive Gauge." msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:209 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:125 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:84 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:131 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:86 msgid "Standard" msgstr "" @@ -2528,27 +2067,27 @@ msgstr "" #~ msgid "Stats" #~ msgstr "" -#: src/components/DetailInfoEstGas.tsx:88 +#: src/components/DetailInfoEstGas.tsx:82 msgid "Step {0} of {1}" msgstr "" -#: src/components/PageDeployGauge/index.tsx:94 +#: src/components/PageDeployGauge/index.tsx:93 msgid "Step 1" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:93 +#: src/components/PageDeployGauge/ProcessSummary.tsx:72 msgid "Step 1 and Step 2 must be completed using the same wallet" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:32 +#: src/components/PageDeployGauge/ProcessSummary.tsx:33 msgid "Step 1:" msgstr "" -#: src/components/PageDeployGauge/index.tsx:106 +#: src/components/PageDeployGauge/index.tsx:105 msgid "Step 2" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:62 +#: src/components/PageDeployGauge/ProcessSummary.tsx:52 msgid "Step 2:" msgstr "" @@ -2568,60 +2107,51 @@ msgstr "" #~ msgid "Successfully locked {fetchedLockedAmt}CRV until {fetchedLockedDate}" #~ msgstr "" -#: src/components/PageCreatePool/constants.ts:120 +#: src/components/PageCreatePool/constants.ts:104 msgid "Suitable for forex pairs with low relative volatility" msgstr "" -#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PageCreatePool/constants.ts:120 msgid "Suitable for liquid staking derivatives soft-pegged to its underlying asset." msgstr "" -#: src/components/PageCreatePool/constants.ts:91 -#: src/components/PageCreatePool/constants.ts:152 -msgid "Suitable for LRTs" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:104 +#: src/components/PageCreatePool/constants.ts:88 msgid "Suitable for most volatile pairs such as LDO <> ETH" msgstr "" -#: src/components/PageCreatePool/constants.ts:79 +#: src/components/PageCreatePool/constants.ts:75 msgid "Suitable for stablecoins that are crypto-backed" msgstr "" -#: src/components/PageCreatePool/constants.ts:67 +#: src/components/PageCreatePool/constants.ts:63 msgid "Suitable for stablecoins that are fiat-redeemable" msgstr "" -#: src/components/PageCreatePool/constants.ts:169 +#: src/components/PageCreatePool/constants.ts:137 msgid "Suitable for USD stablecoin <> BTC stablecoin <> ETH." msgstr "" -#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:153 msgid "Suitable for volatile tokens paired against ETH and USD stablecoins" msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:104 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:167 msgid "Summary" msgstr "" -#: src/components/PagePool/index.tsx:198 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PagePoolList/components/TableRowMobile.tsx:165 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/index.tsx:191 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:171 +#: src/components/PageRouterSwap/index.tsx:216 +#: src/components/PageRouterSwap/Page.tsx:112 #: src/components/PageRouterSwap/Page.tsx:116 -#: src/components/PageRouterSwap/Page.tsx:127 -#: src/layout/default/Header.tsx:95 +#: src/layout/default/Header.tsx:31 msgid "Swap" msgstr "" -#: src/components/PageRouterSwap/index.tsx:159 -msgid "swap {fromAmount} {fromToken} for {0} {toToken} at max slippage {maxSlippage}%." -msgstr "" - -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PageRouterSwap/index.tsx:216 msgid "Swap Complete" msgstr "" @@ -2630,11 +2160,7 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/Parameters/index.tsx:215 -#~ msgid "Swap Fee ({0} - {1}%)" -#~ msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:226 -msgid "Swap Fee ({0}% - {1}%)" +msgid "Swap Fee ({0} - {1}%)" msgstr "" #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:32 @@ -2653,24 +2179,24 @@ msgstr "" #~ msgid "Swap type:" #~ msgstr "" -#: src/components/PagePool/Swap/index.tsx:511 +#: src/components/PagePool/Swap/index.tsx:512 msgid "Swap Wrapped" msgstr "" #: src/components/PageRouterSwap/index.tsx:162 -#~ msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" -#~ msgstr "" +msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" +msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:54 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:55 msgid "Swaps" msgstr "" -#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:75 +#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:37 msgid "Switch tokens" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:45 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:67 msgid "Symbol:" msgstr "" @@ -2678,42 +2204,26 @@ msgstr "" msgid "tBTC v1 is in sunset mode: Threshold Network is offering bonds to bring those deprecated v1 out of circulation. Lps in this pool can use those LP tokens to acquire our bonds in <0>https://app.bondprotocol.finance/#/market/1/115" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:40 -msgid "Technology Risk" -msgstr "" - -#: src/layout/default/Footer.tsx:38 +#: src/layout/default/Footer.tsx:33 msgid "Telegram" msgstr "" #: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -#~ msgid "The address needs to be 42 characters long." -#~ msgstr "" - -#: src/components/PageDeployGauge/InfoBox.tsx:12 -msgid "The address that deploys a gauge is set as the gauge admin/manager." +msgid "The address needs to be 42 characters long." msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:70 -msgid "The Curve Emergency Admin is a" +#: src/components/PageDeployGauge/InfoBox.tsx:13 +msgid "The address that deploys a gauge is set as the gauge admin/manager." msgstr "" #: src/domain/create-pool/index.tsx:204 #~ msgid "The Curve pool creation factory is not yet available on this network." #~ msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:67 -msgid "The Curve protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including the implementation of new system contracts and the adjustment of system parameters." -msgstr "" - -#: src/components/PagePool/Swap/index.tsx:558 +#: src/components/PagePool/Swap/index.tsx:478 msgid "The entered amount exceeds the available currency reserves." msgstr "" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:50 -msgid "The expected amount you would like to receive, {0}, will actually be {toAmountOutput}." -msgstr "" - #: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "" @@ -2723,15 +2233,7 @@ msgstr "" #~ msgstr "" #: src/components/PageCreatePool/ConfirmModal/index.tsx:268 -#~ msgid "The next step is to deploy a gauge." -#~ msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:114 -msgid "The overall market dynamics, including price volatility, liquidity fluctuations, and broader economic factors, can impact the value of user funds when providing liquidity. Sudden market movements or unexpected events can result in losses that may be difficult to anticipate or mitigate." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:138 -msgid "The regulatory landscape surrounding blockchain technology, DeFi protocols, tokens, cryptocurrencies, and related activities is constantly evolving, resulting in regulatory uncertainty. The lack of clear and consistent regulations may impact legal obligations, compliance requirements, and potential risks associated with the protocol activities." +msgid "The next step is to deploy a gauge." msgstr "" #: src/hooks/useTokenAlert.tsx:27 @@ -2743,170 +2245,103 @@ msgstr "" #~ msgstr "" #: src/components/PageDashboard/components/FormClaimFees.tsx:68 -#~ msgid "The rewards you claimed are viewable in 3pool." -#~ msgstr "" +msgid "The rewards you claimed are viewable in 3pool." +msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:29 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:25 msgid "The total fee on each trade is split in two parts: one part goes to the pool’s Liquidity Providers, another part goes to the DAO (i.e. Curve veCRV holders)" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:99 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:90 msgid "There was an error fetching the pool activity data." msgstr "" -#: src/components/PagePoolList/components/ChipVolatileBaseApy.tsx:15 -msgid "This is a volatile number that will very likely not persist." -msgstr "" - -#: src/components/PoolRewardsCrv.tsx:48 +#: src/components/PoolRewardsCrv.tsx:43 msgid "This pool has CRV rewards that aren’t currently being distributed.<0/>This pool has a very small amount of rewards waiting to be distributed to it; but since the amount of rewards is very small, the bridge used to send these CRV tokens over is holding onto those tokens until they grow to an amount big enough to be bridged. If this pool continues receiving votes, the amount of tokens to be distributed will grow every Thursday, and eventually unlock and be distributed then." msgstr "" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:218 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:219 msgid "This pool has CRV rewards that aren’t streaming yet. Click ‘Claim CRV’ to resume reward streaming for you and everyone else!" msgstr "" -#: src/components/PoolRewardsCrv.tsx:30 +#: src/components/PoolRewardsCrv.tsx:28 msgid "This pool has CRV rewards that aren’t streaming yet.<0/>Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" msgstr "" -#: src/components/PagePool/components/AlertSeedAmounts.tsx:52 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amount of the other token should be {1}." -msgstr "" - -#: src/components/PagePool/components/AlertSeedAmounts.tsx:54 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amounts of the other tokens should be:" -msgstr "" - #: src/components/PagePool/components/TransferActions.tsx:47 -#~ msgid "This pool is still empty, it should be seeded with the following rate {0}" -#~ msgstr "" +msgid "This pool is still empty, it should be seeded with the following rate {0}" +msgstr "" #: src/components/PagePool/components/TransferActions.tsx:48 -#~ msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." -#~ msgstr "" +msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." +msgstr "" #: src/components/PagePool/components/WarningModal.tsx:71 -#~ msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:69 -#~ msgid "This swap has a high price impact ({0}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:80 -msgid "This swap has a high price impact ({formattedValue}) and low exchange rate ({formattedExchangeRate})." +msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." msgstr "" -#: src/components/PagePool/components/WarningModal.tsx:78 -msgid "This swap has a high price impact ({formattedValue})." +#: src/components/PagePool/components/WarningModal.tsx:69 +msgid "This swap has a high price impact ({0}%)." msgstr "" #: src/components/PagePool/components/WarningModal.tsx:67 -#~ msgid "This swap has a low exchange rate ({0}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:76 -msgid "This swap has a low exchange rate ({formattedExchangeRate})." +msgid "This swap has a low exchange rate ({0}%)." msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:80 -msgid "Three Coin Cryptoswap-NG" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:184 +#: src/components/PageCreatePool/constants.ts:152 msgid "Three Coin Volatile" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:71 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:72 msgid "Time" msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:234 -msgid "to sim)." -msgstr "" - -#: src/components/PageDeployGauge/index.tsx:84 +#: src/components/PageDeployGauge/index.tsx:83 msgid "Toggle between mainnet and sidechain gauge deployment" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:36 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:34 msgid "Token" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:38 -#: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:38 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:36 +#: src/components/PageCreatePool/TokensInPool/index.tsx:510 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:26 msgid "Token A" msgstr "" -#: src/components/PageDashboard/components/TableHead.tsx:73 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:27 -#: src/components/PagePoolList/components/TableRowMobile.tsx:137 +#: src/components/PageDashboard/index.tsx:60 +#: src/components/PagePoolList/Page.tsx:62 msgid "Token APR based on current prices of tokens and reward rates" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 msgid "Token APR based on current prices of tokens and reward rates." msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:41 -#: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:41 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:39 +#: src/components/PageCreatePool/TokensInPool/index.tsx:529 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:29 msgid "Token B" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:44 -#: src/components/PageCreatePool/TokensInPool/index.tsx:642 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:79 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:44 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:42 +#: src/components/PageCreatePool/TokensInPool/index.tsx:550 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:53 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:32 msgid "Token C" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:47 -#: src/components/PageCreatePool/TokensInPool/index.tsx:662 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:62 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 -msgid "Token D" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:50 -#: src/components/PageCreatePool/TokensInPool/index.tsx:682 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:63 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:50 -msgid "Token E" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:53 -#: src/components/PageCreatePool/TokensInPool/index.tsx:702 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:45 +#: src/components/PageCreatePool/TokensInPool/index.tsx:574 #: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 -msgid "Token F" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:56 -#: src/components/PageCreatePool/TokensInPool/index.tsx:722 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:65 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 -msgid "Token G" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 -#: src/components/PageCreatePool/TokensInPool/index.tsx:742 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -msgid "Token H" +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:35 +msgid "Token D" msgstr "" #: src/components/PageCreatePool/TokensInPool/index.tsx:589 -#~ msgid "" -#~ "Tokens appear to be unpegged (>5% deviation from 1:1).\n" -#~ "Consider using Cryptoswap instead." -#~ msgstr "" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:757 msgid "" -"Tokens appear to be unpegged (above 5% deviation from 1:1).\n" +"Tokens appear to be unpegged (>5% deviation from 1:1).\n" "Consider using Cryptoswap instead." msgstr "" @@ -2918,31 +2353,28 @@ msgstr "" #~ msgid "Tokens Approval Failed" #~ msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:63 msgid "TOKENS IN POOL" msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:61 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:58 msgid "Tokens In Pool:" msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:95 +#: src/components/PageDashboard/components/Summary.tsx:96 msgid "Total Balances" msgstr "" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:31 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:32 msgid "Total Daily Profits" msgstr "" -#: src/layout/default/Header.tsx:69 +#: src/layout/default/HeaderMobile.tsx:207 +#: src/layout/default/HeaderSecondary.tsx:50 msgid "Total Deposits" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:20 -msgid "Total LP Tokens staked:" -msgstr "" - -#: src/components/PageDashboard/components/Summary.tsx:159 +#: src/components/PageDashboard/components/Summary.tsx:165 msgid "Total Summary" msgstr "" @@ -2954,27 +2386,21 @@ msgstr "" #~ msgid "trading fees distributed to CRV lockers" #~ msgstr "" -#: src/components/PageDashboard/components/FormClaimFees.tsx:43 +#: src/components/PageDashboard/components/FormClaimFees.tsx:93 msgid "Trading fees distributed to CRV lockers" msgstr "" -#: src/components/PageRouterSwap/index.tsx:168 -msgid "Transaction complete. Received {0} {toToken}." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:204 -#: src/components/PageDeployGauge/ProcessSummary.tsx:53 -#: src/components/PageDeployGauge/ProcessSummary.tsx:85 +#: src/components/PageDeployGauge/ProcessSummary.tsx:43 +#: src/components/PageDeployGauge/ProcessSummary.tsx:64 msgid "Transaction:" msgstr "" -#: src/components/PageCreatePool/constants.ts:168 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:78 -#: src/components/PagePoolList/index.tsx:102 +#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PagePoolList/index.tsx:108 msgid "Tricrypto" msgstr "" -#: src/components/PagePoolList/Page.tsx:58 +#: src/components/PagePoolList/Page.tsx:69 msgid "TVL" msgstr "" @@ -2982,34 +2408,31 @@ msgstr "" #~ msgid "Twitter" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 -msgid "Two Coin Cryptoswap" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:79 -msgid "Two Coin Cryptoswap-NG" -msgstr "" - #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:122 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:165 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:227 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:262 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:301 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:351 -#~ msgid "Tx: {0} created" -#~ msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:34 -msgid "Tx: {poolId} created" +msgid "Tx: {0} created" msgstr "" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:64 -#~ msgid "Tx: Gauge deployed" -#~ msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:106 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:115 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:185 +msgid "Tx: Gauge deployed" +msgstr "" + +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:148 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:184 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:220 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:256 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:294 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:328 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:362 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:396 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:434 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:467 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:500 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:533 msgid "Tx: Gauge for {0} deployed" msgstr "" @@ -3116,28 +2539,24 @@ msgid "Unable to get locked CRV info" msgstr "" #: src/components/AlertFormError.tsx:61 -#: src/components/PageDashboard/index.tsx:154 +#: src/components/PageDashboard/index.tsx:159 msgid "Unable to get pool list" msgstr "" -#: src/store/createUserSlice.ts:90 -msgid "Unable to get pools" -msgstr "" - #: src/components/PagePool/index.tsx:151 -#~ msgid "Unable to get seed initial rate" -#~ msgstr "" +msgid "Unable to get seed initial rate" +msgstr "" #: src/domain/transfer/deposit/form-deposit/index.tsx:191 #: src/domain/transfer/deposit/form-deposit-stake/index.tsx:189 #~ msgid "Unable to get slippage" #~ msgstr "" -#: src/components/DetailInfoEstGas.tsx:105 +#: src/components/DetailInfoEstGas.tsx:98 msgid "Unable to get USD rate" msgstr "" -#: src/components/PagePool/components/TransferActions.tsx:46 +#: src/components/PagePool/components/TransferActions.tsx:58 msgid "Unable to get wallet balances" msgstr "" @@ -3207,7 +2626,7 @@ msgstr "" #~ msgid "Unstaked {lpTokenPayload} LP Tokens" #~ msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:104 +#: src/components/PagePool/UserDetails/index.tsx:107 msgid "Unstaked:" msgstr "" @@ -3215,36 +2634,32 @@ msgstr "" #~ msgid "Unstaking" #~ msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:117 -msgid "Unvetted Tokens:" -msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:268 +#: src/components/PageCreatePool/Parameters/index.tsx:257 msgid "Update Quote" msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:190 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:304 msgid "Upload an icon for a new token" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:175 +#: src/components/PagePool/UserDetails/index.tsx:174 msgid "USD balance" msgstr "" -#: src/components/PageDashboard/index.tsx:57 +#: src/components/PageDashboard/index.tsx:68 msgid "USD Profits" msgstr "" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:58 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:60 msgid "USD total" msgstr "" -#: src/components/PageDashboard/components/SummaryClaimable.tsx:65 -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:71 +#: src/components/PageDashboard/components/SummaryClaimable.tsx:59 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:65 msgid "USD Total" msgstr "" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:61 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:64 msgid "USD total balance updates every ~5 minute" msgstr "" @@ -3252,27 +2667,24 @@ msgstr "" msgid "User rejected action" msgstr "" -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:18 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:16 msgid "V2 pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." msgstr "" -#: src/components/PageDashboard/components/TableHead.tsx:67 -#: src/components/PagePoolList/components/TableHead.tsx:80 -#: src/components/PagePoolList/components/TableHead.tsx:100 +#: src/components/PageDashboard/components/TableHead.tsx:85 +#: src/components/PagePoolList/components/TableHead.tsx:91 +#: src/components/PagePoolList/components/TableHead.tsx:113 msgid "Variable APY based on today's trading activity" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:49 msgid "Variable APY based on today's trading activity." msgstr "" -#: src/components/PageDashboard/components/FormClaimFees.tsx:42 -msgid "veCRV rewards" -msgstr "" - #: src/components/PageDashboard/components/FormClaimFees.tsx:89 -#~ msgid "veCRV rewards: <0>{0} 3CRV" -#~ msgstr "" +msgid "veCRV rewards: <0>{0} 3CRV" +msgstr "" #: src/domain/user-dashboard/components/form-claim-lp-rewards.tsx:95 #~ msgid "veCRV rewards: <0>{claimFeesAmount} 3CRV" @@ -3282,15 +2694,15 @@ msgstr "" #~ msgid "Vesting" #~ msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:122 +#: src/components/PageDashboard/components/Summary.tsx:128 msgid "View address" msgstr "" -#: src/components/PagePoolList/index.tsx:285 +#: src/components/PagePoolList/index.tsx:270 msgid "view all pools." msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:96 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:103 msgid "Virtual price:" msgstr "" @@ -3311,95 +2723,66 @@ msgstr "" #~ msgid "Visit old UI" #~ msgstr "" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:59 -msgid "Visit pool" -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:166 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:295 msgid "Visit the new pool to deposit liquidity." msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:97 +#: src/components/PageDeployGauge/ProcessSummary.tsx:76 msgid "Visit the pool" msgstr "" -#: src/components/PagePoolList/Page.tsx:59 +#: src/components/PagePoolList/Page.tsx:70 msgid "Volume" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 -msgid "Vyper Version:" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:147 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:150 -#: src/components/PagePool/Swap/index.tsx:197 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:160 -#: src/components/PageRouterSwap/index.tsx:226 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:144 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:145 +#: src/components/PagePool/Swap/index.tsx:193 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:159 +#: src/components/PageRouterSwap/index.tsx:221 msgid "Warning!" msgstr "" #: src/components/PageRouterSwap/index.tsx:500 -#~ msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" -#~ msgstr "" +msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" +msgstr "" #: src/components/AlertFormWarning.tsx:22 -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:48 msgid "Warning! Exchange rate is too low!" msgstr "" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:47 -msgid "Warning! High price impact!" -msgstr "" - #: src/components/PageRouterSwap/index.tsx:496 -#~ msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." -#~ msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:40 -msgid "Weekly" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:123 -msgid "When participating as a liquidity provider in any pool, users should carefully assess the tokens' functionality, security audits, team credibility, community feedback, and other relevant factors to make informed decisions and mitigate potential risks associated with the pool assets." +msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:53 -msgid "When you engage in transactions on Ethereum or EVM-compatible blockchains, it is important to understand that these transactions are immutable and irreversible. Once a transaction is confirmed and recorded on the blockchain, it cannot be modified, reversed, or deleted. This means that if a user sends funds to an incorrect address or engage in a fraudulent transaction, it may not be possible to recover the funds. It is crucial to exercise caution, verify transaction details, and use secure wallets to minimize the risk of irreversible transactions." +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:34 +msgid "Weekly" msgstr "" -#: src/layout/default/Footer.tsx:131 +#: src/layout/default/Footer.tsx:97 msgid "Whitepaper" msgstr "" -#: src/layout/default/Footer.tsx:73 +#: src/layout/default/Footer.tsx:68 msgid "Wiki CN" msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:232 -msgid "with similar assets for inspiration (or use" -msgstr "" - #: src/components/AlertSlippage.tsx:24 -msgid "With your current slippage tolerance setting ({0}), the expected output displayed above might incur up to <0>{1} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." +msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." msgstr "" -#: src/components/AlertSlippage.tsx:24 -#~ msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -#~ msgstr "" - -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 #: src/components/PagePool/Withdraw/index.tsx:31 -#: src/components/PagePoolList/components/TableRowMobile.tsx:162 +#: src/components/PagePoolList/components/TableRowMobile.tsx:168 msgid "Withdraw" msgstr "" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw Claim" msgstr "" #: src/components/PageDashboard/components/FormVecrv.tsx:72 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 msgid "Withdraw Complete" msgstr "" @@ -3421,7 +2804,7 @@ msgstr "" #~ msgid "Withdraw Liquidity Approval Failed" #~ msgstr "" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:460 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:459 msgid "Withdraw Wrapped" msgstr "" @@ -3429,7 +2812,7 @@ msgstr "" #~ msgid "Withdraw/ Claim" #~ msgstr "" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw/Claim" msgstr "" @@ -3437,7 +2820,7 @@ msgstr "" #~ msgid "Withdrawing" #~ msgstr "" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:111 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:110 msgid "Withdrew {0} LP Tokens for {tokenText}" msgstr "" @@ -3445,11 +2828,11 @@ msgstr "" #~ msgid "Withdrew {lpTokenPayload} LP Tokens, received {0}" #~ msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:341 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 msgid "Xcp Profit A:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:335 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:172 msgid "Xcp Profit:" msgstr "" @@ -3462,20 +2845,21 @@ msgstr "" msgid "You have a balance in this pool" msgstr "" -#: src/components/PageCrvLocker/components/FormLockDate.tsx:214 +#: src/components/PageCrvLocker/components/FormLockDate.tsx:215 msgid "You have reached the maximum locked date." msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:76 +#: src/components/PagePool/UserDetails/index.tsx:79 msgid "your boost" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:111 -#: src/components/PagePool/UserDetails/index.tsx:116 +#: src/components/PagePool/UserDetails/index.tsx:114 +#: src/components/PagePool/UserDetails/index.tsx:119 msgid "Your CRV Rewards tAPR:" msgstr "" -#: src/components/PagePool/index.tsx:126 +#: src/components/PagePool/index.tsx:105 +#: src/components/PagePool/index.tsx:110 msgid "Your Details" msgstr "" @@ -3483,6 +2867,6 @@ msgstr "" msgid "Your lock has expired, claim your <0>{lockedAmountDisplay} CRV" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:92 +#: src/components/PagePool/UserDetails/index.tsx:95 msgid "Your position" msgstr "" diff --git a/apps/main/src/locales/zh-Hans/messages.po b/apps/main/src/locales/zh-Hans/messages.po index d3d9be14b..1a8055d05 100644 --- a/apps/main/src/locales/zh-Hans/messages.po +++ b/apps/main/src/locales/zh-Hans/messages.po @@ -13,26 +13,26 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/components/PageDashboard/index.tsx:199 +#: src/components/PageDashboard/index.tsx:205 msgid ". Please click on the pool name to view them on" msgstr ". 请点击流动性池的名称到旧UI查看" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "(incl. fees):" msgstr "(包含手续费):" -#: src/components/PageCreatePool/constants.ts:217 -#: src/components/PageCreatePool/constants.ts:223 +#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:191 msgid "(only available for pools with pegged assets)" msgstr "(仅适用于挂钩资产池)" -#: src/components/PageCreatePool/TokensInPool/index.tsx:763 +#: src/components/PageCreatePool/TokensInPool/index.tsx:595 msgid "(Switch)" msgstr "" #: src/components/PageCreatePool/components/InfoBox.tsx:27 #: src/components/PageCreatePool/components/InfoBox.tsx:33 -#: src/components/PageCreatePool/constants.ts:216 +#: src/components/PageCreatePool/constants.ts:184 msgid "{0}" msgstr "{0}" @@ -68,22 +68,18 @@ msgstr "{0}" #~ msgid "{0} deposited and staked approved" #~ msgstr "{0} 存款和质押已通过" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:69 -msgid "{0} is a Cryptoswap pool" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:78 -#~ msgid "{0} is a v2 pool" -#~ msgstr "{0} 是 v2池" +msgid "{0} is a v2 pool" +msgstr "{0} 是 v2池" #: src/domain/create-pool/parameters/initial-price.tsx:33 #: src/domain/create-pool/parameters/initial-price.tsx:42 #~ msgid "{0} price" #~ msgstr "{0} 价格" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:34 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:45 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:57 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:32 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:43 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:55 msgid "{0} price in USD" msgstr "" @@ -115,27 +111,19 @@ msgstr "" #~ msgid "{0} withdraw approved" #~ msgstr "{0} 提款已批准" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:291 -msgid "{filterValue} is a disabled token in Pool Creation" -msgstr "" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:293 -msgid "{filterValue} is a disabled token in this pool configuration." -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:68 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:54 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 msgid "{title} {0} Oracle" msgstr "" -#: src/components/PageDashboard/index.tsx:188 +#: src/components/PageDashboard/index.tsx:194 msgid "*This UI does not support the following pools:" msgstr "当前 UI 不支持以下池" #: src/components/PageDashboard/index.tsx:66 #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "+ Incentives)" -#~ msgstr "+ 其他奖励)" +msgid "+ Incentives)" +msgstr "+ 其他奖励)" #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:18 msgid "1 month" @@ -149,7 +137,7 @@ msgstr "一周" msgid "1 year" msgstr "一年" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:67 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:76 msgid "24h Volume/Liquidity ratio" msgstr "24小时 交易量/流动池存款" @@ -157,18 +145,10 @@ msgstr "24小时 交易量/流动池存款" msgid "3 months" msgstr "三个月" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:92 -msgid "3CRV have been claimed and sent to 3pool." -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:22 msgid "4 years" msgstr "四年" -#: src/components/PageRiskDisclaimer/index.tsx:72 -msgid "5-of-9 multisig" -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:20 msgid "6 months" msgstr "六个月" @@ -177,30 +157,26 @@ msgstr "六个月" #~ msgid "A" #~ msgstr "放大系数" -#: src/components/PageCreatePool/Parameters/index.tsx:301 -#: src/components/PageCreatePool/Parameters/index.tsx:334 +#: src/components/PageCreatePool/Parameters/index.tsx:296 +#: src/components/PageCreatePool/Parameters/index.tsx:329 msgid "A ({0} - {1})" msgstr "放大系数({0} - {1})" -#: src/components/PageCreatePool/constants.ts:224 +#: src/components/PageCreatePool/constants.ts:192 msgid "A more gas-efficient implementation that can be used when every token in the pool has 18 decimals and returns True on success / reverts on error" msgstr "如果池中的每个代币都有18位小数,并在成功时返回True/错误时返回revert,则可以使用更高效的实现方式。" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:75 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:193 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:28 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:83 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:65 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:169 msgid "A:" msgstr "放大系数:" -#: src/components/PageRiskDisclaimer/index.tsx:61 -msgid "Access Control:" -msgstr "" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 msgid "Action" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:41 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:42 msgid "Add" msgstr "" @@ -208,33 +184,28 @@ msgstr "" msgid "Add all coins in a balanced proportion" msgstr "以平衡的比例添加所有代币" -#: src/components/PagePool/components/AddGaugeLink.tsx:58 +#: src/components/PagePool/components/AddGaugeLink.tsx:50 msgid "Add Gauge" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:796 +#: src/components/PageCreatePool/TokensInPool/index.tsx:639 msgid "Add token" msgstr "添加代币" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:146 -#: src/components/PagePoolList/components/TableRowMobile.tsx:149 -msgid "Additional external rewards" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:291 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:280 msgid "Additional slippage tolerance" msgstr "额外的滑点容差" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:291 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:476 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:288 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:475 msgid "Additional slippage tolerance:" msgstr "额外的滑点容差" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:77 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 msgid "Address (e.g 0x123...)" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:57 msgid "Address:" msgstr "" @@ -242,12 +213,12 @@ msgstr "" msgid "Adjust veCrv" msgstr "调整 veCRV" -#: src/components/PageCreatePool/Parameters/index.tsx:380 +#: src/components/PageCreatePool/Parameters/index.tsx:375 msgid "Adjustment Step ({0} - {1})" msgstr "调整步骤 ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:280 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:118 msgid "Adjustment Step:" msgstr "调整步骤:" @@ -255,42 +226,33 @@ msgstr "调整步骤:" #~ msgid "Admin fee" #~ msgstr "管理费用" -#: src/components/PageCreatePool/Parameters/index.tsx:289 -#: src/components/PageCreatePool/Summary/index.tsx:28 -#: src/components/PagePool/index.tsx:129 +#: src/components/PageCreatePool/Parameters/index.tsx:284 +#: src/components/PageCreatePool/Summary/index.tsx:41 +#: src/components/PagePool/index.tsx:106 +#: src/components/PagePool/index.tsx:115 msgid "Advanced" msgstr "高级" -#: src/components/AdvancedSettings.tsx:140 +#: src/components/AdvancedSettings.tsx:131 msgid "Advanced Settings" msgstr "高级设置" -#: src/components/PagePoolList/index.tsx:96 +#: src/components/PagePoolList/index.tsx:102 msgid "ALL" msgstr "全部" -#: src/components/PageCreatePool/Parameters/index.tsx:358 +#: src/components/PageCreatePool/Parameters/index.tsx:353 msgid "Allowed Extra Profit ({0} - {1})" msgstr "允许的额外利润 ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:91 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:268 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:106 msgid "Allowed Extra Profit:" msgstr "允许的额外利润" -#: src/components/PagePool/Swap/index.tsx:402 -#: src/components/PageRouterSwap/index.tsx:431 -msgid "Amount > wallet balance {0}" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:173 -#~ msgid "Amplification coefficient chosen from fluctuation of prices around 1" -#~ msgstr "从1的价格波动中选择出的放大系数" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:200 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:34 -msgid "Amplification coefficient chosen from fluctuation of prices around 1." -msgstr "" +msgid "Amplification coefficient chosen from fluctuation of prices around 1" +msgstr "从1的价格波动中选择出的放大系数" #: src/domain/transfer/withdraw/form-withdraw/withdraw-actions.tsx:311 #~ msgid "Approve Remove Liquidity" @@ -298,12 +260,12 @@ msgstr "" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Approve Spending" msgstr "授权交易" @@ -311,31 +273,11 @@ msgstr "授权交易" #~ msgid "Approving" #~ msgstr "授权中" -#: src/layout/default/Header.tsx:193 -msgid "Apps" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:99 -msgid "are designed to mitigate impermanent loss by pairing assets that are expected to exhibit mean-reverting behavior. This assumption may not hold true in every case, requiring diligent assessment when interacting with these pools." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:105 -msgid "are designed with an internal oracle to concentrate liquidity around the current market price. The algorithm attempts to offset the effects of impermanent loss by calculating fees generated by the pool and ensuring the pool is in profit before re-pegging. Impermanent loss may still occur in CryptoSwap V2 pools, particularly when the earned fees are insufficient to counterbalance the impact of re-pegging. This underscores the need for users to be attentive about the dynamics of these pools when making decisions about liquidity provision." -msgstr "" - -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:48 -msgid "As the number of staked LP Tokens increases, the CRV tAPR will decrease." -msgstr "" - #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Asc" -#~ msgstr "上升" - -#: src/components/PageRiskDisclaimer/index.tsx:79 -msgid "Asset Risk" -msgstr "" +msgid "Asc" +msgstr "上升" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:54 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:76 msgid "Asset Type:" msgstr "资产类别" @@ -347,15 +289,15 @@ msgstr "资产类别" #~ msgid "Audit" #~ msgstr "审计报告" -#: src/layout/default/Footer.tsx:136 +#: src/layout/default/Footer.tsx:102 msgid "Audits" msgstr "审计报告" #: src/components/PagePool/components/FieldToken.tsx:69 -#: src/components/PagePool/Swap/index.tsx:352 -#: src/components/PagePool/Swap/index.tsx:443 -#: src/components/PageRouterSwap/index.tsx:391 -#: src/components/PageRouterSwap/index.tsx:457 +#: src/components/PagePool/Swap/index.tsx:347 +#: src/components/PagePool/Swap/index.tsx:438 +#: src/components/PageRouterSwap/index.tsx:370 +#: src/components/PageRouterSwap/index.tsx:427 msgid "Avail." msgstr "可用的" @@ -367,8 +309,8 @@ msgstr "可用的" #~ msgid "Average value of pool token" #~ msgstr "流动性池中代币的平均价值" -#: src/components/PageDashboard/components/TableRow.tsx:181 -#: src/components/PageDashboard/index.tsx:56 +#: src/components/PageDashboard/components/TableRow.tsx:179 +#: src/components/PageDashboard/index.tsx:67 msgid "Balance" msgstr "余额" @@ -380,7 +322,7 @@ msgstr "投票托管余额" #~ msgid "Balance minus estimated gas" #~ msgstr "余额减去预计的gas费用" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:354 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:353 msgid "Balanced" msgstr "" @@ -388,47 +330,35 @@ msgstr "" #~ msgid "Balanced amounts" #~ msgstr "余额" -#: src/components/PagePool/UserDetails/index.tsx:140 +#: src/components/PagePool/UserDetails/index.tsx:139 msgid "Balanced withdraw amounts" msgstr "平均提款金额" -#: src/components/PageCreatePool/constants.ts:210 +#: src/components/PageCreatePool/constants.ts:178 msgid "Balances" msgstr "余额" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:39 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:40 msgid "Base" msgstr "基础" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:169 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:243 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:205 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:201 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:126 msgid "BASE" msgstr "" -#: src/components/PageDashboard/index.tsx:53 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 -#: src/components/PagePoolList/Page.tsx:55 +#: src/components/PageDashboard/index.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:48 +#: src/components/PagePoolList/Page.tsx:57 msgid "Base vAPY" msgstr "基础 vAPY" -#: src/components/PagePoolList/components/TableRowMobile.tsx:123 -msgid "BASE vAPY" -msgstr "" - -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:42 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:41 msgid "Base vAPY can temporarily be negative when A parameter is ramped down, or crypto pools spend profit to rebalance." msgstr "当放大系数下降或crypto池花费利润在再平衡时,基本 vAPY 可能暂时会显示为负数。" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:100 -msgid "Basepool" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:105 -msgid "Basepool:" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:204 +#: src/components/PageCreatePool/constants.ts:172 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:34 msgid "Basic" msgstr "基础" @@ -437,11 +367,11 @@ msgstr "基础" #~ msgid "Beta" #~ msgstr "Beta" -#: src/components/PageCreatePool/PoolType/index.tsx:32 +#: src/components/PageCreatePool/PoolType/index.tsx:30 msgid "Bonding Curve specialising in pegged assets." msgstr "专用于挂钩资产之间的算法做市曲线" -#: src/components/PageCreatePool/PoolType/index.tsx:45 +#: src/components/PageCreatePool/PoolType/index.tsx:43 msgid "Bonding Curve specialising in unpegged assets." msgstr "专用于非挂钩资产之间的算法做市曲线" @@ -449,7 +379,7 @@ msgstr "专用于非挂钩资产之间的算法做市曲线" msgid "Bonus comes as an advantage from current coin prices which usually appears for coins which are low in balance" msgstr "奖金來自当前币价的优势,通常出现在余额低的代币上" -#: src/layout/default/Footer.tsx:141 +#: src/layout/default/Footer.tsx:119 msgid "Bug Bounty" msgstr "漏洞赏金计划" @@ -457,15 +387,11 @@ msgstr "漏洞赏金计划" #~ msgid "Calc" #~ msgstr "计算" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:228 -msgid "Can't find the pool preset you want? Check out" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:159 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:162 -#: src/components/PagePool/Swap/index.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:172 -#: src/components/PageRouterSwap/index.tsx:237 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:156 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:157 +#: src/components/PagePool/Swap/index.tsx:200 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:171 +#: src/components/PageRouterSwap/index.tsx:232 msgid "Cancel" msgstr "取消" @@ -481,35 +407,35 @@ msgstr "取消" #~ msgid "Change network" #~ msgstr "切换网络" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:249 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:209 msgid "Chart" msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:27 -#: src/components/PageCreatePool/components/Navigation.tsx:39 -#: src/components/PageCreatePool/components/Navigation.tsx:52 -#: src/components/PageCreatePool/components/Navigation.tsx:65 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:130 -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:24 -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:32 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:27 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:59 -#: src/components/PageDeployGauge/ProcessSummary.tsx:46 -#: src/components/PageDeployGauge/ProcessSummary.tsx:78 +#: src/components/PageCreatePool/components/Navigation.tsx:38 +#: src/components/PageCreatePool/components/Navigation.tsx:62 +#: src/components/PageCreatePool/components/Navigation.tsx:105 +#: src/components/PageCreatePool/components/Navigation.tsx:156 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:236 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:46 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:55 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:26 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:57 +#: src/components/PageDeployGauge/ProcessSummary.tsx:39 +#: src/components/PageDeployGauge/ProcessSummary.tsx:60 msgid "Checkmark filled" msgstr "勾选完成" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Chevron left" msgstr "« 左尖括号" -#: src/components/PageCreatePool/components/Navigation.tsx:29 -#: src/components/PageCreatePool/components/Navigation.tsx:42 -#: src/components/PageCreatePool/components/Navigation.tsx:55 -#: src/components/PageCreatePool/components/Navigation.tsx:68 -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:64 +#: src/components/PageCreatePool/components/Navigation.tsx:107 +#: src/components/PageCreatePool/components/Navigation.tsx:158 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Chevron right" msgstr "» 右尖括号" @@ -518,10 +444,6 @@ msgstr "» 右尖括号" #~ msgid "Claim" #~ msgstr "领取" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:56 -msgid "Claim 3CRV" -msgstr "" - #: src/components/PagePool/Withdraw/utils.ts:87 msgid "Claim CRV" msgstr "领取 CRV 领取" @@ -530,20 +452,16 @@ msgstr "领取 CRV 领取" msgid "Claim CRV Complete" msgstr "奖励 CRV 领取 完成" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:57 -msgid "Claim crvUSD" -msgstr "" - #: src/domain/transfer/withdraw/form-claim/index.tsx:149 #~ msgid "Claim Failed" #~ msgstr "奖励领取 失敗" #: src/components/PageDashboard/components/FormClaimFees.tsx:119 -#~ msgid "Claim LP rewards" -#~ msgstr "领取LP奖励" +msgid "Claim LP rewards" +msgstr "领取LP奖励" #: src/components/PagePool/Withdraw/components/FormClaim.tsx:110 -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:246 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:247 #: src/components/PagePool/Withdraw/index.tsx:33 msgid "Claim Rewards" msgstr "领取奖励" @@ -556,9 +474,9 @@ msgstr "奖励领取 完成" #~ msgid "Claim Rewards Failed" #~ msgstr "奖励领取 失敗" -#: src/components/PageDashboard/components/Summary.tsx:64 -#: src/components/PageDashboard/components/TableRow.tsx:176 -#: src/components/PageDashboard/index.tsx:59 +#: src/components/PageDashboard/components/Summary.tsx:65 +#: src/components/PageDashboard/components/TableRow.tsx:174 +#: src/components/PageDashboard/index.tsx:70 msgid "Claimable Tokens" msgstr "未领取奖励" @@ -566,10 +484,6 @@ msgstr "未领取奖励" msgid "Claimed {balance}" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:85 -msgid "Claimed {key}" -msgstr "" - #: src/components/PagePool/Withdraw/utils.ts:82 msgid "Claimed {tokensMessage}" msgstr "领取完成 {tokensMessage}" @@ -584,13 +498,7 @@ msgstr "领取中" #: src/layout/default/HeaderMobile.tsx:162 #: src/layout/default/HeaderSecondary.tsx:79 -#~ msgid "Classic UI" -#~ msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:74 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:81 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:100 -msgid "Clear" +msgid "Classic UI" msgstr "" #: src/domain/transfer/pool-stats/rewards.tsx:45 @@ -601,45 +509,29 @@ msgstr "" #~ msgid "Click here to learn more about Boosting your CRV rewards." #~ msgstr "点击这里了解更多有关如何提升CRV奖励的资料。" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:72 -msgid "Click here to learn more about Cryptoswap pools" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:81 -#~ msgid "Click here to learn more about v2 pools" -#~ msgstr "点击这里了解有关v2池的资料" +msgid "Click here to learn more about v2 pools" +msgstr "点击这里了解有关v2池的资料" -#: src/layout/default/Footer.tsx:44 -#: src/layout/default/Footer.tsx:65 +#: src/layout/default/Footer.tsx:39 +#: src/layout/default/Footer.tsx:60 msgid "CN" msgstr "中文" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:125 -msgid "Coins:" -msgstr "" - -#: src/layout/default/Header.tsx:194 +#: src/layout/default/HeaderMobile.tsx:172 msgid "Community" msgstr "社区" -#: src/components/PageCompensation/Page.tsx:67 -#: src/components/PageCompensation/Page.tsx:71 +#: src/components/PageCompensation/Page.tsx:60 +#: src/components/PageCompensation/Page.tsx:64 msgid "Compensation" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:74 -msgid "composed of Curve community members. It has restricted rights to undertake actions that do not directly impact users' funds, including canceling parameter changes authorized by the DAO and halting CRV emissions to a pool. Early pool implementations included a timelimited function to freeze swaps and deposits in case of emergency, but this precautionary function has since been deprecated in current pool implementations." -msgstr "" - #: src/components/PageCreatePool/ConfirmModal/index.tsx:253 -#~ msgid "Confirm pool setup" -#~ msgstr "确定流动池设定" +msgid "Confirm pool setup" +msgstr "确定流动池设定" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:71 -msgid "Confirm Pool Setup" -msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:89 +#: src/components/PagePool/components/WarningModal.tsx:82 msgid "Confirm warning to proceed." msgstr "确认警告以继续。" @@ -647,76 +539,59 @@ msgstr "确认警告以继续。" #~ msgid "Connect" #~ msgstr "连接" -#: src/components/PageDeployGauge/DeploySidechain.tsx:88 +#: src/components/PageDeployGauge/DeploySidechain.tsx:79 msgid "Connect to a sidechain in order to complete the first step and deploy a sidechain gauge." msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:87 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:168 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:560 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:625 msgid "Connect to Ethereum" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:73 +#: src/components/PageDeployGauge/DeployMainnet.tsx:64 msgid "Connect to Ethereum in order to deploy gauge." msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:84 +#: src/components/PageDeployGauge/DeploySidechain.tsx:75 msgid "Connect to Ethereum in order to deploy mirror gauge." msgstr "" -#: src/components/FormConnectWallet.tsx:25 -#: src/components/PageCompensation/Page.tsx:90 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:30 +#: src/components/ConnectWallet.tsx:46 +#: src/components/PageCompensation/Page.tsx:77 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:375 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:78 #: src/components/PageCrvLocker/components/FormActions.tsx:23 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:97 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:178 -#: src/components/PagePool/Page.tsx:81 -#: src/components/PagePoolList/index.tsx:245 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:570 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:635 +#: src/components/PagePool/components/TransferActions.tsx:62 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:29 msgid "Connect Wallet" msgstr "连接钱包" -#: src/components/PagePool/Page.tsx:80 -msgid "Connect wallet to view pool" -msgstr "" - -#: src/components/PagePoolList/index.tsx:244 -msgid "Connect wallet to view pool list" -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:91 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:172 -#: src/components/PagePool/Page.tsx:82 -#: src/components/PagePoolList/index.tsx:246 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:564 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:629 msgid "Connecting" msgstr "" -#: src/components/PageCreatePool/index.tsx:174 +#: src/components/PageCreatePool/index.tsx:113 msgid "Connecting to network" msgstr "正在连接到网络" #: src/components/PageCreatePool/Parameters/index.tsx:268 #: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#~ msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" -#~ msgstr "建议选择单位价格更高的代币作为第一个代币,以获得更高的 AMM 性能。" +msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" +msgstr "建议选择单位价格更高的代币作为第一个代币,以获得更高的 AMM 性能。" #: src/domain/create-pool/confirm-modal/index.tsx:318 #: src/domain/create-pool/summary/index.tsx:146 #~ msgid "Contains rebasing tokens:" #~ msgstr "包含重新定基代币" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:25 -#: src/layout/default/Footer.tsx:118 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:23 +#: src/layout/default/Footer.tsx:114 msgid "Contracts" msgstr "智能合约" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:53 -msgid "Copy address" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:59 -msgid "Counterparty Risk" -msgstr "" - #: src/domain/create-pool/index.tsx:82 #~ msgid "CREATE CURVE POOL" #~ msgstr "创建Curve池" @@ -729,18 +604,14 @@ msgstr "创建锁仓" #~ msgid "Create lock spending approved" #~ msgstr "创建锁仓所需余额已被授权" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:42 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:47 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:121 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:145 -#: src/components/PageCreatePool/Page.tsx:31 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:383 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:388 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:218 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:248 +#: src/components/PageCreatePool/Page.tsx:28 msgid "Create Pool" msgstr "创建流动池" -#: src/components/PagePoolList/index.tsx:105 -msgid "Cross-chain" -msgstr "" - #: src/domain/crv-locker/form-lock-crv/index.tsx:122 #~ msgid "CRV approved" #~ msgstr "CRV 已授权" @@ -761,7 +632,7 @@ msgstr "CRV 可用的" #~ msgid "CRV locked {0}" #~ msgstr "已被锁定的CRV {0}" -#: src/components/PageDashboard/components/FormVecrv.tsx:188 +#: src/components/PageDashboard/components/FormVecrv.tsx:181 msgid "CRV locked:" msgstr "已被锁定的CRV:" @@ -769,32 +640,30 @@ msgstr "已被锁定的CRV:" msgid "CRV Locked: {0}" msgstr "已被锁定的CRV:" -#: src/components/PageCrvLocker/Page.tsx:74 -#: src/components/PageCrvLocker/Page.tsx:78 +#: src/components/PageCrvLocker/Page.tsx:75 +#: src/components/PageCrvLocker/Page.tsx:79 msgid "CRV Locker" msgstr "锁定CRV" #~ msgid "CRV LP reward annualized (max APY can be reached with max boost of 2.50)" #~ msgstr "CRV LP奖励年化(APY最大可以提升2.50倍)" -#: src/components/PoolRewardsCrv.tsx:96 +#: src/components/PoolRewardsCrv.tsx:73 msgid "CRV LP reward annualized (max tAPR can be reached with max boost of 2.50)" msgstr "CRV LP奖励年化(tAPR最大可以提升2.50倍)" -#: src/components/PageDashboard/index.tsx:58 +#: src/components/PageDashboard/index.tsx:69 msgid "CRV Profits" msgstr "CRV 利润" -#: src/components/PagePoolList/index.tsx:101 +#: src/components/PagePoolList/index.tsx:107 +#: src/layout/default/Header.tsx:120 +#: src/layout/default/HeaderMobile.tsx:143 msgid "crvUSD" msgstr "crvUSD" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:93 -msgid "crvUSD has been claimed and sent to your wallet." -msgstr "" - -#: src/components/PageCreatePool/constants.ts:103 -#: src/components/PagePoolList/index.tsx:103 +#: src/components/PageCreatePool/constants.ts:87 +#: src/components/PagePoolList/index.tsx:109 msgid "Crypto" msgstr "加密货币" @@ -806,7 +675,7 @@ msgstr "加密货币" #~ msgid "Crypto collateralized stablecoin" #~ msgstr "加密货币抵押稳定币" -#: src/components/PageCreatePool/constants.ts:78 +#: src/components/PageCreatePool/constants.ts:74 msgid "Crypto Collateralized Stablecoins" msgstr "加密货币抵押稳定币" @@ -815,37 +684,26 @@ msgstr "加密货币抵押稳定币" #~ msgid "Crypto Share" #~ msgstr "加密货币池份额" -#: src/components/PagePool/index.tsx:219 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:13 +#: src/components/PagePool/index.tsx:201 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:11 msgid "CRYPTO V2" msgstr "加密货币 V2" -#: src/layout/default/Header.tsx:71 +#: src/layout/default/HeaderMobile.tsx:225 +#: src/layout/default/HeaderSecondary.tsx:66 msgid "Crypto Volume Share" msgstr "加密货币池交易份额" -#: src/components/PageRiskDisclaimer/index.tsx:110 -msgid "Cryptocurrencies and ERC20 tokens have historically exhibited significant price volatility. They can experience rapid and substantial fluctuations in value, which may occur within short periods of time. The market value of any token may rise or fall, and there is no guarantee of any specific price stability." -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:44 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 +#: src/components/PageCreatePool/PoolType/index.tsx:42 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Cryptoswap" msgstr "加密货币兑换" -#: src/components/PageCreatePool/PoolType/index.tsx:50 +#: src/components/PageCreatePool/PoolType/index.tsx:48 msgid "Cryptoswap pools are currently unavailable on this chain" msgstr "此链上暂未开通加密货币兑换池" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:70 -msgid "Cryptoswap pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:103 -msgid "CryptoSwap V2 pools" -msgstr "" - -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:38 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:40 msgid "Currency reserves" msgstr "储备" @@ -853,7 +711,7 @@ msgstr "储备" #~ msgid "Current" #~ msgstr "当前的" -#: src/components/PagePool/UserDetails/index.tsx:124 +#: src/components/PagePool/UserDetails/index.tsx:127 msgid "Current Boost:" msgstr "当前加速倍数" @@ -865,36 +723,16 @@ msgstr "" #~ msgid "Current unlocked date" #~ msgstr "当前解锁时间" -#: src/components/PageRiskDisclaimer/index.tsx:20 -msgid "Curve Pool Risk Disclosures for Liquidity Providers" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:63 -msgid "Curve pool smart contracts are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and liquidity providers always retain full control of their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:44 -msgid "Curve relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. It is essential for users to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:48 -msgid "Curve smart contracts have undergone multiple audits by reputable firms including Trail of Bits, MixBytes, QuantStamp, and ChainSecurity to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:31 -msgid "Curve Whitepapers" -msgstr "" - -#: src/components/AdvancedSettings.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:358 +#: src/components/AdvancedSettings.tsx:195 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:357 msgid "Custom" msgstr "自定义" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:39 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:33 msgid "Daily" msgstr "每日" -#: src/components/PageDashboard/components/Summary.tsx:63 +#: src/components/PageDashboard/components/Summary.tsx:64 msgid "Daily Profits" msgstr "每日利润" @@ -902,26 +740,26 @@ msgstr "每日利润" #~ msgid "Daily USD volume" #~ msgstr "每日美元交易量" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:57 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:69 msgid "Daily USD volume:" msgstr "每日美元交易量:" -#: src/layout/default/Header.tsx:70 +#: src/layout/default/HeaderMobile.tsx:216 +#: src/layout/default/HeaderSecondary.tsx:58 msgid "Daily Volume" msgstr "每日交易量" #: src/layout/default/HeaderMobile.tsx:163 #: src/layout/default/HeaderSecondary.tsx:82 -#~ msgid "DAO" -#~ msgstr "" +msgid "DAO" +msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:24 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:20 msgid "DAO fee:" msgstr "DAO 费用:" -#: src/components/PageDashboard/Page.tsx:34 -#: src/layout/default/Header.tsx:79 -#: src/layout/default/Header.tsx:86 +#: src/components/PageDashboard/Page.tsx:32 +#: src/layout/default/Header.tsx:34 msgid "Dashboard" msgstr "我的" @@ -929,102 +767,59 @@ msgstr "我的" #~ msgid "days" #~ msgstr "天" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:200 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:86 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:646 #: src/components/PageDeployGauge/Page.tsx:28 msgid "Deploy Gauge" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:36 +#: src/components/PageDeployGauge/ProcessSummary.tsx:35 msgid "Deploy gauge on sidechain" msgstr "" -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Mainnet Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:146 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:603 msgid "Deploy Mirror Gauge" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:67 +#: src/components/PageDeployGauge/ProcessSummary.tsx:55 msgid "Deploy mirror gauge on Ethereum using the same sidechain LP token address" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:140 -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:598 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Sidechain Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:205 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:91 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:651 msgid "Deploying Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:215 -#: src/store/createDeployGaugeSlice.ts:252 -#: src/store/createDeployGaugeSlice.ts:289 -#: src/store/createDeployGaugeSlice.ts:326 -#: src/store/createDeployGaugeSlice.ts:362 -msgid "Deploying gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:158 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:615 msgid "Deploying Mirror Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:611 -#: src/store/createDeployGaugeSlice.ts:650 -#: src/store/createDeployGaugeSlice.ts:689 -#: src/store/createDeployGaugeSlice.ts:728 -#: src/store/createDeployGaugeSlice.ts:764 -msgid "Deploying mirror gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/ProcessSummary.tsx:72 -msgid "Deploying mirror gauge..." -msgstr "" - -#: src/store/createCreatePoolSlice.ts:836 -#: src/store/createCreatePoolSlice.ts:917 -#: src/store/createCreatePoolSlice.ts:1015 -#: src/store/createCreatePoolSlice.ts:1086 -#: src/store/createCreatePoolSlice.ts:1175 -#: src/store/createCreatePoolSlice.ts:1254 -msgid "Deploying pool {poolName}..." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:201 -msgid "Deploying Pool {poolName}..." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:152 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:609 msgid "Deploying Sidechain Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:408 -#: src/store/createDeployGaugeSlice.ts:446 -#: src/store/createDeployGaugeSlice.ts:484 -#: src/store/createDeployGaugeSlice.ts:522 -#: src/store/createDeployGaugeSlice.ts:560 -msgid "Deploying sidechain gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/ProcessSummary.tsx:40 -msgid "Deploying sidechain gauge..." -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 -#: src/components/PagePool/Deposit/index.tsx:35 -#: src/components/PagePool/index.tsx:196 -#: src/components/PagePoolList/components/TableRowMobile.tsx:159 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 +#: src/components/PagePool/Deposit/index.tsx:34 +#: src/components/PagePool/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:165 msgid "Deposit" msgstr "存入" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 -#: src/components/PagePool/Deposit/index.tsx:37 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 +#: src/components/PagePool/Deposit/index.tsx:36 msgid "Deposit & Stake" msgstr "存入和质押" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 msgid "Deposit & Stake Complete" msgstr "存入和质押 完成" @@ -1032,11 +827,11 @@ msgstr "存入和质押 完成" #~ msgid "Deposit & Stake Failed" #~ msgstr "存入和质押 失败" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:109 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 msgid "Deposit and staked {tokenText}" msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 msgid "Deposit Complete" msgstr "存入 成功" @@ -1056,35 +851,31 @@ msgstr "存入 封装代币" #~ msgid "Deposited {tokenText}, received {receivedLpTokens} LP Tokens" #~ msgstr "存入 {tokenText},收到 {receivedLpTokens} 個 LP 代币" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:106 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:103 msgid "Deposited {tokenText}." msgstr "存入 {tokenText}。" #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Desc" -#~ msgstr "下降" +msgid "Desc" +msgstr "下降" -#: src/layout/default/Footer.tsx:113 +#: src/layout/default/Footer.tsx:137 msgid "Developer Docs" msgstr "开发文档" -#: src/components/PagePoolList/index.tsx:276 +#: src/components/PagePoolList/index.tsx:261 msgid "Didn't find what you're looking for?" msgstr "沒有找到您要查找的内容?" -#: src/components/AdvancedSettings.tsx:145 +#: src/components/AdvancedSettings.tsx:136 msgid "Discard" msgstr "丢弃" -#: src/components/PageRiskDisclaimer/index.tsx:142 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "" - -#: src/layout/default/Footer.tsx:52 +#: src/layout/default/Footer.tsx:47 msgid "Dodo" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:272 +#: src/components/PageCreatePool/Parameters/index.tsx:261 msgid "Dollar prices are fetched from coingecko." msgstr "" @@ -1093,16 +884,8 @@ msgstr "" #~ msgstr "美元价格来源于CoinGecko" #: src/layout/default/Footer.tsx:132 -#~ msgid "Donate" -#~ msgstr "捐款" - -#: src/components/PageRiskDisclaimer/index.tsx:128 -msgid "Due to composability within DeFi, it is possible for assets in Curve pools to be receipt tokens for deposits in third party lending platforms. Composability of this sort can amplify yields for liquidity providers, but it also exposes users to additional risks associated with the underlying lending protocol. Users interacting with pools that involve lending assets should be mindful of this additional risk and conduct due diligence on the associated lending protocol." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:119 -msgid "Due to the permissionless pool factory and the absence of strict onboarding criteria, not every token included in Curve pools undergoes a detailed independent risk assessment. Curve pools may contain unvetted tokens that have uncertain value or potential fraudulent characteristics. The presence of unvetted tokens introduces potential risks, including exchange rate volatility, smart contract vulnerabilities, liquidity risks, and other unforeseen circumstances that could result in the loss of funds or other adverse consequences." -msgstr "" +msgid "Donate" +msgstr "捐款" #: src/domain/dialogs/dialog-waves-provider.tsx:21 #~ msgid "Email" @@ -1112,16 +895,15 @@ msgstr "" #~ msgid "Enable to process transaction." #~ msgstr "启动以处理交易。" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:212 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:140 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:134 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:101 msgid "ERC4626" msgstr "" #: src/components/Page404/Page.tsx:11 #: src/pages/404.tsx:11 -#~ msgid "Error 404" -#~ msgstr "错误 404" +msgid "Error 404" +msgstr "错误 404" #: src/components/PagePool/components/DetailInfoEstTokens.tsx:18 msgid "Estimated Received:" @@ -1131,15 +913,15 @@ msgstr "预计收到:" #~ msgid "Estimated TX cost" #~ msgstr "预计交易成本" -#: src/components/DetailInfoEstGas.tsx:84 +#: src/components/DetailInfoEstGas.tsx:78 msgid "Estimated TX cost:" msgstr "预计交易成本:" #: src/layout/default/Footer.tsx:109 -#~ msgid "Events" -#~ msgstr "事件" +msgid "Events" +msgstr "事件" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "Exchange rate" msgstr "兑换比例" @@ -1147,38 +929,30 @@ msgstr "兑换比例" #~ msgid "Exchange rate is too low!" #~ msgstr "汇率过低!" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:231 -msgid "existing pools" -msgstr "" - -#: src/components/PagePool/index.tsx:251 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:261 +#: src/components/PagePool/index.tsx:227 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:221 msgid "Expand chart" msgstr "" -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:46 -msgid "Expected CRV tAPR:" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:53 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:47 msgid "EYWA fee:" msgstr "" #: src/hooks/usePoolAlert.tsx:91 -#~ msgid "EYWA Links:" -#~ msgstr "" +msgid "EYWA Links:" +msgstr "" #: src/components/PagePoolList/components/TableCellFactory.tsx:15 -#~ msgid "Factory" -#~ msgstr "工厂池" +msgid "Factory" +msgstr "工厂池" #: src/components/PagePool/index.tsx:210 -#~ msgid "FACTORY" -#~ msgstr "工厂池" +msgid "FACTORY" +msgstr "工厂池" #: src/components/PagePoolList/components/TableCellFactory.tsx:14 -#~ msgid "Factory pools are permissionless, deployed by anyone." -#~ msgstr "工厂池是无需许可的,任何人都可以部署。" +msgid "Factory pools are permissionless, deployed by anyone." +msgstr "工厂池是无需许可的,任何人都可以部署。" #: src/layout/default/Footer.tsx:134 #~ msgid "FAQ" @@ -1188,20 +962,20 @@ msgstr "" #~ msgid "Fee" #~ msgstr "费用" -#: src/components/PageCreatePool/Parameters/index.tsx:369 +#: src/components/PageCreatePool/Parameters/index.tsx:364 msgid "Fee Gamma ({0} - {1})" msgstr "费用 Gamma ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:274 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 msgid "Fee Gamma:" msgstr "费用 Gamma ({0} - {1})" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:84 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:91 msgid "Fee:" msgstr "费用:" -#: src/components/PageCreatePool/Parameters/index.tsx:218 +#: src/components/PageCreatePool/Parameters/index.tsx:207 msgid "Fees" msgstr "费用" @@ -1209,7 +983,7 @@ msgstr "费用" #~ msgid "Fiat Redeemable Stablecoin" #~ msgstr "可兑换为法定货币的稳定币" -#: src/components/PageCreatePool/constants.ts:66 +#: src/components/PageCreatePool/constants.ts:62 msgid "Fiat Redeemable Stablecoins" msgstr "可兑换为法定货币的稳定币" @@ -1217,32 +991,27 @@ msgstr "可兑换为法定货币的稳定币" #~ msgid "Filter by" #~ msgstr "过滤" -#: src/components/PageCreatePool/constants.ts:218 +#: src/components/PageCreatePool/constants.ts:186 msgid "For pools containing native {0} (represented as 0xEE…EE)" msgstr "对于包含原生{0}(表示为0xEE...EE)的池" -#: src/components/PageCreatePool/constants.ts:206 +#: src/components/PageCreatePool/constants.ts:174 msgid "For pools that supports any major ERC20 return implementation (”return True / revert”, “return None / revert”, “return True / return False”), and any number of decimal places up to 18" msgstr "对于支持任何主要 ERC20 返回实现(“return True / revert”,“return None / revert”,“return True / return False”)和任意小数位数最多为18的池。" -#: src/components/PageCreatePool/constants.ts:212 +#: src/components/PageCreatePool/constants.ts:180 msgid "For pools with rebase tokens like aTokens, or where there's a fee-on-transfer." msgstr "对于具有重新定基代币(如 aTokens)或存在转移费用的池。" -#: src/components/PageCreatePool/constants.ts:119 +#: src/components/PageCreatePool/constants.ts:103 msgid "Forex" msgstr "外汇" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:90 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:66 msgid "Function (e.g exchangeRate())" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:168 -msgid "Function ID:" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:90 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:163 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:76 msgid "Function:" msgstr "" @@ -1250,15 +1019,16 @@ msgstr "" #~ msgid "Future" #~ msgstr "未來" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:44 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:42 msgid "Gauge" msgstr "权重" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:196 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:95 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:642 msgid "Gauge Deployed Successfully" msgstr "" -#: src/components/PageDeployGauge/index.tsx:131 +#: src/components/PageDeployGauge/index.tsx:136 msgid "Gauge deployment is not supported on this network." msgstr "" @@ -1267,27 +1037,27 @@ msgstr "" #~ msgstr "权重仪表" #: src/components/PageCreatePool/ConfirmModal/index.tsx:290 -#~ msgid "Go to deploy sidechain gauge" -#~ msgstr "" +msgid "Go to deploy sidechain gauge" +msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:173 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:297 msgid "Go to pool" msgstr "前往流动池" #: src/layout/default/HeaderMobile.tsx:164 #: src/layout/default/HeaderSecondary.tsx:83 -#~ msgid "Governance" -#~ msgstr "Gov.治理" +msgid "Governance" +msgstr "Gov.治理" #: src/components/layout/default/footer.tsx:46 #~ msgid "Help" #~ msgstr "帮助" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:123 +#: src/components/ComboBoxSelectToken/index.tsx:136 msgid "Hide tokens from very small pools" msgstr "隐藏小池的代币" -#: src/components/PagePoolList/index.tsx:224 +#: src/components/PagePoolList/index.tsx:220 msgid "Hide very small pools" msgstr "隐藏小池" @@ -1307,7 +1077,7 @@ msgstr "隐藏小池" #~ msgid "High price impact warning!<0/>Swap will have {0}% price impact." #~ msgstr "注意:高滑点警告!<0/>交易将会产生 {0}% 的滑点。" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "High price impact:" msgstr "注意:高滑点警告!" @@ -1315,27 +1085,10 @@ msgstr "注意:高滑点警告!" #~ msgid "High price impact!" #~ msgstr "注意:高滑点警告!" -#: src/components/PagePool/components/WarningModal.tsx:65 +#: src/components/PagePool/components/WarningModal.tsx:56 msgid "High slippage!<0/>{0} will have {1}% loss." msgstr "注意:高滑点!<0/>{0} 将会损失 {1}%。" -#: src/components/PageRiskDisclaimer/index.tsx:87 -msgid "If the token fails to regain its peg, liquidity providers will encounter losses proportional to the severity of the depeg. The potential permanent loss highlights the importance of thorough consideration and caution when participating in activities involving stablecoins and/or derivative assets." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:51 -msgid "Immutability and Irreversibility of Transactions:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:90 -msgid "Impermanent Loss:" -msgstr "" - -#: src/components/PageDashboard/index.tsx:55 -#: src/components/PagePoolList/Page.tsx:57 -msgid "Incentives" -msgstr "" - #: src/components/PageCrvLocker/index.tsx:28 msgid "Increase Amount" msgstr "增加金额" @@ -1349,30 +1102,29 @@ msgstr "增加锁仓" msgid "Increase Lock Amount" msgstr "增加锁仓金额" -#: src/components/PageCreatePool/Parameters/index.tsx:266 +#: src/components/PageCreatePool/Parameters/index.tsx:255 msgid "Initial Liquidity Concentration Price" msgstr "初始流动性集中价格。" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:77 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:75 msgid "Initial Price {0}" msgstr "初始价格 {0}" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:63 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:71 msgid "Initial Price B:" msgstr "初始价格B:" -#: src/components/PageCreatePool/Parameters/index.tsx:278 +#: src/components/PageCreatePool/Parameters/index.tsx:273 msgid "Initial price can't be 0. The price fetch didn't return a price. Please enter the token dollar price manually in the input." msgstr "初始价格不能为0。价格检索未返回价格。请手动输入价格。" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:46 msgid "Initial Price{0}:" msgstr "初始价格{0}:" #: src/components/PageIntegrations/Page.tsx:38 -#: src/layout/default/Footer.tsx:126 -#: src/layout/default/Header.tsx:80 -#: src/layout/default/Header.tsx:88 +#: src/layout/default/Footer.tsx:127 +#: src/layout/default/Header.tsx:35 msgid "Integrations" msgstr "集成" @@ -1380,21 +1132,16 @@ msgstr "集成" msgid "Invalid date" msgstr "" -#: src/components/PagePoolList/index.tsx:278 +#: src/components/PagePoolList/index.tsx:263 msgid "Join the Telegram" msgstr "加入电报群" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:204 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:38 -msgid "Last change occurred between {0} and {1}, when A ramped from {initial_A} to {future_A}." -msgstr "" - -#: src/components/PageDeployGauge/InfoBox.tsx:25 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:60 +#: src/components/PageDeployGauge/InfoBox.tsx:26 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 msgid "Learn more" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:139 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:136 msgid "Learn more about Boosting your CRV rewards" msgstr "" @@ -1410,60 +1157,47 @@ msgstr "" #~ msgid "Learn more about V2 pools" #~ msgstr "了解有关 V2 池的更多信息" -#: src/components/PageCreatePool/index.tsx:213 +#: src/components/PageCreatePool/index.tsx:152 msgid "Learn more: Creating Cryptoswap pools" msgstr "" -#: src/components/PageCreatePool/index.tsx:209 +#: src/components/PageCreatePool/index.tsx:148 msgid "Learn more: Creating Stableswap pools" msgstr "" -#: src/components/PageCreatePool/index.tsx:225 +#: src/components/PageCreatePool/index.tsx:164 msgid "Learn more: Read about Cryptoswap parameters" msgstr "" -#: src/components/PageCreatePool/index.tsx:221 +#: src/components/PageCreatePool/index.tsx:160 msgid "Learn more: Understanding Cryptoswap" msgstr "" -#: src/components/PageCreatePool/index.tsx:233 +#: src/components/PageCreatePool/index.tsx:172 msgid "Learn more: Understanding Stableswap" msgstr "" #: src/components/PageCreatePool/components/InfoBox.tsx:28 #: src/components/PageCreatePool/components/InfoBox.tsx:34 -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:79 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:218 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:65 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:140 msgid "Link to address" msgstr "地址链接" -#: src/components/PageCreatePool/constants.ts:90 -#: src/components/PageCreatePool/constants.ts:151 -msgid "Liquid Restaking Tokens" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:135 +#: src/components/PageCreatePool/constants.ts:119 msgid "Liquid Staking Derivatives" msgstr "流动性质押衍生品" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:61 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:62 msgid "Liquidity" msgstr "" -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:20 -msgid "Liquidity providers in this pool also earn additional tokens!" -msgstr "" - -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:19 -msgid "Liquidity providers in this pool also earn points!" -msgstr "" - #: src/domain/transfer/pool-stats/pool-parameters.tsx:142 #~ msgid "Liquidity utilization" #~ msgstr "流动性利用率" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:63 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:72 msgid "Liquidity utilization:" msgstr "流动性利用率:" @@ -1471,8 +1205,9 @@ msgstr "流动性利用率:" #~ msgid "Llama Airforce" #~ msgstr "Llama Airforce" -#: src/components/FormConnectWallet.tsx:29 #: src/components/PageCrvLocker/components/FormActions.tsx:27 +#: src/components/PagePool/components/TransferActions.tsx:66 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:35 msgid "Loading" msgstr "正在加载" @@ -1520,7 +1255,7 @@ msgstr "锁仓到期日已更新" #~ msgid "Locked until" #~ msgstr "锁仓到期日" -#: src/components/PageDashboard/components/FormVecrv.tsx:191 +#: src/components/PageDashboard/components/FormVecrv.tsx:184 msgid "Locked until:" msgstr "锁仓到期日:" @@ -1528,20 +1263,20 @@ msgstr "锁仓到期日:" #~ msgid "Low Exchange Rate!" #~ msgstr "注意:低汇率!" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:178 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:139 msgid "LP Token ({0})" msgstr "LP代币 ({0})" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:175 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:142 msgid "LP Token (USD)" msgstr "LP代币 (USD)" -#: src/components/PageDeployGauge/DeploySidechain.tsx:118 +#: src/components/PageDeployGauge/DeploySidechain.tsx:109 msgid "LP Token Address" msgstr "" #: src/components/PagePool/components/FieldLpToken.tsx:42 -#: src/components/PagePool/UserDetails/index.tsx:99 +#: src/components/PagePool/UserDetails/index.tsx:102 msgid "LP Tokens" msgstr "LP代币" @@ -1549,14 +1284,6 @@ msgstr "LP代币" msgid "LP Tokens Avail." msgstr "LP代币可用的" -#: src/store/createDeployGaugeSlice.ts:227 -#: src/store/createDeployGaugeSlice.ts:264 -#: src/store/createDeployGaugeSlice.ts:301 -#: src/store/createDeployGaugeSlice.ts:338 -#: src/store/createDeployGaugeSlice.ts:374 -msgid "Mainnet gauge deployment successful." -msgstr "" - #: src/components/input-comp/input-max-button.tsx:35 #~ msgid "MAX" #~ msgstr "最大值" @@ -1565,7 +1292,7 @@ msgstr "" #~ msgid "Max amount" #~ msgstr "最大数量" -#: src/components/AdvancedSettings.tsx:166 +#: src/components/AdvancedSettings.tsx:157 msgid "Max Slippage" msgstr "最大滑点" @@ -1573,11 +1300,11 @@ msgstr "最大滑点" #~ msgid "MAX*" #~ msgstr "最大值*" -#: src/components/AdvancedSettings.tsx:168 +#: src/components/AdvancedSettings.tsx:159 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "交易的预期价格与交易执行时的价格之间的最大差异。" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:107 msgid "Measures pool growth; this is not a dollar value" msgstr "衡量池增长; 这不是以美元计价" @@ -1585,16 +1312,12 @@ msgstr "衡量池增长; 这不是以美元计价" #~ msgid "MetaMask" #~ msgstr "MetaMask" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:99 -msgid "Metapool" -msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:250 +#: src/components/PageCreatePool/Parameters/index.tsx:239 msgid "Mid fee governs fees charged during low volatility." msgstr "Mid Fee管理低波动期间收取的费用" #: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:30 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:181 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:53 msgid "Mid Fee:" msgstr "中间费用:" @@ -1603,14 +1326,10 @@ msgstr "中间费用:" #~ msgstr "中间费用: ({0} - {1}%)" #: src/components/PageCreatePool/Parameters/index.tsx:230 -#~ msgid "Mid Fee: ({0} - {1}%)" -#~ msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:241 -msgid "Mid Fee: ({0}% - {1}%)" +msgid "Mid Fee: ({0} - {1}%)" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:72 +#: src/components/PagePool/UserDetails/index.tsx:75 msgid "min. CRV tAPR %" msgstr "基础 CRV 年化 tAPR %" @@ -1618,7 +1337,7 @@ msgstr "基础 CRV 年化 tAPR %" #~ msgid "Min. Curve {0} LP Tokens:" #~ msgstr "最低限度 Curve {0} LP 代币:" -#: src/components/AdvancedSettings.tsx:117 +#: src/components/AdvancedSettings.tsx:111 msgid "Min. slippage is {MIN_SLIPPAGE}%" msgstr "最小滑点为 {MIN_SLIPPAGE}%" @@ -1626,7 +1345,7 @@ msgstr "最小滑点为 {MIN_SLIPPAGE}%" #~ msgid "Min. slippage is 0.01%" #~ msgstr "最小滑点为 0.01%" -#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:40 +#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:42 msgid "Minimum LP Tokens:" msgstr "最少LP代币:" @@ -1634,56 +1353,48 @@ msgstr "最少LP代币:" #~ msgid "Minter" #~ msgstr "铸币厂" -#: src/store/createDeployGaugeSlice.ts:623 -#: src/store/createDeployGaugeSlice.ts:662 -#: src/store/createDeployGaugeSlice.ts:701 -#: src/store/createDeployGaugeSlice.ts:740 -#: src/store/createDeployGaugeSlice.ts:776 -msgid "Mirror gauge deployment successful." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:125 -#: src/components/PageDeployGauge/ProcessSummary.tsx:79 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:584 +#: src/components/PageDeployGauge/ProcessSummary.tsx:61 msgid "Mirror gauge successfully deployed" msgstr "" #: src/layout/default/HeaderMobile.tsx:146 -#~ msgid "Mode" -#~ msgstr "模式" +msgid "Mode" +msgstr "模式" #: src/layout/default/HeaderMobile.tsx:154 -#~ msgid "More" -#~ msgstr "" +msgid "More" +msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:318 -#: src/components/PageCreatePool/Parameters/index.tsx:391 +#: src/components/PageCreatePool/Parameters/index.tsx:313 +#: src/components/PageCreatePool/Parameters/index.tsx:386 msgid "Moving Average Time ({0} - {1}) seconds" msgstr "移动平均时间 ({0} - {1}) 秒" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:123 #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:57 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:286 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:124 msgid "Moving Average Time:" msgstr "移动平均时间:" -#: src/components/PagePoolList/index.tsx:106 +#: src/components/PagePoolList/index.tsx:111 msgid "My Pools" msgstr "我的池子" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:37 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:59 msgid "Name:" msgstr "名称:" -#: src/components/PageDeployGauge/DeploySidechain.tsx:93 +#: src/components/PageDeployGauge/DeploySidechain.tsx:84 msgid "Network:" msgstr "" -#: src/layout/default/Footer.tsx:146 +#: src/layout/default/Footer.tsx:142 msgid "News" msgstr "新闻" -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Next" msgstr "下一个" @@ -1697,7 +1408,7 @@ msgstr "下一个" #~ msgid "No A value set" #~ msgstr "未设置 放大系数 值" -#: src/components/PageDashboard/index.tsx:161 +#: src/components/PageDashboard/index.tsx:166 msgid "No active pool found for" msgstr "找不到活跃的池子" @@ -1705,23 +1416,19 @@ msgstr "找不到活跃的池子" #~ msgid "No active pool found." #~ msgstr "未找到活动的池子。" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:73 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 msgid "No address set" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:78 msgid "No asset type set" msgstr "未设置 资产类别 值" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:212 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:213 msgid "No claimable rewards" msgstr "没有可以领取的奖励" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:84 -msgid "No controller data found." -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:92 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:78 msgid "No function set" msgstr "" @@ -1732,19 +1439,19 @@ msgstr "" #~ msgid "No initial price set" #~ msgstr "未设置 初始价格 值" -#: src/components/PageIntegrations/index.tsx:130 +#: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:39 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:61 msgid "No name set" msgstr "未设置 名称 值" -#: src/components/PagePoolList/index.tsx:283 +#: src/components/PagePoolList/index.tsx:268 msgid "No pool found for \"{0}\". Feel free to search other tabs, or" msgstr "未找到 \"{0}\" 的池。 搜索其他标签,或" -#: src/components/PagePoolList/index.tsx:290 +#: src/components/PagePoolList/index.tsx:275 msgid "No pool found in this category" msgstr "在这个类别中没有找到流动性池" @@ -1763,39 +1470,32 @@ msgstr "未设置 预设" #~ msgid "No swap fee set" #~ msgstr "未设置 手续费 值" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:47 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:69 msgid "No symbol set" msgstr "未设置 symbol 值" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:148 -msgid "No token found for \"{filterValue}\"" -msgstr "" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:278 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:235 msgid "No token found for address {0}" msgstr "未找到地址{0}的代币" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:76 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:69 msgid "No tokens selected" msgstr "未选择代币" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:77 -msgid "No trades data found." -msgstr "" - -#: src/components/PageDashboard/components/TableRow.tsx:89 +#: src/components/PageDashboard/components/TableRow.tsx:92 msgid "None" msgstr "无" #: src/components/PagePool/Swap/index.tsx:396 -#~ msgid "Not enough balance for {0}" -#~ msgstr "" +msgid "Not enough balance for {0}" +msgstr "" -#: src/store/createPoolDepositSlice.ts:279 -msgid "Not enough balance for {amountsError}." -msgstr "{amountsError} 余额不足。书签" +#: src/domain/transfer/deposit/form-deposit/index.tsx:95 +#: src/domain/transfer/deposit/form-deposit-stake/index.tsx:96 +#~ msgid "Not enough balance for {amountsError}." +#~ msgstr "{amountsError} 余额不足。书签" -#: src/components/PagePool/Deposit/components/FormStake.tsx:206 +#: src/components/PagePool/Deposit/components/FormStake.tsx:198 msgid "Not enough LP Tokens balances." msgstr "" @@ -1859,15 +1559,15 @@ msgstr "推送中" msgid "Nudging and Claiming" msgstr "推送和领取中" -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "of pool" msgstr "这些池" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 msgid "Off Peg Multiplier:" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:310 +#: src/components/PageCreatePool/Parameters/index.tsx:305 msgid "Offpeg Fee Multiplier ({0} - {1})" msgstr "" @@ -1879,47 +1579,34 @@ msgstr "" #~ msgid "On March 15th, all protocol owned dex liquidity will be removed. You must remove your own dex liquidity before March 15th. After the new STG token is airdropped, the old STG will be worthless. If you continue to provide LP at this point, the old STG token will be sold into your LP removing the other asset you are providing and you will lose funds!!. It is recommended you withdraw and unwrap the LP and (if you wish) re-add the LP with the new STG token after you receive it." #~ msgstr "3月15日,所有协议拥有的流动性将被移除。您必须在3月15日之前移除自己的dex流动性。在新的STG代币空投后,旧的STG代币将一文不值。如果你仍继续为这个池提供流动性,旧的STG代币将会被出售给您,并换取您提供的其他资产,您将会失去资金!!建议您从流动池中提取资金,并在收到新的STG后,使用新币重新添加流动性(如果你愿意的话)。" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:351 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:350 msgid "One coin" msgstr "一个代币" -#: src/components/PageDeployGauge/InfoBox.tsx:17 +#: src/components/PageDeployGauge/InfoBox.tsx:18 msgid "Only admin/manager can set reward token, set reward token distributor address." msgstr "" -#: src/components/PageCreatePool/constants.ts:222 +#: src/components/PageCreatePool/constants.ts:190 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:44 msgid "Optimised" msgstr "优化" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:210 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:130 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:85 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:132 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:91 msgid "Oracle" msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:83 -msgid "Oracle address needs to be 42 characters long." -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:80 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 msgid "Oracle address needs to start with '0x'." msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 -msgid "Oracle Address:" -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:93 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:69 msgid "Oracle function name needs to end with '()'." msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:95 -msgid "Oracle must have a precision of 18 decimals." -msgstr "" - -#: src/components/PagePool/index.tsx:220 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:14 +#: src/components/PagePool/index.tsx:202 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:12 msgid "OTHER" msgstr "其他" @@ -1927,22 +1614,18 @@ msgstr "其他" #~ msgid "Others" #~ msgstr "其他" -#: src/components/PageCreatePool/Parameters/index.tsx:263 +#: src/components/PageCreatePool/Parameters/index.tsx:252 msgid "Out fee governs fees charged during high volatility." msgstr "Out Fee费用管理高波动期间收取的费用" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:187 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:59 msgid "Out Fee:" msgstr "区间外费用" #: src/components/PageCreatePool/Parameters/index.tsx:242 -#~ msgid "Out fee: ({midFee} - {0}%)" -#~ msgstr "区间外费用: ({midFee} - {0}%)" - -#: src/components/PageCreatePool/Parameters/index.tsx:253 -msgid "Out fee: ({midFee}% - {0}%)" -msgstr "" +msgid "Out fee: ({midFee} - {0}%)" +msgstr "区间外费用: ({midFee} - {0}%)" #: src/domain/page404.tsx:44 #~ msgid "Page not found" @@ -1955,11 +1638,11 @@ msgstr "" #~ msgid "Parameters" #~ msgstr "参数" -#: src/components/PageCreatePool/components/Navigation.tsx:54 +#: src/components/PageCreatePool/components/Navigation.tsx:106 msgid "PARAMETERS" msgstr "参数" -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:26 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:47 msgid "Parameters:" msgstr "" @@ -1967,31 +1650,29 @@ msgstr "" #~ msgid "Percent share in pool" #~ msgstr "池中的百分比份額" -#: src/components/PageRiskDisclaimer/index.tsx:81 -msgid "Permanent Loss of a Peg:" -msgstr "" - -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:64 +#: src/components/PageDashboard/components/FormClaimFees.tsx:57 msgid "Please approve claim veCRV rewards." msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:90 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:93 -#: src/components/PagePool/Swap/index.tsx:183 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:87 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:88 +#: src/components/PagePool/Swap/index.tsx:179 +#: src/components/PageRouterSwap/index.tsx:206 msgid "Please approve spending your {0}." msgstr "请授权支付您的 {0}。" -#: src/components/PageRouterSwap/index.tsx:211 -msgid "Please approve spending your {fromToken}." -msgstr "请授权支付您的 {fromToken}。" +#: src/domain/quick-swap/index.tsx:278 +#: src/domain/transfer/swap/index.tsx:278 +#~ msgid "Please approve spending your {fromToken}." +#~ msgstr "请授权支付您的 {fromToken}。" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:101 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:52 msgid "Please approve spending your CRV." msgstr "请授权支付您的 CRV。" -#: src/components/PagePool/Deposit/components/FormStake.tsx:59 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:95 +#: src/components/PagePool/Deposit/components/FormStake.tsx:57 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:94 msgid "Please approve spending your LP Tokens." msgstr "请授权使用您的 LP 代币。" @@ -2011,7 +1692,7 @@ msgstr "" msgid "Please confirm claim of {tokensMessage}" msgstr "请确认 {tokensMessage} 的领取" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:99 msgid "Please confirm deposit and staking of {tokenText} LP Tokens at max {maxSlippage}% slippage." msgstr "请确认以最大 {maxSlippage}% 的滑点存入和质押 {tokenText} LP 代币。" @@ -2019,7 +1700,7 @@ msgstr "请确认以最大 {maxSlippage}% 的滑点存入和质押 {tokenText} L #~ msgid "Please confirm deposit and staking of {tokenText} LP Tokens." #~ msgstr "请确认 {tokenText} LP 代幣的存款和質押。" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:101 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:98 msgid "Please confirm deposit of {tokenText} at max {maxSlippage}% slippage." msgstr "请确认以最大 {maxSlippage}% 的滑点存入 {tokenText}。" @@ -2055,11 +1736,12 @@ msgstr "请确认 {tokensMessage} 的推送和領取" msgid "Please confirm nudge rewards" msgstr "请确认推送奖励" -#: src/components/PagePool/Deposit/components/FormStake.tsx:69 +#: src/components/PagePool/Deposit/components/FormStake.tsx:67 msgid "Please confirm staking of {0} LP Tokens" msgstr "请确认 {0} 个 LP 代币的抵押" -#: src/components/PagePool/Swap/index.tsx:130 +#: src/components/PagePool/Swap/index.tsx:126 +#: src/components/PageRouterSwap/index.tsx:155 msgid "Please confirm swap {fromAmount} {fromToken} for {toToken} at max slippage {maxSlippage}%." msgstr "请确认将 {fromAmount} {fromToken} 换成 {fromToken},最大滑点 {maxSlippage}%." @@ -2071,21 +1753,17 @@ msgstr "请确认将 {fromAmount} {fromToken} 换成 {fromToken},最大滑点 #~ msgid "Please confirm swapping {0} {1}" #~ msgstr "请确认交换 {0} {1}" -#: src/store/createCreatePoolSlice.ts:793 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:80 msgid "Please confirm to create pool {poolName}." msgstr "请确认创建 {poolName} 流动池" #: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:116 -#~ msgid "Please confirm to deploy gauge for {0}." -#~ msgstr "" - -#: src/store/createDeployGaugeSlice.ts:189 -msgid "Please confirm to deploy gauge for {shortenAddress}." +msgid "Please confirm to deploy gauge for {0}." msgstr "" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:46 -#~ msgid "Please confirm to deploy gauge." -#~ msgstr "" +msgid "Please confirm to deploy gauge." +msgstr "" #: src/components/PagePool/Withdraw/components/FormUnstake.tsx:51 msgid "Please confirm unstaking of {0} LP Tokens" @@ -2099,7 +1777,7 @@ msgstr "" msgid "Please confirm withdraw of {lockedAmount} CRV." msgstr "请确认提取 {lockedAmount} CRV。" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:106 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:105 msgid "Please confirm withdrawal of {0} LP Tokens at max {maxSlippage}% slippage." msgstr "" @@ -2111,11 +1789,11 @@ msgstr "" #~ msgid "Please confirm withdrawal of {lpTokenPayload} LP Tokens." #~ msgstr "请确认提取 {lpTokenPayload} LP代币。#~ 书签" -#: src/components/PageCreatePool/TokensInPool/index.tsx:751 +#: src/components/PageCreatePool/TokensInPool/index.tsx:583 msgid "Please connect a wallet to select tokens" msgstr "请连接钱包以选择代币。" -#: src/components/PageDashboard/index.tsx:148 +#: src/components/PageDashboard/index.tsx:153 msgid "Please connect wallet or enter a wallet address to view active pools." msgstr "请连接钱包或输入钱包地址查看活跃的池。" @@ -2123,7 +1801,7 @@ msgstr "请连接钱包或输入钱包地址查看活跃的池。" #~ msgid "Please connect wallet to view active pools." #~ msgstr "请连接钱包以查看各池详情。" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:28 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:26 msgid "Please select tokens to be able to set initial price" msgstr "请选择代币以设置初始价格" @@ -2135,54 +1813,41 @@ msgstr "请选择代币以设置初始价格" #~ msgid "Please switch your wallet's network to" #~ msgstr "请将您的钱包网络切换到" -#: src/components/PagePoolList/Page.tsx:60 -msgid "Points" -msgstr "" - -#: src/components/PageDashboard/index.tsx:52 -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 -#: src/components/PagePoolList/Page.tsx:54 +#: src/components/PageDashboard/index.tsx:54 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 +#: src/components/PagePoolList/Page.tsx:56 msgid "Pool" msgstr "池" -#: src/store/createCreatePoolSlice.ts:853 -#: src/store/createCreatePoolSlice.ts:934 -#: src/store/createCreatePoolSlice.ts:1033 -#: src/store/createCreatePoolSlice.ts:1103 -#: src/store/createCreatePoolSlice.ts:1192 -#: src/store/createCreatePoolSlice.ts:1272 -msgid "Pool {poolName} deployment successful." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:163 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:265 msgid "Pool {poolName} was successfully created!" msgstr "池 {poolName} 已创建成功" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 msgid "Pool / Token" msgstr "池/代币" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:216 msgid "Pool Activity" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:70 +#: src/components/PageDeployGauge/DeployMainnet.tsx:61 msgid "Pool Address" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:16 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:15 msgid "Pool APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:27 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:26 msgid "Pool APY + Interest APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:19 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:18 msgid "Pool APY + Lending APY" msgstr "池APY + 借贷APY" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:22 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:21 msgid "Pool APY + Staking APY" msgstr "池APY + 质押APY" @@ -2190,22 +1855,23 @@ msgstr "池APY + 质押APY" #~ msgid "Pool contains rebasing tokens" #~ msgstr "流动性池包含重新定基(rebase)的代币" -#: src/components/PageCreatePool/index.tsx:180 -#: src/layout/default/Header.tsx:78 -#: src/layout/default/Header.tsx:87 +#: src/components/PageCreatePool/index.tsx:119 +#: src/layout/default/Header.tsx:33 msgid "Pool Creation" msgstr "创建流动性池" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:51 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:70 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:392 msgid "Pool Creation Complete" msgstr "流动性创建成功" -#: src/components/PageCreatePool/index.tsx:305 +#: src/components/PageCreatePool/index.tsx:256 msgid "Pool creation is not yet available on this network." msgstr "" -#: src/components/PagePool/index.tsx:123 +#: src/components/PagePool/index.tsx:104 +#: src/components/PagePool/index.tsx:109 +#: src/components/PagePool/index.tsx:114 +#: src/components/PagePool/index.tsx:117 msgid "Pool Details" msgstr "" @@ -2217,12 +1883,11 @@ msgstr "实现流动性池" msgid "Pool Implementation:" msgstr "实现流动性池:" -#: src/components/PageCreatePool/components/Navigation.tsx:67 +#: src/components/PageCreatePool/components/Navigation.tsx:157 msgid "POOL INFO" msgstr "流动池信息" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 msgid "Pool Info:" msgstr "池信息" @@ -2231,25 +1896,18 @@ msgstr "池信息" #~ msgstr "池名称(例如:CRV/ETH)" #: src/components/PageCreatePool/PoolInfo/index.tsx:30 -#~ msgid "Pool Name (e.g. CRV/ETH)" -#~ msgstr "" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:30 -msgid "Pool Name (e.g. stETH/ETH)" +msgid "Pool Name (e.g. CRV/ETH)" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:152 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:50 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:159 msgid "Pool Parameters" msgstr "池参数" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:58 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:45 msgid "Pool Parameters Presets" msgstr "初始池参数" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 -msgid "Pool Parameters:" -msgstr "" - #: src/domain/create-pool/components/navigation.tsx:59 #~ msgid "POOL PRESETS" #~ msgstr "流动池预设" @@ -2263,7 +1921,7 @@ msgstr "" #~ msgid "POOL SETUP" #~ msgstr "流动池设置" -#: src/components/PageCreatePool/Summary/index.tsx:27 +#: src/components/PageCreatePool/Summary/index.tsx:40 msgid "Pool Summary" msgstr "" @@ -2272,18 +1930,14 @@ msgstr "" #~ msgstr "池符号(例如:CRVETH)" #: src/components/PageCreatePool/PoolInfo/index.tsx:35 -#~ msgid "Pool Symbol (e.g. CRVETH)" -#~ msgstr "" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:35 -msgid "Pool Symbol (e.g. stETHETH)" +msgid "Pool Symbol (e.g. CRVETH)" msgstr "" -#: src/components/PageCreatePool/PoolType/index.tsx:26 +#: src/components/PageCreatePool/PoolType/index.tsx:24 msgid "Pool Type" msgstr "流动池类别" -#: src/components/PageCreatePool/components/Navigation.tsx:28 +#: src/components/PageCreatePool/components/Navigation.tsx:40 msgid "POOL TYPE" msgstr "流动池类别" @@ -2293,106 +1947,72 @@ msgstr "流动池类别" #~ msgstr "在调整中间费用之前需要设置流动性池类型" #: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:29 -#: src/components/PageDeployGauge/DeployMainnet.tsx:60 -#: src/components/PageDeployGauge/DeploySidechain.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:96 +#: src/components/PageDeployGauge/DeployMainnet.tsx:51 +#: src/components/PageDeployGauge/DeploySidechain.tsx:98 msgid "Pool Type:" msgstr "" -#: src/components/PagePoolList/Page.tsx:114 -#: src/layout/default/Header.tsx:77 -#: src/layout/default/Header.tsx:85 +#: src/components/PagePoolList/Page.tsx:122 +#: src/layout/default/Header.tsx:32 msgid "Pools" msgstr "池子" #: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#~ msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" -#~ msgstr "" +msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" +msgstr "" #: src/domain/create-pool/tokens-in-pool/index.tsx:757 #~ msgid "Pools with basepools (3Crv, FRAXBP, sbtc2Crv) allow a maximum of 2 tokens" #~ msgstr "具有基础池(3Crv、FRAXBP、sbtc2Crv)的流动性池最多允许两种代币" -#: src/components/PageCreatePool/TokensInPool/index.tsx:770 -msgid "Pools with basepools allow a maximum of 2 tokens" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:126 -msgid "Pools with Lending Assets:" -msgstr "" - #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:22 #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:27 msgid "Preset:" msgstr "预设" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Previous" msgstr "上一个" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:82 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:80 msgid "Price A ({0})" msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:87 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:85 msgid "Price B ({0})" msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:24 msgid "Price change in the market that happens when a trader buys or sells an asset." msgstr "交易者买卖资产时发生的市场价格变化。" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "Price impact:" msgstr "价格影响:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:298 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:118 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:135 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:125 msgid "Price Oracle:" msgstr "指的是LP的预言机价格:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:317 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:136 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:143 msgid "Price Scale:" msgstr "指的是当前浮动的预言机价格:" -#: src/components/PageRiskDisclaimer/index.tsx:108 -msgid "Price Volatility:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:23 -msgid "Providing liquidity on Curve doesn't come without risks. Before making a deposit, it is best to research and understand the risks involved." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:92 -msgid "Providing liquidity to Curve pools may expose users to the risk of impermanent loss. Fluctuations in asset prices after supplying to a pool can result in losses when users remove liquidity. Before engaging in liquidity provision activities, users are advised to carefully evaluate the potential for impermanent loss and consider their own risk tolerance." -msgstr "" - #: src/components/layout/default/header.tsx:26 #~ msgid "Quick Swap" #~ msgstr "快速兑换" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:246 -msgid "Ramp {0} A ends on:" -msgstr "" - #: src/domain/transfer/pool-stats/pool-parameters.tsx:134 #~ msgid "Ramp up A ends on" #~ msgstr "调整放大系数在" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:202 -#~ msgid "Ramp up A ends on:" -#~ msgstr "调整放大系数在:" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:224 -msgid "Ramping {0} A:" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:55 -msgid "Ramping A:" -msgstr "" +msgid "Ramp up A ends on:" +msgstr "调整放大系数在:" #: src/domain/transfer/pool-stats/pool-parameters.tsx:124 #~ msgid "Ramping up A" @@ -2400,40 +2020,27 @@ msgstr "" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:72 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:186 -#~ msgid "Ramping up A:" -#~ msgstr "目标放大系数:" +msgid "Ramping up A:" +msgstr "目标放大系数:" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:211 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:135 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:86 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:133 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:96 msgid "Rebasing" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:778 +#: src/components/PageCreatePool/TokensInPool/index.tsx:622 msgid "Rebasing tokens are not supported in {CRYPTOSWAP} pools" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:771 +#: src/components/PageCreatePool/TokensInPool/index.tsx:613 msgid "Rebasing tokens are not supported in this version of Stableswap" msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:130 +#: src/components/PageDashboard/components/Summary.tsx:136 msgid "Recently viewed addresses" msgstr "最近查看的地址" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:116 -msgid "Registry:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:134 -msgid "Regulatory Risk" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:136 -msgid "Regulatory Uncertainty:" -msgstr "" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:69 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:68 msgid "Remove" msgstr "移除" @@ -2441,21 +2048,21 @@ msgstr "移除" #~ msgid "Remove Liquidity Approved" #~ msgstr "移除流动性 授权" -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:85 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:102 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:57 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 msgid "Remove token" msgstr "移除代币" -#: src/components/PageCreatePool/Parameters/index.tsx:294 +#: src/components/PageCreatePool/Parameters/index.tsx:289 msgid "Reset advanced" msgstr "重置高级设置" -#: src/components/PageCreatePool/Parameters/index.tsx:220 +#: src/components/PageCreatePool/Parameters/index.tsx:209 msgid "Reset Fees" msgstr "重置手续费" -#: src/layout/default/Footer.tsx:105 -#: src/layout/default/Header.tsx:195 +#: src/layout/default/Footer.tsx:147 +#: src/layout/default/HeaderMobile.tsx:189 msgid "Resources" msgstr "资源" @@ -2471,45 +2078,29 @@ msgstr "资源" #~ msgid "Retry Claim Rewards" #~ msgstr "重试领取奖励" -#: src/components/PagePoolList/Page.tsx:55 -msgid "Rewards Base" -msgstr "" - #: src/components/PagePoolList/Page.tsx:57 -#~ msgid "Rewards Base vAPY" -#~ msgstr "奖励 tAPR" - -#: src/components/PagePoolList/Page.tsx:56 -msgid "Rewards CRV" -msgstr "" +msgid "Rewards Base vAPY" +msgstr "奖励 tAPR" #: src/components/PagePoolList/Page.tsx:66 -#~ msgid "Rewards CRV tAPR" -#~ msgstr "奖励 tAPR (CRV)" - -#: src/components/PagePoolList/Page.tsx:57 -msgid "Rewards Incentives" -msgstr "" +msgid "Rewards CRV tAPR" +msgstr "奖励 tAPR (CRV)" #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "Rewards Incentives tAPR" -#~ msgstr "奖励 tAPR(更多奖励)" +msgid "Rewards Incentives tAPR" +msgstr "奖励 tAPR(更多奖励)" -#: src/components/PageDashboard/components/TableHead.tsx:72 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:26 +#: src/components/PageDashboard/index.tsx:59 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:94 +#: src/components/PagePoolList/Page.tsx:61 msgid "Rewards tAPR" msgstr "奖励 tAPR" -#: src/components/PagePoolList/components/TableRowMobile.tsx:134 -msgid "REWARDS tAPR" -msgstr "" - -#: src/components/PageDashboard/index.tsx:54 +#: src/components/PageDashboard/index.tsx:64 msgid "Rewards tAPR (CRV)" msgstr "奖励 tAPR (CRV)" -#: src/components/PageDashboard/index.tsx:55 +#: src/components/PageDashboard/index.tsx:66 msgid "Rewards tAPR (Incentives)" msgstr "奖励 tAPR(更多奖励)" @@ -2517,33 +2108,29 @@ msgstr "奖励 tAPR(更多奖励)" #~ msgid "Risk" #~ msgstr "风险" -#: src/components/PageRiskDisclaimer/Page.tsx:28 -msgid "Risk Disclaimer" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:89 msgid "Risks of using {0}" msgstr "{0}池 使用风险" -#: src/components/AdvancedSettings.tsx:158 +#: src/components/AdvancedSettings.tsx:149 msgid "Save" msgstr "保存" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:191 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:151 msgid "Search by name or paste address" msgstr "按名称或粘贴地址以搜素" -#: src/components/PagePoolList/index.tsx:189 +#: src/components/PagePoolList/index.tsx:185 msgid "Search by pool name, pool address, token name or token address" msgstr "按流动池名称、流动池地址、代币名称或代币地址搜索" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:83 -#: src/components/ComboBoxSelectToken/ComboBox.tsx:84 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:203 +#: src/components/ComboBoxSelectToken/index.tsx:117 +#: src/components/ComboBoxSelectToken/index.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:163 msgid "Search by token name or address" msgstr "按代币名称或地址搜索" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:261 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:219 msgid "Search generated no results" msgstr "搜素未产生任何结果" @@ -2555,12 +2142,12 @@ msgstr "搜素未产生任何结果" #~ msgid "Select" #~ msgstr "选择" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:176 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:136 msgid "Select a token" msgstr "选择一种代币" -#: src/components/PagePool/Swap/index.tsx:371 -#: src/components/PagePool/Swap/index.tsx:454 +#: src/components/PagePool/Swap/index.tsx:366 +#: src/components/PagePool/Swap/index.tsx:449 msgid "Select a Token" msgstr "选择一种代币" @@ -2568,7 +2155,7 @@ msgstr "选择一种代币" #~ msgid "Select date" #~ msgstr "选择到期日" -#: src/components/PageDeployGauge/DeploySidechain.tsx:96 +#: src/components/PageDeployGauge/DeploySidechain.tsx:87 msgid "Select Network" msgstr "" @@ -2576,15 +2163,11 @@ msgstr "" #~ msgid "Select pool asset type tag" #~ msgstr "按池类型标签选择" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:68 -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:74 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:55 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:61 msgid "Select preset" msgstr "" -#: src/components/PageIntegrations/components/SelectIntegrationTags.tsx:25 -msgid "Select tag" -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:91 msgid "Select unlock date" msgstr "选择到期日" @@ -2593,25 +2176,17 @@ msgstr "选择到期日" msgid "Set pool asset type tag:" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:62 -#: src/components/PageDeployGauge/DeploySidechain.tsx:109 +#: src/components/PageDeployGauge/DeployMainnet.tsx:53 +#: src/components/PageDeployGauge/DeploySidechain.tsx:100 msgid "Set Pool Type" msgstr "" -#: src/components/PageDashboard/components/FormVecrv.tsx:181 +#: src/components/PageDashboard/components/FormVecrv.tsx:174 msgid "share of total" msgstr "占总体的份额" -#: src/store/createDeployGaugeSlice.ts:422 -#: src/store/createDeployGaugeSlice.ts:460 -#: src/store/createDeployGaugeSlice.ts:498 -#: src/store/createDeployGaugeSlice.ts:536 -#: src/store/createDeployGaugeSlice.ts:574 -msgid "Sidechain gauge deployment successful." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:122 -#: src/components/PageDeployGauge/ProcessSummary.tsx:47 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:581 +#: src/components/PageDeployGauge/ProcessSummary.tsx:40 msgid "Sidechain gauge successfully deployed" msgstr "" @@ -2631,89 +2206,58 @@ msgstr "滑点来自于存入太多不平衡的代币,并且当前的代币价 msgid "Slippage Loss" msgstr "滑点损失" -#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:14 +#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:18 msgid "Slippage tolerance:" msgstr "滑点宽限" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:229 -msgid "Slowly changing {0} A so that it doesn't negatively change virtual price growth of shares" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:59 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:190 msgid "Slowly changing up A so that it doesn't negatively change virtual price growth of shares" msgstr "缓慢调整放大系数,以免因流动性池代币的虚拟价格波动而产生负面影响" -#: src/components/PageRiskDisclaimer/index.tsx:35 -msgid "Smart Contract Audits" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:42 -msgid "Smart Contract Risk:" -msgstr "" - -#: src/components/PagePoolList/index.tsx:272 +#: src/components/PagePoolList/index.tsx:257 msgid "Sorry, we are unable to load your pools." msgstr "抱歉,我们无法加载您的池。" #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:40 #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:47 -#~ msgid "Sort by" -#~ msgstr "" +msgid "Sort by" +msgstr "" #: src/components/PagePoolList/components/DialogSort/DialogSortMobile.tsx:57 -#~ msgid "Sort By" -#~ msgstr "排序方式" +msgid "Sort By" +msgstr "排序方式" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Spending Approved" msgstr "支出已授权" -#: src/components/PagePoolList/index.tsx:104 +#: src/components/PagePoolList/index.tsx:110 msgid "Stable NG" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:83 -msgid "Stablecoins and other derivative assets are designed to maintain a peg to a reference asset. If one of the pool assets drops below its peg, it effectively means that liquidity providers in the pool hold almost all their liquidity in that token. The depegged token may never recover as a result of a technical failure, insolvency, or other adverse situations." -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:31 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:75 +#: src/components/PageCreatePool/PoolType/index.tsx:29 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Stableswap" msgstr "挂钩资产兑换" -#: src/components/PageRiskDisclaimer/index.tsx:97 -msgid "StableSwap pools" -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:769 -msgid "Stableswap pools allow up to 8 tokens" -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:37 +#: src/components/PageCreatePool/PoolType/index.tsx:35 msgid "Stableswap pools are currently unavailable on this chain" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:76 -msgid "Stableswap-NG" -msgstr "" - -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 -msgid "Stableswap{0}" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 -#: src/components/PagePool/Deposit/index.tsx:36 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 +#: src/components/PagePool/Deposit/index.tsx:35 msgid "Stake" msgstr "质押" -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 msgid "Stake Complete" msgstr "质押完成" @@ -2725,26 +2269,21 @@ msgstr "质押完成" #~ msgid "Staked LP Tokens" #~ msgstr "质押LP代币" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:31 -msgid "Staked percent" -msgstr "" - -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "Staked share:" msgstr "质押份额:" -#: src/components/PagePool/UserDetails/index.tsx:101 +#: src/components/PagePool/UserDetails/index.tsx:104 msgid "Staked:" msgstr "质押中:" -#: src/components/PagePool/Deposit/index.tsx:121 -#: src/components/PagePool/Deposit/index.tsx:130 +#: src/components/PagePool/Deposit/index.tsx:119 +#: src/components/PagePool/Deposit/index.tsx:128 msgid "Staking is disabled due to inactive Gauge." msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:209 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:125 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:84 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:131 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:86 msgid "Standard" msgstr "" @@ -2752,27 +2291,27 @@ msgstr "" #~ msgid "Stats" #~ msgstr "统计数据" -#: src/components/DetailInfoEstGas.tsx:88 +#: src/components/DetailInfoEstGas.tsx:82 msgid "Step {0} of {1}" msgstr "{1} 的第 {0} 步" -#: src/components/PageDeployGauge/index.tsx:94 +#: src/components/PageDeployGauge/index.tsx:93 msgid "Step 1" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:93 +#: src/components/PageDeployGauge/ProcessSummary.tsx:72 msgid "Step 1 and Step 2 must be completed using the same wallet" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:32 +#: src/components/PageDeployGauge/ProcessSummary.tsx:33 msgid "Step 1:" msgstr "" -#: src/components/PageDeployGauge/index.tsx:106 +#: src/components/PageDeployGauge/index.tsx:105 msgid "Step 2" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:62 +#: src/components/PageDeployGauge/ProcessSummary.tsx:52 msgid "Step 2:" msgstr "" @@ -2808,60 +2347,51 @@ msgstr "" #~ msgid "Successfully locked additional {0} CRV." #~ msgstr "成功添加锁仓{0}CRV" -#: src/components/PageCreatePool/constants.ts:120 +#: src/components/PageCreatePool/constants.ts:104 msgid "Suitable for forex pairs with low relative volatility" msgstr "适用于相对波动性较低的外汇货币对" -#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PageCreatePool/constants.ts:120 msgid "Suitable for liquid staking derivatives soft-pegged to its underlying asset." msgstr "适用于与其基础资产软锚定的流动权益衍生品" -#: src/components/PageCreatePool/constants.ts:91 -#: src/components/PageCreatePool/constants.ts:152 -msgid "Suitable for LRTs" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:104 +#: src/components/PageCreatePool/constants.ts:88 msgid "Suitable for most volatile pairs such as LDO <> ETH" msgstr "适用于最具波动性的交易对,例如 LDO <> ETH" -#: src/components/PageCreatePool/constants.ts:79 +#: src/components/PageCreatePool/constants.ts:75 msgid "Suitable for stablecoins that are crypto-backed" msgstr "适用于以加密货币为支持的稳定币" -#: src/components/PageCreatePool/constants.ts:67 +#: src/components/PageCreatePool/constants.ts:63 msgid "Suitable for stablecoins that are fiat-redeemable" msgstr "适用于可兑换法定货币的稳定币" -#: src/components/PageCreatePool/constants.ts:169 +#: src/components/PageCreatePool/constants.ts:137 msgid "Suitable for USD stablecoin <> BTC stablecoin <> ETH." msgstr "" -#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:153 msgid "Suitable for volatile tokens paired against ETH and USD stablecoins" msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:104 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:167 msgid "Summary" msgstr "" -#: src/components/PagePool/index.tsx:198 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PagePoolList/components/TableRowMobile.tsx:165 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/index.tsx:191 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:171 +#: src/components/PageRouterSwap/index.tsx:216 +#: src/components/PageRouterSwap/Page.tsx:112 #: src/components/PageRouterSwap/Page.tsx:116 -#: src/components/PageRouterSwap/Page.tsx:127 -#: src/layout/default/Header.tsx:95 +#: src/layout/default/Header.tsx:31 msgid "Swap" msgstr "兑换" -#: src/components/PageRouterSwap/index.tsx:159 -msgid "swap {fromAmount} {fromToken} for {0} {toToken} at max slippage {maxSlippage}%." -msgstr "" - -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PageRouterSwap/index.tsx:216 msgid "Swap Complete" msgstr "兑换完成" @@ -2870,12 +2400,8 @@ msgstr "兑换完成" #~ msgstr "兑换费用 ({0} - {1}%)" #: src/components/PageCreatePool/Parameters/index.tsx:215 -#~ msgid "Swap Fee ({0} - {1}%)" -#~ msgstr "兑换费用 ({0} - {1}%)" - -#: src/components/PageCreatePool/Parameters/index.tsx:226 -msgid "Swap Fee ({0}% - {1}%)" -msgstr "" +msgid "Swap Fee ({0} - {1}%)" +msgstr "兑换费用 ({0} - {1}%)" #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:32 msgid "Swap Fee:" @@ -2889,7 +2415,7 @@ msgstr "暂时无法交换" #~ msgid "Swap type:" #~ msgstr "兑换类型" -#: src/components/PagePool/Swap/index.tsx:511 +#: src/components/PagePool/Swap/index.tsx:512 msgid "Swap Wrapped" msgstr "交换封装代币" @@ -2898,19 +2424,19 @@ msgstr "交换封装代币" #~ msgstr "将 {0} 交換為 {1}" #: src/components/PageRouterSwap/index.tsx:162 -#~ msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" -#~ msgstr "已将 {fromAmount} {fromToken} 兑换为 {0} {toToken}" +msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" +msgstr "已将 {fromAmount} {fromToken} 兑换为 {0} {toToken}" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:54 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:55 msgid "Swaps" msgstr "" -#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:75 +#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:37 msgid "Switch tokens" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:45 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:67 msgid "Symbol:" msgstr "代币符号" @@ -2922,11 +2448,7 @@ msgstr "" #~ msgid "Technical Docs" #~ msgstr "技術文檔" -#: src/components/PageRiskDisclaimer/index.tsx:40 -msgid "Technology Risk" -msgstr "" - -#: src/layout/default/Footer.tsx:38 +#: src/layout/default/Footer.tsx:33 msgid "Telegram" msgstr "电报" @@ -2939,33 +2461,21 @@ msgstr "电报" #~ msgstr "中文电报" #: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -#~ msgid "The address needs to be 42 characters long." -#~ msgstr "" - -#: src/components/PageDeployGauge/InfoBox.tsx:12 -msgid "The address that deploys a gauge is set as the gauge admin/manager." +msgid "The address needs to be 42 characters long." msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:70 -msgid "The Curve Emergency Admin is a" +#: src/components/PageDeployGauge/InfoBox.tsx:13 +msgid "The address that deploys a gauge is set as the gauge admin/manager." msgstr "" #: src/domain/create-pool/index.tsx:204 #~ msgid "The Curve pool creation factory is not yet available on this network." #~ msgstr "此网络上尚未提供 Curve 流动性池创建工厂" -#: src/components/PageRiskDisclaimer/index.tsx:67 -msgid "The Curve protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including the implementation of new system contracts and the adjustment of system parameters." -msgstr "" - -#: src/components/PagePool/Swap/index.tsx:558 +#: src/components/PagePool/Swap/index.tsx:478 msgid "The entered amount exceeds the available currency reserves." msgstr "" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:50 -msgid "The expected amount you would like to receive, {0}, will actually be {toAmountOutput}." -msgstr "" - #: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "" @@ -2975,15 +2485,7 @@ msgstr "" #~ msgstr "下一步是存入流动性" #: src/components/PageCreatePool/ConfirmModal/index.tsx:268 -#~ msgid "The next step is to deploy a gauge." -#~ msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:114 -msgid "The overall market dynamics, including price volatility, liquidity fluctuations, and broader economic factors, can impact the value of user funds when providing liquidity. Sudden market movements or unexpected events can result in losses that may be difficult to anticipate or mitigate." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:138 -msgid "The regulatory landscape surrounding blockchain technology, DeFi protocols, tokens, cryptocurrencies, and related activities is constantly evolving, resulting in regulatory uncertainty. The lack of clear and consistent regulations may impact legal obligations, compliance requirements, and potential risks associated with the protocol activities." +msgid "The next step is to deploy a gauge." msgstr "" #: src/hooks/useTokenAlert.tsx:27 @@ -2995,26 +2497,22 @@ msgstr "Ren 桥目前正在运行,但会在不久的将来下线。我们不 #~ msgstr "Ren 桥目前正在运行,但会在不久的将来下线。我们不知道确切的日期,这不在我们的控制范围之内,但我们将会尽一切努力以确保Ren资产的挂钩得以维持。谢谢。" #: src/components/PageDashboard/components/FormClaimFees.tsx:68 -#~ msgid "The rewards you claimed are viewable in 3pool." -#~ msgstr "您领取的奖励可在 3pool 中查看。" +msgid "The rewards you claimed are viewable in 3pool." +msgstr "您领取的奖励可在 3pool 中查看。" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:29 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:25 msgid "The total fee on each trade is split in two parts: one part goes to the pool’s Liquidity Providers, another part goes to the DAO (i.e. Curve veCRV holders)" msgstr "每笔交易的总费用分为两部分:一部分分配给池的流动性提供商,另一部分分配给DAO(即veCRV持有者)" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:99 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:90 msgid "There was an error fetching the pool activity data." msgstr "" -#: src/components/PagePoolList/components/ChipVolatileBaseApy.tsx:15 -msgid "This is a volatile number that will very likely not persist." -msgstr "" - -#: src/components/PoolRewardsCrv.tsx:48 +#: src/components/PoolRewardsCrv.tsx:43 msgid "This pool has CRV rewards that aren’t currently being distributed.<0/>This pool has a very small amount of rewards waiting to be distributed to it; but since the amount of rewards is very small, the bridge used to send these CRV tokens over is holding onto those tokens until they grow to an amount big enough to be bridged. If this pool continues receiving votes, the amount of tokens to be distributed will grow every Thursday, and eventually unlock and be distributed then." msgstr "该池有CRV奖励,目前尚未分配。<0/>该池有极少量的奖励等待分配给它; 但是由于奖励的數量非常少,用于发送这些CRV代币的跨链桥将会一直持有这些代币,直到它们增长到足以被桥接的数量。 如果这个池子继续接受投票,每个星期四分配的代币數量就会增加,最终解锁并分配。" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:218 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:219 msgid "This pool has CRV rewards that aren’t streaming yet. Click ‘Claim CRV’ to resume reward streaming for you and everyone else!" msgstr "这个池的CRV奖励尚未传输,点击“领取 CRV”按钮,可为您和其他所有人恢复奖励流通!" @@ -3022,151 +2520,88 @@ msgstr "这个池的CRV奖励尚未传输,点击“领取 CRV”按钮,可 #~ msgid "This pool has CRV rewards that aren’t streaming yet. Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" #~ msgstr "该池有尚未被分发的 CRV 獎勵。 前往该池的“提款/領取”頁面,然后点击“推送CRV奖励”按鈕,为您和其他所有人恢复奖励分发流!" -#: src/components/PoolRewardsCrv.tsx:30 +#: src/components/PoolRewardsCrv.tsx:28 msgid "This pool has CRV rewards that aren’t streaming yet.<0/>Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" msgstr "该池有尚未分发的 CRV 奖励。 前往该池的“提款/领取”页面,然后单击“推送CRV奖励”按钮,为您和其他所有人恢复奖励分发流!" -#: src/components/PagePool/components/AlertSeedAmounts.tsx:52 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amount of the other token should be {1}." -msgstr "" - -#: src/components/PagePool/components/AlertSeedAmounts.tsx:54 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amounts of the other tokens should be:" -msgstr "" - #: src/components/PagePool/components/TransferActions.tsx:47 -#~ msgid "This pool is still empty, it should be seeded with the following rate {0}" -#~ msgstr "这个池是空的,将从接下来的汇率开始交易{0}" +msgid "This pool is still empty, it should be seeded with the following rate {0}" +msgstr "这个池是空的,将从接下来的汇率开始交易{0}" #: src/components/PagePool/components/TransferActions.tsx:48 -#~ msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." -#~ msgstr "这个池是空的,假定汇率为1:1,将会从接下来的{0}开始交易" +msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." +msgstr "这个池是空的,假定汇率为1:1,将会从接下来的{0}开始交易" #: src/domain/transfer/components/transfer-actions.tsx:49 #~ msgid "This pool is still empty. It needs to be seeded with an initial deposit in order to enable swaps." #~ msgstr "这个池还是空的。 为了启动交换,它需要初始存款。" #: src/components/PagePool/components/WarningModal.tsx:71 -#~ msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:69 -#~ msgid "This swap has a high price impact ({0}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:80 -msgid "This swap has a high price impact ({formattedValue}) and low exchange rate ({formattedExchangeRate})." +msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." msgstr "" -#: src/components/PagePool/components/WarningModal.tsx:78 -msgid "This swap has a high price impact ({formattedValue})." +#: src/components/PagePool/components/WarningModal.tsx:69 +msgid "This swap has a high price impact ({0}%)." msgstr "" #: src/components/PagePool/components/WarningModal.tsx:67 -#~ msgid "This swap has a low exchange rate ({0}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:76 -msgid "This swap has a low exchange rate ({formattedExchangeRate})." -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:80 -msgid "Three Coin Cryptoswap-NG" +msgid "This swap has a low exchange rate ({0}%)." msgstr "" -#: src/components/PageCreatePool/constants.ts:184 +#: src/components/PageCreatePool/constants.ts:152 msgid "Three Coin Volatile" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:71 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:72 msgid "Time" msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:234 -msgid "to sim)." -msgstr "" - -#: src/components/PageDeployGauge/index.tsx:84 +#: src/components/PageDeployGauge/index.tsx:83 msgid "Toggle between mainnet and sidechain gauge deployment" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:36 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:34 msgid "Token" msgstr "代币" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:38 -#: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:38 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:36 +#: src/components/PageCreatePool/TokensInPool/index.tsx:510 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:26 msgid "Token A" msgstr "代币 A" -#: src/components/PageDashboard/components/TableHead.tsx:73 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:27 -#: src/components/PagePoolList/components/TableRowMobile.tsx:137 +#: src/components/PageDashboard/index.tsx:60 +#: src/components/PagePoolList/Page.tsx:62 msgid "Token APR based on current prices of tokens and reward rates" msgstr "代币的APR年化率是由当前代币价格和奖励代币的数量决定" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 msgid "Token APR based on current prices of tokens and reward rates." msgstr "代币的APR年化率是基于当前代币价格和奖励代币的数量决定。" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:41 -#: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:41 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:39 +#: src/components/PageCreatePool/TokensInPool/index.tsx:529 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:29 msgid "Token B" msgstr "代币 B" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:44 -#: src/components/PageCreatePool/TokensInPool/index.tsx:642 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:79 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:44 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:42 +#: src/components/PageCreatePool/TokensInPool/index.tsx:550 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:53 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:32 msgid "Token C" msgstr "代币 C" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:47 -#: src/components/PageCreatePool/TokensInPool/index.tsx:662 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:62 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:45 +#: src/components/PageCreatePool/TokensInPool/index.tsx:574 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:35 msgid "Token D" msgstr "代币 D" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:50 -#: src/components/PageCreatePool/TokensInPool/index.tsx:682 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:63 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:50 -msgid "Token E" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:53 -#: src/components/PageCreatePool/TokensInPool/index.tsx:702 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 -msgid "Token F" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:56 -#: src/components/PageCreatePool/TokensInPool/index.tsx:722 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:65 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 -msgid "Token G" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 -#: src/components/PageCreatePool/TokensInPool/index.tsx:742 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -msgid "Token H" -msgstr "" - #: src/components/PageCreatePool/TokensInPool/index.tsx:589 -#~ msgid "" -#~ "Tokens appear to be unpegged (>5% deviation from 1:1).\n" -#~ "Consider using Cryptoswap instead." -#~ msgstr "" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:757 msgid "" -"Tokens appear to be unpegged (above 5% deviation from 1:1).\n" +"Tokens appear to be unpegged (>5% deviation from 1:1).\n" "Consider using Cryptoswap instead." msgstr "" @@ -3178,31 +2613,28 @@ msgstr "" #~ msgid "Tokens Approval Failed" #~ msgstr "代币授权失败" -#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:63 msgid "TOKENS IN POOL" msgstr "流动性池中的代币" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:61 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:58 msgid "Tokens In Pool:" msgstr "流动性池中的代币" -#: src/components/PageDashboard/components/Summary.tsx:95 +#: src/components/PageDashboard/components/Summary.tsx:96 msgid "Total Balances" msgstr "总余额" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:31 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:32 msgid "Total Daily Profits" msgstr "每日总利润" -#: src/layout/default/Header.tsx:69 +#: src/layout/default/HeaderMobile.tsx:207 +#: src/layout/default/HeaderSecondary.tsx:50 msgid "Total Deposits" msgstr "总存款" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:20 -msgid "Total LP Tokens staked:" -msgstr "" - -#: src/components/PageDashboard/components/Summary.tsx:159 +#: src/components/PageDashboard/components/Summary.tsx:165 msgid "Total Summary" msgstr "总摘要" @@ -3218,27 +2650,21 @@ msgstr "交易路由:" #~ msgid "trading fees distributed to CRV lockers" #~ msgstr "分配給CRV锁仓者的交易费用" -#: src/components/PageDashboard/components/FormClaimFees.tsx:43 +#: src/components/PageDashboard/components/FormClaimFees.tsx:93 msgid "Trading fees distributed to CRV lockers" msgstr "" -#: src/components/PageRouterSwap/index.tsx:168 -msgid "Transaction complete. Received {0} {toToken}." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:204 -#: src/components/PageDeployGauge/ProcessSummary.tsx:53 -#: src/components/PageDeployGauge/ProcessSummary.tsx:85 +#: src/components/PageDeployGauge/ProcessSummary.tsx:43 +#: src/components/PageDeployGauge/ProcessSummary.tsx:64 msgid "Transaction:" msgstr "" -#: src/components/PageCreatePool/constants.ts:168 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:78 -#: src/components/PagePoolList/index.tsx:102 +#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PagePoolList/index.tsx:108 msgid "Tricrypto" msgstr "" -#: src/components/PagePoolList/Page.tsx:58 +#: src/components/PagePoolList/Page.tsx:69 msgid "TVL" msgstr "总锁定价值" @@ -3246,34 +2672,31 @@ msgstr "总锁定价值" #~ msgid "Twitter" #~ msgstr "推特" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 -msgid "Two Coin Cryptoswap" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:79 -msgid "Two Coin Cryptoswap-NG" -msgstr "" - #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:122 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:165 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:227 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:262 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:301 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:351 -#~ msgid "Tx: {0} created" -#~ msgstr "交易: {0} 已创建" - -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:34 -msgid "Tx: {poolId} created" -msgstr "" +msgid "Tx: {0} created" +msgstr "交易: {0} 已创建" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:64 -#~ msgid "Tx: Gauge deployed" -#~ msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:106 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:115 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:185 +msgid "Tx: Gauge deployed" +msgstr "" + +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:148 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:184 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:220 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:256 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:294 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:328 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:362 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:396 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:434 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:467 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:500 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:533 msgid "Tx: Gauge for {0} deployed" msgstr "" @@ -3392,32 +2815,28 @@ msgid "Unable to get locked CRV info" msgstr "" #: src/components/AlertFormError.tsx:61 -#: src/components/PageDashboard/index.tsx:154 +#: src/components/PageDashboard/index.tsx:159 msgid "Unable to get pool list" msgstr "无法获取各池列表" -#: src/store/createUserSlice.ts:90 -msgid "Unable to get pools" -msgstr "" - #: src/domain/transfer/withdraw/form-claim/index.tsx:122 #~ msgid "Unable to get rewards" #~ msgstr "无法获得奖励" #: src/components/PagePool/index.tsx:151 -#~ msgid "Unable to get seed initial rate" -#~ msgstr "无法获得初始汇率" +msgid "Unable to get seed initial rate" +msgstr "无法获得初始汇率" #: src/domain/transfer/deposit/form-deposit/index.tsx:191 #: src/domain/transfer/deposit/form-deposit-stake/index.tsx:189 #~ msgid "Unable to get slippage" #~ msgstr "无法获得滑点数据" -#: src/components/DetailInfoEstGas.tsx:105 +#: src/components/DetailInfoEstGas.tsx:98 msgid "Unable to get USD rate" msgstr "无法获取美元汇率" -#: src/components/PagePool/components/TransferActions.tsx:46 +#: src/components/PagePool/components/TransferActions.tsx:58 msgid "Unable to get wallet balances" msgstr "无法读取钱包余额" @@ -3507,7 +2926,7 @@ msgstr "" #~ msgid "Unstaked {lpTokenPayload} LP Tokens" #~ msgstr "解除质押 {lpTokenPayload} LP 代币" -#: src/components/PagePool/UserDetails/index.tsx:104 +#: src/components/PagePool/UserDetails/index.tsx:107 msgid "Unstaked:" msgstr "未质押:" @@ -3515,11 +2934,7 @@ msgstr "未质押:" #~ msgid "Unstaking" #~ msgstr "解除质押中" -#: src/components/PageRiskDisclaimer/index.tsx:117 -msgid "Unvetted Tokens:" -msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:268 +#: src/components/PageCreatePool/Parameters/index.tsx:257 msgid "Update Quote" msgstr "" @@ -3527,24 +2942,24 @@ msgstr "" #~ msgid "Update Unlock Date" #~ msgstr "更新解锁到期日" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:190 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:304 msgid "Upload an icon for a new token" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:175 +#: src/components/PagePool/UserDetails/index.tsx:174 msgid "USD balance" msgstr "美元余额" -#: src/components/PageDashboard/index.tsx:57 +#: src/components/PageDashboard/index.tsx:68 msgid "USD Profits" msgstr "美元利润" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:58 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:60 msgid "USD total" msgstr "美元总额" -#: src/components/PageDashboard/components/SummaryClaimable.tsx:65 -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:71 +#: src/components/PageDashboard/components/SummaryClaimable.tsx:59 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:65 msgid "USD Total" msgstr "美元总计" @@ -3552,7 +2967,7 @@ msgstr "美元总计" #~ msgid "USD total balance updates every ~1 minute" #~ msgstr "美元总余额每约1分钟更新一次" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:61 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:64 msgid "USD total balance updates every ~5 minute" msgstr "美元总余额每~5分钟更新一次" @@ -3560,31 +2975,32 @@ msgstr "美元总余额每~5分钟更新一次" msgid "User rejected action" msgstr "" -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:18 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:16 msgid "V2 pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." msgstr "V2 池包含非挂钩资产。 流动性提供者需要承担该池内所有资产的风险。" -#: src/components/PageDashboard/components/TableHead.tsx:67 -#: src/components/PagePoolList/components/TableHead.tsx:80 -#: src/components/PagePoolList/components/TableHead.tsx:100 +#: src/components/PageDashboard/components/TableHead.tsx:85 +#: src/components/PagePoolList/components/TableHead.tsx:91 +#: src/components/PagePoolList/components/TableHead.tsx:113 msgid "Variable APY based on today's trading activity" msgstr "动态APY是基于今天的交易量 " -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:49 msgid "Variable APY based on today's trading activity." msgstr "动态APY是基于今天的交易量。" -#: src/components/PageDashboard/components/FormClaimFees.tsx:42 -msgid "veCRV rewards" -msgstr "veCRV 獎勵" +#: src/domain/user-dashboard/summary.tsx:215 +#~ msgid "veCRV rewards" +#~ msgstr "veCRV 獎勵" #: src/domain/user-dashboard/summary.tsx:215 #~ msgid "veCRV rewards:" #~ msgstr "veCRV 奖励:" #: src/components/PageDashboard/components/FormClaimFees.tsx:89 -#~ msgid "veCRV rewards: <0>{0} 3CRV" -#~ msgstr "veCRV 奖励: <0>{0} 3CRV" +msgid "veCRV rewards: <0>{0} 3CRV" +msgstr "veCRV 奖励: <0>{0} 3CRV" #: src/domain/user-dashboard/components/form-claim-lp-rewards.tsx:95 #~ msgid "veCRV rewards: <0>{claimFeesAmount} 3CRV" @@ -3594,11 +3010,11 @@ msgstr "veCRV 獎勵" #~ msgid "Vesting" #~ msgstr "vesting解锁" -#: src/components/PageDashboard/components/Summary.tsx:122 +#: src/components/PageDashboard/components/Summary.tsx:128 msgid "View address" msgstr "查看地址" -#: src/components/PagePoolList/index.tsx:285 +#: src/components/PagePoolList/index.tsx:270 msgid "view all pools." msgstr "查看所有池。" @@ -3606,7 +3022,7 @@ msgstr "查看所有池。" #~ msgid "Virtual price" #~ msgstr "虚拟价格" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:96 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:103 msgid "Virtual price:" msgstr "虚拟价格:" @@ -3627,95 +3043,66 @@ msgstr "虚拟价格:" #~ msgid "Visit old UI" #~ msgstr "访问旧 UI" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:59 -msgid "Visit pool" -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:166 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:295 msgid "Visit the new pool to deposit liquidity." msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:97 +#: src/components/PageDeployGauge/ProcessSummary.tsx:76 msgid "Visit the pool" msgstr "" -#: src/components/PagePoolList/Page.tsx:59 +#: src/components/PagePoolList/Page.tsx:70 msgid "Volume" msgstr "交易量" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 -msgid "Vyper Version:" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:147 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:150 -#: src/components/PagePool/Swap/index.tsx:197 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:160 -#: src/components/PageRouterSwap/index.tsx:226 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:144 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:145 +#: src/components/PagePool/Swap/index.tsx:193 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:159 +#: src/components/PageRouterSwap/index.tsx:221 msgid "Warning!" msgstr "警告!" #: src/components/PageRouterSwap/index.tsx:500 -#~ msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" -#~ msgstr "" +msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" +msgstr "" #: src/components/AlertFormWarning.tsx:22 -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:48 msgid "Warning! Exchange rate is too low!" msgstr "警告! 汇率太低了!" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:47 -msgid "Warning! High price impact!" -msgstr "" - #: src/components/PageRouterSwap/index.tsx:496 -#~ msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." -#~ msgstr "" +msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." +msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:40 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:34 msgid "Weekly" msgstr "每周" -#: src/components/PageRiskDisclaimer/index.tsx:123 -msgid "When participating as a liquidity provider in any pool, users should carefully assess the tokens' functionality, security audits, team credibility, community feedback, and other relevant factors to make informed decisions and mitigate potential risks associated with the pool assets." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:53 -msgid "When you engage in transactions on Ethereum or EVM-compatible blockchains, it is important to understand that these transactions are immutable and irreversible. Once a transaction is confirmed and recorded on the blockchain, it cannot be modified, reversed, or deleted. This means that if a user sends funds to an incorrect address or engage in a fraudulent transaction, it may not be possible to recover the funds. It is crucial to exercise caution, verify transaction details, and use secure wallets to minimize the risk of irreversible transactions." -msgstr "" - -#: src/layout/default/Footer.tsx:131 +#: src/layout/default/Footer.tsx:97 msgid "Whitepaper" msgstr "白皮书" -#: src/layout/default/Footer.tsx:73 +#: src/layout/default/Footer.tsx:68 msgid "Wiki CN" msgstr "中文百科" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:232 -msgid "with similar assets for inspiration (or use" -msgstr "" - -#: src/components/AlertSlippage.tsx:24 -msgid "With your current slippage tolerance setting ({0}), the expected output displayed above might incur up to <0>{1} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -msgstr "" - #: src/components/AlertSlippage.tsx:24 -#~ msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -#~ msgstr "使用您当前的最大滑点设置 ({maxSlippage}%),上面显示预计可能将会产生高达 <0>${0} 的滑点(不包括价格影响)。 我们建议您降低上面的最大滑点设置。" +msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." +msgstr "使用您当前的最大滑点设置 ({maxSlippage}%),上面显示预计可能将会产生高达 <0>${0} 的滑点(不包括价格影响)。 我们建议您降低上面的最大滑点设置。" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 #: src/components/PagePool/Withdraw/index.tsx:31 -#: src/components/PagePoolList/components/TableRowMobile.tsx:162 +#: src/components/PagePoolList/components/TableRowMobile.tsx:168 msgid "Withdraw" msgstr "提款" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw Claim" msgstr "" #: src/components/PageDashboard/components/FormVecrv.tsx:72 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 msgid "Withdraw Complete" msgstr "提款完成" @@ -3737,7 +3124,7 @@ msgstr "提款 CRV 完成" #~ msgid "Withdraw Liquidity Approval Failed" #~ msgstr "提款授权失败" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:460 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:459 msgid "Withdraw Wrapped" msgstr "提款封裝代币" @@ -3745,7 +3132,7 @@ msgstr "提款封裝代币" #~ msgid "Withdraw/ Claim" #~ msgstr "提款/領取" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw/Claim" msgstr "提款/領取" @@ -3753,7 +3140,7 @@ msgstr "提款/領取" #~ msgid "Withdrawing" #~ msgstr "提款中" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:111 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:110 msgid "Withdrew {0} LP Tokens for {tokenText}" msgstr "" @@ -3761,11 +3148,11 @@ msgstr "" #~ msgid "Withdrew {lpTokenPayload} LP Tokens, received {0}" #~ msgstr "撤回 {lpTokenPayload} 个LP代币,收到 {0}" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:341 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 msgid "Xcp Profit A:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:335 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:172 msgid "Xcp Profit:" msgstr "" @@ -3778,20 +3165,21 @@ msgstr "" msgid "You have a balance in this pool" msgstr "您在这个池中有些余额" -#: src/components/PageCrvLocker/components/FormLockDate.tsx:214 +#: src/components/PageCrvLocker/components/FormLockDate.tsx:215 msgid "You have reached the maximum locked date." msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:76 +#: src/components/PagePool/UserDetails/index.tsx:79 msgid "your boost" msgstr "你的加速倍数" -#: src/components/PagePool/UserDetails/index.tsx:111 -#: src/components/PagePool/UserDetails/index.tsx:116 +#: src/components/PagePool/UserDetails/index.tsx:114 +#: src/components/PagePool/UserDetails/index.tsx:119 msgid "Your CRV Rewards tAPR:" msgstr "你的CRV奖励年化tAPR" -#: src/components/PagePool/index.tsx:126 +#: src/components/PagePool/index.tsx:105 +#: src/components/PagePool/index.tsx:110 msgid "Your Details" msgstr "" @@ -3799,6 +3187,6 @@ msgstr "" msgid "Your lock has expired, claim your <0>{lockedAmountDisplay} CRV" msgstr "您的投票锁定已到期,请提取您的<0>{lockedAmountDisplay} CRV" -#: src/components/PagePool/UserDetails/index.tsx:92 +#: src/components/PagePool/UserDetails/index.tsx:95 msgid "Your position" msgstr "你的头村" diff --git a/apps/main/src/locales/zh-Hant/messages.po b/apps/main/src/locales/zh-Hant/messages.po index dbb7f2ef7..387ec74c7 100644 --- a/apps/main/src/locales/zh-Hant/messages.po +++ b/apps/main/src/locales/zh-Hant/messages.po @@ -13,26 +13,26 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/components/PageDashboard/index.tsx:199 +#: src/components/PageDashboard/index.tsx:205 msgid ". Please click on the pool name to view them on" msgstr ". 請單擊池名稱以查看它們" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "(incl. fees):" msgstr "(包括費用):" -#: src/components/PageCreatePool/constants.ts:217 -#: src/components/PageCreatePool/constants.ts:223 +#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:191 msgid "(only available for pools with pegged assets)" msgstr "(僅適用於錨定資產的礦池)" -#: src/components/PageCreatePool/TokensInPool/index.tsx:763 +#: src/components/PageCreatePool/TokensInPool/index.tsx:595 msgid "(Switch)" msgstr "" #: src/components/PageCreatePool/components/InfoBox.tsx:27 #: src/components/PageCreatePool/components/InfoBox.tsx:33 -#: src/components/PageCreatePool/constants.ts:216 +#: src/components/PageCreatePool/constants.ts:184 msgid "{0}" msgstr "{0}" @@ -68,22 +68,18 @@ msgstr "{0}" #~ msgid "{0} deposited and staked approved" #~ msgstr "{0} 存款和質押已通過" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:69 -msgid "{0} is a Cryptoswap pool" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:78 -#~ msgid "{0} is a v2 pool" -#~ msgstr "{0} 是 v2池" +msgid "{0} is a v2 pool" +msgstr "{0} 是 v2池" #: src/domain/create-pool/parameters/initial-price.tsx:33 #: src/domain/create-pool/parameters/initial-price.tsx:42 #~ msgid "{0} price" #~ msgstr "{0} 價格" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:34 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:45 -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:57 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:32 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:43 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:55 msgid "{0} price in USD" msgstr "" @@ -115,27 +111,19 @@ msgstr "" #~ msgid "{0} withdraw approved" #~ msgstr "{0} 提款已批准" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:291 -msgid "{filterValue} is a disabled token in Pool Creation" -msgstr "" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:293 -msgid "{filterValue} is a disabled token in this pool configuration." -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:68 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:54 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 msgid "{title} {0} Oracle" msgstr "" -#: src/components/PageDashboard/index.tsx:188 +#: src/components/PageDashboard/index.tsx:194 msgid "*This UI does not support the following pools:" msgstr "此 UI 不支持以下池" #: src/components/PageDashboard/index.tsx:66 #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "+ Incentives)" -#~ msgstr "+ 激勵)" +msgid "+ Incentives)" +msgstr "+ 激勵)" #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:18 msgid "1 month" @@ -149,7 +137,7 @@ msgstr "1週" msgid "1 year" msgstr "1年" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:67 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:76 msgid "24h Volume/Liquidity ratio" msgstr "24小時 交易量/流動池儲備" @@ -157,18 +145,10 @@ msgstr "24小時 交易量/流動池儲備" msgid "3 months" msgstr "3個月" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:92 -msgid "3CRV have been claimed and sent to 3pool." -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:22 msgid "4 years" msgstr "4年" -#: src/components/PageRiskDisclaimer/index.tsx:72 -msgid "5-of-9 multisig" -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:20 msgid "6 months" msgstr "6個月" @@ -177,30 +157,26 @@ msgstr "6個月" #~ msgid "A" #~ msgstr "A值" -#: src/components/PageCreatePool/Parameters/index.tsx:301 -#: src/components/PageCreatePool/Parameters/index.tsx:334 +#: src/components/PageCreatePool/Parameters/index.tsx:296 +#: src/components/PageCreatePool/Parameters/index.tsx:329 msgid "A ({0} - {1})" msgstr "A值 ({0} - {1})" -#: src/components/PageCreatePool/constants.ts:224 +#: src/components/PageCreatePool/constants.ts:192 msgid "A more gas-efficient implementation that can be used when every token in the pool has 18 decimals and returns True on success / reverts on error" msgstr "一個更加節能的實現方式,當池中的每個代幣都有18位小數時,可以使用該方式,在成功時返回True / 在錯誤時返回錯誤。" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:75 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:193 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:28 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:83 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:65 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:169 msgid "A:" msgstr "A值:" -#: src/components/PageRiskDisclaimer/index.tsx:61 -msgid "Access Control:" -msgstr "" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 msgid "Action" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:41 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:42 msgid "Add" msgstr "" @@ -208,33 +184,28 @@ msgstr "" msgid "Add all coins in a balanced proportion" msgstr "以平衡的比例添加所有代幣" -#: src/components/PagePool/components/AddGaugeLink.tsx:58 +#: src/components/PagePool/components/AddGaugeLink.tsx:50 msgid "Add Gauge" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:796 +#: src/components/PageCreatePool/TokensInPool/index.tsx:639 msgid "Add token" msgstr "新增代幣" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:146 -#: src/components/PagePoolList/components/TableRowMobile.tsx:149 -msgid "Additional external rewards" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:291 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:280 msgid "Additional slippage tolerance" msgstr "額外的滑點容差" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:291 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:476 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:288 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:475 msgid "Additional slippage tolerance:" msgstr "額外的滑點容差" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:77 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 msgid "Address (e.g 0x123...)" msgstr "" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:71 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:57 msgid "Address:" msgstr "" @@ -242,12 +213,12 @@ msgstr "" msgid "Adjust veCrv" msgstr "調整 veCrv" -#: src/components/PageCreatePool/Parameters/index.tsx:380 +#: src/components/PageCreatePool/Parameters/index.tsx:375 msgid "Adjustment Step ({0} - {1})" msgstr "調整步驟 ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:280 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:118 msgid "Adjustment Step:" msgstr "調整步驟:" @@ -255,42 +226,33 @@ msgstr "調整步驟:" #~ msgid "Admin fee" #~ msgstr "管理費" -#: src/components/PageCreatePool/Parameters/index.tsx:289 -#: src/components/PageCreatePool/Summary/index.tsx:28 -#: src/components/PagePool/index.tsx:129 +#: src/components/PageCreatePool/Parameters/index.tsx:284 +#: src/components/PageCreatePool/Summary/index.tsx:41 +#: src/components/PagePool/index.tsx:106 +#: src/components/PagePool/index.tsx:115 msgid "Advanced" msgstr "進階" -#: src/components/AdvancedSettings.tsx:140 +#: src/components/AdvancedSettings.tsx:131 msgid "Advanced Settings" msgstr "進階設定" -#: src/components/PagePoolList/index.tsx:96 +#: src/components/PagePoolList/index.tsx:102 msgid "ALL" msgstr "全部" -#: src/components/PageCreatePool/Parameters/index.tsx:358 +#: src/components/PageCreatePool/Parameters/index.tsx:353 msgid "Allowed Extra Profit ({0} - {1})" msgstr "允許的額外利潤 ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:91 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:268 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:106 msgid "Allowed Extra Profit:" msgstr "允許的額外利潤" -#: src/components/PagePool/Swap/index.tsx:402 -#: src/components/PageRouterSwap/index.tsx:431 -msgid "Amount > wallet balance {0}" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:173 -#~ msgid "Amplification coefficient chosen from fluctuation of prices around 1" -#~ msgstr "從1的價格波動中選擇出的放大係數A值" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:200 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:34 -msgid "Amplification coefficient chosen from fluctuation of prices around 1." -msgstr "" +msgid "Amplification coefficient chosen from fluctuation of prices around 1" +msgstr "從1的價格波動中選擇出的放大係數A值" #: src/domain/transfer/withdraw/form-withdraw/withdraw-actions.tsx:311 #~ msgid "Approve Remove Liquidity" @@ -298,12 +260,12 @@ msgstr "" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Approve Spending" msgstr "批准交易" @@ -311,31 +273,11 @@ msgstr "批准交易" #~ msgid "Approving" #~ msgstr "批准中" -#: src/layout/default/Header.tsx:193 -msgid "Apps" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:99 -msgid "are designed to mitigate impermanent loss by pairing assets that are expected to exhibit mean-reverting behavior. This assumption may not hold true in every case, requiring diligent assessment when interacting with these pools." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:105 -msgid "are designed with an internal oracle to concentrate liquidity around the current market price. The algorithm attempts to offset the effects of impermanent loss by calculating fees generated by the pool and ensuring the pool is in profit before re-pegging. Impermanent loss may still occur in CryptoSwap V2 pools, particularly when the earned fees are insufficient to counterbalance the impact of re-pegging. This underscores the need for users to be attentive about the dynamics of these pools when making decisions about liquidity provision." -msgstr "" - -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:48 -msgid "As the number of staked LP Tokens increases, the CRV tAPR will decrease." -msgstr "" - #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Asc" -#~ msgstr "上升" - -#: src/components/PageRiskDisclaimer/index.tsx:79 -msgid "Asset Risk" -msgstr "" +msgid "Asc" +msgstr "上升" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:54 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:76 msgid "Asset Type:" msgstr "資產類型:" @@ -347,15 +289,15 @@ msgstr "資產類型:" #~ msgid "Audit" #~ msgstr "審計" -#: src/layout/default/Footer.tsx:136 +#: src/layout/default/Footer.tsx:102 msgid "Audits" msgstr "審計" #: src/components/PagePool/components/FieldToken.tsx:69 -#: src/components/PagePool/Swap/index.tsx:352 -#: src/components/PagePool/Swap/index.tsx:443 -#: src/components/PageRouterSwap/index.tsx:391 -#: src/components/PageRouterSwap/index.tsx:457 +#: src/components/PagePool/Swap/index.tsx:347 +#: src/components/PagePool/Swap/index.tsx:438 +#: src/components/PageRouterSwap/index.tsx:370 +#: src/components/PageRouterSwap/index.tsx:427 msgid "Avail." msgstr "可用的" @@ -367,8 +309,8 @@ msgstr "可用的" #~ msgid "Average value of pool token" #~ msgstr "池的代幣的平均價值" -#: src/components/PageDashboard/components/TableRow.tsx:181 -#: src/components/PageDashboard/index.tsx:56 +#: src/components/PageDashboard/components/TableRow.tsx:179 +#: src/components/PageDashboard/index.tsx:67 msgid "Balance" msgstr "餘額" @@ -380,7 +322,7 @@ msgstr "投票託管餘額:" #~ msgid "Balance minus estimated gas" #~ msgstr "餘額減去估計的gas費用" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:354 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:353 msgid "Balanced" msgstr "" @@ -388,47 +330,35 @@ msgstr "" #~ msgid "Balanced amounts" #~ msgstr "餘額" -#: src/components/PagePool/UserDetails/index.tsx:140 +#: src/components/PagePool/UserDetails/index.tsx:139 msgid "Balanced withdraw amounts" msgstr "平均提款金額" -#: src/components/PageCreatePool/constants.ts:210 +#: src/components/PageCreatePool/constants.ts:178 msgid "Balances" msgstr "餘額" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:39 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:40 msgid "Base" msgstr "基礎" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:169 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:243 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:205 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:201 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:126 msgid "BASE" msgstr "" -#: src/components/PageDashboard/index.tsx:53 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 -#: src/components/PagePoolList/Page.tsx:55 +#: src/components/PageDashboard/index.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:48 +#: src/components/PagePoolList/Page.tsx:57 msgid "Base vAPY" msgstr "基礎 vAPY" -#: src/components/PagePoolList/components/TableRowMobile.tsx:123 -msgid "BASE vAPY" -msgstr "" - -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:42 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:41 msgid "Base vAPY can temporarily be negative when A parameter is ramped down, or crypto pools spend profit to rebalance." msgstr "當A值下降或crypto池花費利潤在重新平衡時,基本 vAPY 可能暫時會呈現負數。" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:100 -msgid "Basepool" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:105 -msgid "Basepool:" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:204 +#: src/components/PageCreatePool/constants.ts:172 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:34 msgid "Basic" msgstr "基礎" @@ -437,11 +367,11 @@ msgstr "基礎" #~ msgid "Beta" #~ msgstr "Beta" -#: src/components/PageCreatePool/PoolType/index.tsx:32 +#: src/components/PageCreatePool/PoolType/index.tsx:30 msgid "Bonding Curve specialising in pegged assets." msgstr "專門針對挂鉤資產的curve曲線。" -#: src/components/PageCreatePool/PoolType/index.tsx:45 +#: src/components/PageCreatePool/PoolType/index.tsx:43 msgid "Bonding Curve specialising in unpegged assets." msgstr "專門針對非挂鉤資產的curve曲線。" @@ -449,7 +379,7 @@ msgstr "專門針對非挂鉤資產的curve曲線。" msgid "Bonus comes as an advantage from current coin prices which usually appears for coins which are low in balance" msgstr "Bonus來自當前幣價的優勢,通常出現在餘額低的代幣上" -#: src/layout/default/Footer.tsx:141 +#: src/layout/default/Footer.tsx:119 msgid "Bug Bounty" msgstr "漏洞回報獎勵計畫" @@ -457,15 +387,11 @@ msgstr "漏洞回報獎勵計畫" #~ msgid "Calc" #~ msgstr "計算" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:228 -msgid "Can't find the pool preset you want? Check out" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:159 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:162 -#: src/components/PagePool/Swap/index.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:172 -#: src/components/PageRouterSwap/index.tsx:237 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:156 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:157 +#: src/components/PagePool/Swap/index.tsx:200 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:171 +#: src/components/PageRouterSwap/index.tsx:232 msgid "Cancel" msgstr "取消" @@ -481,35 +407,35 @@ msgstr "取消" #~ msgid "Change network" #~ msgstr "轉換網路" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:249 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:209 msgid "Chart" msgstr "" -#: src/components/PageCreatePool/components/Navigation.tsx:27 -#: src/components/PageCreatePool/components/Navigation.tsx:39 -#: src/components/PageCreatePool/components/Navigation.tsx:52 -#: src/components/PageCreatePool/components/Navigation.tsx:65 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:130 -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:24 -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:32 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:27 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:59 -#: src/components/PageDeployGauge/ProcessSummary.tsx:46 -#: src/components/PageDeployGauge/ProcessSummary.tsx:78 +#: src/components/PageCreatePool/components/Navigation.tsx:38 +#: src/components/PageCreatePool/components/Navigation.tsx:62 +#: src/components/PageCreatePool/components/Navigation.tsx:105 +#: src/components/PageCreatePool/components/Navigation.tsx:156 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:236 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:46 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:55 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:26 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:57 +#: src/components/PageDeployGauge/ProcessSummary.tsx:39 +#: src/components/PageDeployGauge/ProcessSummary.tsx:60 msgid "Checkmark filled" msgstr "勾選填滿" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Chevron left" msgstr "向左" -#: src/components/PageCreatePool/components/Navigation.tsx:29 -#: src/components/PageCreatePool/components/Navigation.tsx:42 -#: src/components/PageCreatePool/components/Navigation.tsx:55 -#: src/components/PageCreatePool/components/Navigation.tsx:68 -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:64 +#: src/components/PageCreatePool/components/Navigation.tsx:107 +#: src/components/PageCreatePool/components/Navigation.tsx:158 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Chevron right" msgstr "向右" @@ -518,10 +444,6 @@ msgstr "向右" #~ msgid "Claim" #~ msgstr "領取" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:56 -msgid "Claim 3CRV" -msgstr "" - #: src/components/PagePool/Withdraw/utils.ts:87 msgid "Claim CRV" msgstr "領取 CRV" @@ -530,20 +452,16 @@ msgstr "領取 CRV" msgid "Claim CRV Complete" msgstr "獎勵 CRV 領取 完成" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:57 -msgid "Claim crvUSD" -msgstr "" - #: src/domain/transfer/withdraw/form-claim/index.tsx:149 #~ msgid "Claim Failed" #~ msgstr "獎勵領取 失敗" #: src/components/PageDashboard/components/FormClaimFees.tsx:119 -#~ msgid "Claim LP rewards" -#~ msgstr "領取LP獎勵" +msgid "Claim LP rewards" +msgstr "領取LP獎勵" #: src/components/PagePool/Withdraw/components/FormClaim.tsx:110 -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:246 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:247 #: src/components/PagePool/Withdraw/index.tsx:33 msgid "Claim Rewards" msgstr "領取獎勵" @@ -556,9 +474,9 @@ msgstr "獎勵領取 完成" #~ msgid "Claim Rewards Failed" #~ msgstr "獎勵領取 失敗" -#: src/components/PageDashboard/components/Summary.tsx:64 -#: src/components/PageDashboard/components/TableRow.tsx:176 -#: src/components/PageDashboard/index.tsx:59 +#: src/components/PageDashboard/components/Summary.tsx:65 +#: src/components/PageDashboard/components/TableRow.tsx:174 +#: src/components/PageDashboard/index.tsx:70 msgid "Claimable Tokens" msgstr "未領取獎勵" @@ -566,10 +484,6 @@ msgstr "未領取獎勵" msgid "Claimed {balance}" msgstr "" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:85 -msgid "Claimed {key}" -msgstr "" - #: src/components/PagePool/Withdraw/utils.ts:82 msgid "Claimed {tokensMessage}" msgstr "領取完成 {tokensMessage}" @@ -584,14 +498,8 @@ msgstr "領取中" #: src/layout/default/HeaderMobile.tsx:162 #: src/layout/default/HeaderSecondary.tsx:79 -#~ msgid "Classic UI" -#~ msgstr "舊用戶界面" - -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:74 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:81 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:100 -msgid "Clear" -msgstr "" +msgid "Classic UI" +msgstr "舊用戶界面" #: src/domain/transfer/pool-stats/rewards.tsx:45 #~ msgid "Click here to learn more about Base vAPY." @@ -601,45 +509,29 @@ msgstr "" #~ msgid "Click here to learn more about Boosting your CRV rewards." #~ msgstr "單擊此處了解更多關於提升CRV獎勵的資訊。" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:72 -msgid "Click here to learn more about Cryptoswap pools" -msgstr "" - #: src/components/PagePool/PoolDetails/PoolStats/index.tsx:81 -#~ msgid "Click here to learn more about v2 pools" -#~ msgstr "單擊此處了解有關v2池的資訊" +msgid "Click here to learn more about v2 pools" +msgstr "單擊此處了解有關v2池的資訊" -#: src/layout/default/Footer.tsx:44 -#: src/layout/default/Footer.tsx:65 +#: src/layout/default/Footer.tsx:39 +#: src/layout/default/Footer.tsx:60 msgid "CN" msgstr "中文" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:125 -msgid "Coins:" -msgstr "" - -#: src/layout/default/Header.tsx:194 +#: src/layout/default/HeaderMobile.tsx:172 msgid "Community" msgstr "社區" -#: src/components/PageCompensation/Page.tsx:67 -#: src/components/PageCompensation/Page.tsx:71 +#: src/components/PageCompensation/Page.tsx:60 +#: src/components/PageCompensation/Page.tsx:64 msgid "Compensation" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:74 -msgid "composed of Curve community members. It has restricted rights to undertake actions that do not directly impact users' funds, including canceling parameter changes authorized by the DAO and halting CRV emissions to a pool. Early pool implementations included a timelimited function to freeze swaps and deposits in case of emergency, but this precautionary function has since been deprecated in current pool implementations." -msgstr "" - #: src/components/PageCreatePool/ConfirmModal/index.tsx:253 -#~ msgid "Confirm pool setup" -#~ msgstr "確認池設置" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:71 -msgid "Confirm Pool Setup" -msgstr "" +msgid "Confirm pool setup" +msgstr "確認池設置" -#: src/components/PagePool/components/WarningModal.tsx:89 +#: src/components/PagePool/components/WarningModal.tsx:82 msgid "Confirm warning to proceed." msgstr "確認警告以繼續。" @@ -647,76 +539,59 @@ msgstr "確認警告以繼續。" #~ msgid "Connect" #~ msgstr "連結" -#: src/components/PageDeployGauge/DeploySidechain.tsx:88 +#: src/components/PageDeployGauge/DeploySidechain.tsx:79 msgid "Connect to a sidechain in order to complete the first step and deploy a sidechain gauge." msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:87 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:168 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:560 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:625 msgid "Connect to Ethereum" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:73 +#: src/components/PageDeployGauge/DeployMainnet.tsx:64 msgid "Connect to Ethereum in order to deploy gauge." msgstr "" -#: src/components/PageDeployGauge/DeploySidechain.tsx:84 +#: src/components/PageDeployGauge/DeploySidechain.tsx:75 msgid "Connect to Ethereum in order to deploy mirror gauge." msgstr "" -#: src/components/FormConnectWallet.tsx:25 -#: src/components/PageCompensation/Page.tsx:90 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:30 +#: src/components/ConnectWallet.tsx:46 +#: src/components/PageCompensation/Page.tsx:77 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:375 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:78 #: src/components/PageCrvLocker/components/FormActions.tsx:23 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:97 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:178 -#: src/components/PagePool/Page.tsx:81 -#: src/components/PagePoolList/index.tsx:245 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:570 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:635 +#: src/components/PagePool/components/TransferActions.tsx:62 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:29 msgid "Connect Wallet" msgstr "連結錢包" -#: src/components/PagePool/Page.tsx:80 -msgid "Connect wallet to view pool" -msgstr "" - -#: src/components/PagePoolList/index.tsx:244 -msgid "Connect wallet to view pool list" -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:91 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:172 -#: src/components/PagePool/Page.tsx:82 -#: src/components/PagePoolList/index.tsx:246 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:564 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:629 msgid "Connecting" msgstr "" -#: src/components/PageCreatePool/index.tsx:174 +#: src/components/PageCreatePool/index.tsx:113 msgid "Connecting to network" msgstr "連接網絡中" #: src/components/PageCreatePool/Parameters/index.tsx:268 #: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#~ msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" -#~ msgstr "為了提高 AMM 的效能,請考慮選擇單位價格較高的代幣作為第一個代幣。" +msgid "Consider choosing the token with the higher unit price as the first token for a more performant AMM" +msgstr "為了提高 AMM 的效能,請考慮選擇單位價格較高的代幣作為第一個代幣。" #: src/domain/create-pool/confirm-modal/index.tsx:318 #: src/domain/create-pool/summary/index.tsx:146 #~ msgid "Contains rebasing tokens:" #~ msgstr "包含重定基(rebase)代幣代幣:" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:25 -#: src/layout/default/Footer.tsx:118 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:23 +#: src/layout/default/Footer.tsx:114 msgid "Contracts" msgstr "智能合約" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:53 -msgid "Copy address" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:59 -msgid "Counterparty Risk" -msgstr "" - #: src/domain/create-pool/index.tsx:82 #~ msgid "CREATE CURVE POOL" #~ msgstr "建立Curve池" @@ -729,18 +604,14 @@ msgstr "創建鎖倉" #~ msgid "Create lock spending approved" #~ msgstr "創建鎖倉餘額被允許使用" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:42 -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:47 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:121 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:145 -#: src/components/PageCreatePool/Page.tsx:31 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:383 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:388 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:218 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:248 +#: src/components/PageCreatePool/Page.tsx:28 msgid "Create Pool" msgstr "建立池" -#: src/components/PagePoolList/index.tsx:105 -msgid "Cross-chain" -msgstr "" - #: src/domain/crv-locker/form-lock-crv/index.tsx:122 #~ msgid "CRV approved" #~ msgstr "CRV 被允許使用" @@ -761,7 +632,7 @@ msgstr "CRV 可用的" #~ msgid "CRV locked {0}" #~ msgstr "CRV已被鎖 {0}" -#: src/components/PageDashboard/components/FormVecrv.tsx:188 +#: src/components/PageDashboard/components/FormVecrv.tsx:181 msgid "CRV locked:" msgstr "CRV已被鎖:" @@ -769,32 +640,30 @@ msgstr "CRV已被鎖:" msgid "CRV Locked: {0}" msgstr "CRV已被鎖:{0}" -#: src/components/PageCrvLocker/Page.tsx:74 -#: src/components/PageCrvLocker/Page.tsx:78 +#: src/components/PageCrvLocker/Page.tsx:75 +#: src/components/PageCrvLocker/Page.tsx:79 msgid "CRV Locker" msgstr "CRV 鎖倉" #~ msgid "CRV LP reward annualized (max APY can be reached with max boost of 2.50)" #~ msgstr "CRV LP獎勵年化(APY可以達到最大提升2.50倍)" -#: src/components/PoolRewardsCrv.tsx:96 +#: src/components/PoolRewardsCrv.tsx:73 msgid "CRV LP reward annualized (max tAPR can be reached with max boost of 2.50)" msgstr "CRV LP獎勵年化(tAPR可以達到最大提升2.50倍)" -#: src/components/PageDashboard/index.tsx:58 +#: src/components/PageDashboard/index.tsx:69 msgid "CRV Profits" msgstr "CRV 利潤" -#: src/components/PagePoolList/index.tsx:101 +#: src/components/PagePoolList/index.tsx:107 +#: src/layout/default/Header.tsx:120 +#: src/layout/default/HeaderMobile.tsx:143 msgid "crvUSD" msgstr "crvUSD" -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:93 -msgid "crvUSD has been claimed and sent to your wallet." -msgstr "" - -#: src/components/PageCreatePool/constants.ts:103 -#: src/components/PagePoolList/index.tsx:103 +#: src/components/PageCreatePool/constants.ts:87 +#: src/components/PagePoolList/index.tsx:109 msgid "Crypto" msgstr "加密貨幣" @@ -806,7 +675,7 @@ msgstr "加密貨幣" #~ msgid "Crypto collateralized stablecoin" #~ msgstr "加密貨幣抵押穩定幣" -#: src/components/PageCreatePool/constants.ts:78 +#: src/components/PageCreatePool/constants.ts:74 msgid "Crypto Collateralized Stablecoins" msgstr "加密貨幣抵押穩定幣" @@ -815,37 +684,26 @@ msgstr "加密貨幣抵押穩定幣" #~ msgid "Crypto Share" #~ msgstr "加密貨幣份額" -#: src/components/PagePool/index.tsx:219 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:13 +#: src/components/PagePool/index.tsx:201 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:11 msgid "CRYPTO V2" msgstr "加密貨幣 V2" -#: src/layout/default/Header.tsx:71 +#: src/layout/default/HeaderMobile.tsx:225 +#: src/layout/default/HeaderSecondary.tsx:66 msgid "Crypto Volume Share" msgstr "加密貨幣交易量份額" -#: src/components/PageRiskDisclaimer/index.tsx:110 -msgid "Cryptocurrencies and ERC20 tokens have historically exhibited significant price volatility. They can experience rapid and substantial fluctuations in value, which may occur within short periods of time. The market value of any token may rise or fall, and there is no guarantee of any specific price stability." -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:44 -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 +#: src/components/PageCreatePool/PoolType/index.tsx:42 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Cryptoswap" msgstr "加密貨幣交換" -#: src/components/PageCreatePool/PoolType/index.tsx:50 +#: src/components/PageCreatePool/PoolType/index.tsx:48 msgid "Cryptoswap pools are currently unavailable on this chain" msgstr "此鏈上當前無法使用Cryptoswap池。" -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:70 -msgid "Cryptoswap pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:103 -msgid "CryptoSwap V2 pools" -msgstr "" - -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:38 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:40 msgid "Currency reserves" msgstr "幣儲備" @@ -853,7 +711,7 @@ msgstr "幣儲備" #~ msgid "Current" #~ msgstr "當前的" -#: src/components/PagePool/UserDetails/index.tsx:124 +#: src/components/PagePool/UserDetails/index.tsx:127 msgid "Current Boost:" msgstr "此刻的CRV加速" @@ -865,36 +723,16 @@ msgstr "" #~ msgid "Current unlocked date" #~ msgstr "當前解鎖時間" -#: src/components/PageRiskDisclaimer/index.tsx:20 -msgid "Curve Pool Risk Disclosures for Liquidity Providers" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:63 -msgid "Curve pool smart contracts are intentionally designed to be immutable and noncustodial, meaning they cannot be upgraded and liquidity providers always retain full control of their funds. While this characteristic may limit protective actions in case of emergencies, it significantly strengthens user assurances about custody of their funds." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:44 -msgid "Curve relies on smart contracts, which are self-executing pieces of code. While these contracts are designed to be secure, there is a risk that they may contain vulnerabilities or bugs. Malicious actors could exploit these vulnerabilities, resulting in the loss of funds or other adverse consequences. It is essential for users to conduct due diligence and review the smart contracts and security audit reports to assess the inherent risks." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:48 -msgid "Curve smart contracts have undergone multiple audits by reputable firms including Trail of Bits, MixBytes, QuantStamp, and ChainSecurity to enhance protocol security. While smart contract audits play an important role in good security practices to mitigate user risks, they don't eliminate all risks. Users should always exercise caution regardless of Curve's commitment to protocol security." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:31 -msgid "Curve Whitepapers" -msgstr "" - -#: src/components/AdvancedSettings.tsx:204 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:358 +#: src/components/AdvancedSettings.tsx:195 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:357 msgid "Custom" msgstr "自訂" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:39 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:33 msgid "Daily" msgstr "每日" -#: src/components/PageDashboard/components/Summary.tsx:63 +#: src/components/PageDashboard/components/Summary.tsx:64 msgid "Daily Profits" msgstr "每日利潤" @@ -902,26 +740,26 @@ msgstr "每日利潤" #~ msgid "Daily USD volume" #~ msgstr "每日美元交易量" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:57 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:69 msgid "Daily USD volume:" msgstr "每日美元交易量:" -#: src/layout/default/Header.tsx:70 +#: src/layout/default/HeaderMobile.tsx:216 +#: src/layout/default/HeaderSecondary.tsx:58 msgid "Daily Volume" msgstr "每日交易量" #: src/layout/default/HeaderMobile.tsx:163 #: src/layout/default/HeaderSecondary.tsx:82 -#~ msgid "DAO" -#~ msgstr "" +msgid "DAO" +msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:24 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:20 msgid "DAO fee:" msgstr "DAO 費用:" -#: src/components/PageDashboard/Page.tsx:34 -#: src/layout/default/Header.tsx:79 -#: src/layout/default/Header.tsx:86 +#: src/components/PageDashboard/Page.tsx:32 +#: src/layout/default/Header.tsx:34 msgid "Dashboard" msgstr "控制板" @@ -929,102 +767,59 @@ msgstr "控制板" #~ msgid "days" #~ msgstr "天" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:200 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:86 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:646 #: src/components/PageDeployGauge/Page.tsx:28 msgid "Deploy Gauge" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:36 +#: src/components/PageDeployGauge/ProcessSummary.tsx:35 msgid "Deploy gauge on sidechain" msgstr "" -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Mainnet Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:146 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:603 msgid "Deploy Mirror Gauge" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:67 +#: src/components/PageDeployGauge/ProcessSummary.tsx:55 msgid "Deploy mirror gauge on Ethereum using the same sidechain LP token address" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:140 -#: src/components/PageDeployGauge/index.tsx:80 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:598 +#: src/components/PageDeployGauge/index.tsx:79 msgid "Deploy Sidechain Gauge" msgstr "" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:205 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:91 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:651 msgid "Deploying Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:215 -#: src/store/createDeployGaugeSlice.ts:252 -#: src/store/createDeployGaugeSlice.ts:289 -#: src/store/createDeployGaugeSlice.ts:326 -#: src/store/createDeployGaugeSlice.ts:362 -msgid "Deploying gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:158 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:615 msgid "Deploying Mirror Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:611 -#: src/store/createDeployGaugeSlice.ts:650 -#: src/store/createDeployGaugeSlice.ts:689 -#: src/store/createDeployGaugeSlice.ts:728 -#: src/store/createDeployGaugeSlice.ts:764 -msgid "Deploying mirror gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/ProcessSummary.tsx:72 -msgid "Deploying mirror gauge..." -msgstr "" - -#: src/store/createCreatePoolSlice.ts:836 -#: src/store/createCreatePoolSlice.ts:917 -#: src/store/createCreatePoolSlice.ts:1015 -#: src/store/createCreatePoolSlice.ts:1086 -#: src/store/createCreatePoolSlice.ts:1175 -#: src/store/createCreatePoolSlice.ts:1254 -msgid "Deploying pool {poolName}..." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:201 -msgid "Deploying Pool {poolName}..." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:152 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:609 msgid "Deploying Sidechain Gauge" msgstr "" -#: src/store/createDeployGaugeSlice.ts:408 -#: src/store/createDeployGaugeSlice.ts:446 -#: src/store/createDeployGaugeSlice.ts:484 -#: src/store/createDeployGaugeSlice.ts:522 -#: src/store/createDeployGaugeSlice.ts:560 -msgid "Deploying sidechain gauge for {shortenAddress}..." -msgstr "" - -#: src/components/PageDeployGauge/ProcessSummary.tsx:40 -msgid "Deploying sidechain gauge..." -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 -#: src/components/PagePool/Deposit/index.tsx:35 -#: src/components/PagePool/index.tsx:196 -#: src/components/PagePoolList/components/TableRowMobile.tsx:159 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 +#: src/components/PagePool/Deposit/index.tsx:34 +#: src/components/PagePool/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:165 msgid "Deposit" msgstr "存入" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 -#: src/components/PagePool/Deposit/index.tsx:37 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 +#: src/components/PagePool/Deposit/index.tsx:36 msgid "Deposit & Stake" msgstr "存入和質押" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:146 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:141 msgid "Deposit & Stake Complete" msgstr "存入和質押 完成" @@ -1032,11 +827,11 @@ msgstr "存入和質押 完成" #~ msgid "Deposit & Stake Failed" #~ msgstr "存入和質押 失敗" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:109 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 msgid "Deposit and staked {tokenText}" msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:143 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:140 msgid "Deposit Complete" msgstr "存入 成功" @@ -1056,35 +851,31 @@ msgstr "存入 封裝代幣" #~ msgid "Deposited {tokenText}, received {receivedLpTokens} LP Tokens" #~ msgstr "存入 {tokenText},收到 {receivedLpTokens} 個 LP 代幣" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:106 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:103 msgid "Deposited {tokenText}." msgstr "存入 {tokenText}。" #: src/components/PagePoolList/components/DialogSort/DialogSortContent.tsx:27 -#~ msgid "Desc" -#~ msgstr "下降" +msgid "Desc" +msgstr "下降" -#: src/layout/default/Footer.tsx:113 +#: src/layout/default/Footer.tsx:137 msgid "Developer Docs" msgstr "開發人員文檔" -#: src/components/PagePoolList/index.tsx:276 +#: src/components/PagePoolList/index.tsx:261 msgid "Didn't find what you're looking for?" msgstr "沒有找到您要查找的內容?" -#: src/components/AdvancedSettings.tsx:145 +#: src/components/AdvancedSettings.tsx:136 msgid "Discard" msgstr "丟棄" -#: src/components/PageRiskDisclaimer/index.tsx:142 -msgid "Disclaimer: The information provided within this context does not constitute financial, legal, or tax advice personalized to your specific circumstances. The content presented is for informational purposes only and should not be relied upon as a substitute for professional advice tailored to your individual needs. It is recommended that you seek the advice of qualified professionals regarding financial, legal, and tax matters before engaging in any activities on Curve." -msgstr "" - -#: src/layout/default/Footer.tsx:52 +#: src/layout/default/Footer.tsx:47 msgid "Dodo" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:272 +#: src/components/PageCreatePool/Parameters/index.tsx:261 msgid "Dollar prices are fetched from coingecko." msgstr "" @@ -1093,16 +884,8 @@ msgstr "" #~ msgstr "美元價格從 Coingecko 獲取。{0}" #: src/layout/default/Footer.tsx:132 -#~ msgid "Donate" -#~ msgstr "捐款" - -#: src/components/PageRiskDisclaimer/index.tsx:128 -msgid "Due to composability within DeFi, it is possible for assets in Curve pools to be receipt tokens for deposits in third party lending platforms. Composability of this sort can amplify yields for liquidity providers, but it also exposes users to additional risks associated with the underlying lending protocol. Users interacting with pools that involve lending assets should be mindful of this additional risk and conduct due diligence on the associated lending protocol." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:119 -msgid "Due to the permissionless pool factory and the absence of strict onboarding criteria, not every token included in Curve pools undergoes a detailed independent risk assessment. Curve pools may contain unvetted tokens that have uncertain value or potential fraudulent characteristics. The presence of unvetted tokens introduces potential risks, including exchange rate volatility, smart contract vulnerabilities, liquidity risks, and other unforeseen circumstances that could result in the loss of funds or other adverse consequences." -msgstr "" +msgid "Donate" +msgstr "捐款" #: src/domain/dialogs/dialog-waves-provider.tsx:21 #~ msgid "Email" @@ -1112,16 +895,15 @@ msgstr "" #~ msgid "Enable to process transaction." #~ msgstr "啟用以處理交易。" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:212 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:140 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:134 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:101 msgid "ERC4626" msgstr "" #: src/components/Page404/Page.tsx:11 #: src/pages/404.tsx:11 -#~ msgid "Error 404" -#~ msgstr "錯誤 404" +msgid "Error 404" +msgstr "錯誤 404" #: src/components/PagePool/components/DetailInfoEstTokens.tsx:18 msgid "Estimated Received:" @@ -1131,15 +913,15 @@ msgstr "預計收到:" #~ msgid "Estimated TX cost" #~ msgstr "估計交易成本" -#: src/components/DetailInfoEstGas.tsx:84 +#: src/components/DetailInfoEstGas.tsx:78 msgid "Estimated TX cost:" msgstr "估計交易成本:" #: src/layout/default/Footer.tsx:109 -#~ msgid "Events" -#~ msgstr "事件" +msgid "Events" +msgstr "事件" -#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoExchangeRate.tsx:27 msgid "Exchange rate" msgstr "兑换比例" @@ -1147,38 +929,30 @@ msgstr "兑换比例" #~ msgid "Exchange rate is too low!" #~ msgstr "匯率太低了!" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:231 -msgid "existing pools" -msgstr "" - -#: src/components/PagePool/index.tsx:251 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:261 +#: src/components/PagePool/index.tsx:227 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:221 msgid "Expand chart" msgstr "" -#: src/components/PagePool/components/DetailInfoExpectedApy.tsx:46 -msgid "Expected CRV tAPR:" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:53 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:47 msgid "EYWA fee:" msgstr "" #: src/hooks/usePoolAlert.tsx:91 -#~ msgid "EYWA Links:" -#~ msgstr "" +msgid "EYWA Links:" +msgstr "" #: src/components/PagePoolList/components/TableCellFactory.tsx:15 -#~ msgid "Factory" -#~ msgstr "工廠池" +msgid "Factory" +msgstr "工廠池" #: src/components/PagePool/index.tsx:210 -#~ msgid "FACTORY" -#~ msgstr "工廠池" +msgid "FACTORY" +msgstr "工廠池" #: src/components/PagePoolList/components/TableCellFactory.tsx:14 -#~ msgid "Factory pools are permissionless, deployed by anyone." -#~ msgstr "工廠池是無需許可的,任何人都可以部署。" +msgid "Factory pools are permissionless, deployed by anyone." +msgstr "工廠池是無需許可的,任何人都可以部署。" #: src/layout/default/Footer.tsx:134 #~ msgid "FAQ" @@ -1188,20 +962,20 @@ msgstr "" #~ msgid "Fee" #~ msgstr "費用" -#: src/components/PageCreatePool/Parameters/index.tsx:369 +#: src/components/PageCreatePool/Parameters/index.tsx:364 msgid "Fee Gamma ({0} - {1})" msgstr "手續費 Gamma ({0} - {1})" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:99 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:274 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:107 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 msgid "Fee Gamma:" msgstr "手續費 Gamma:" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:84 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:91 msgid "Fee:" msgstr "費用:" -#: src/components/PageCreatePool/Parameters/index.tsx:218 +#: src/components/PageCreatePool/Parameters/index.tsx:207 msgid "Fees" msgstr "費用" @@ -1209,7 +983,7 @@ msgstr "費用" #~ msgid "Fiat Redeemable Stablecoin" #~ msgstr "可兌換法幣的穩定幣" -#: src/components/PageCreatePool/constants.ts:66 +#: src/components/PageCreatePool/constants.ts:62 msgid "Fiat Redeemable Stablecoins" msgstr "可兌換法幣的穩定幣" @@ -1217,32 +991,27 @@ msgstr "可兌換法幣的穩定幣" #~ msgid "Filter by" #~ msgstr "篩選方式" -#: src/components/PageCreatePool/constants.ts:218 +#: src/components/PageCreatePool/constants.ts:186 msgid "For pools containing native {0} (represented as 0xEE…EE)" msgstr "針對包含原生 {0}(表示為 0xEE…EE)的池。" -#: src/components/PageCreatePool/constants.ts:206 +#: src/components/PageCreatePool/constants.ts:174 msgid "For pools that supports any major ERC20 return implementation (”return True / revert”, “return None / revert”, “return True / return False”), and any number of decimal places up to 18" msgstr "針對支援任何主要 ERC20 回傳實現方式(\"return True / revert\"、\"return None / revert\"、\"return True / return False\"),以及最多18位小數位數的任何 ERC20 池。" -#: src/components/PageCreatePool/constants.ts:212 +#: src/components/PageCreatePool/constants.ts:180 msgid "For pools with rebase tokens like aTokens, or where there's a fee-on-transfer." msgstr "針對具有重定基(rebase)代幣(如 aToken)或存在轉移費用的池。" -#: src/components/PageCreatePool/constants.ts:119 +#: src/components/PageCreatePool/constants.ts:103 msgid "Forex" msgstr "外匯 (Forex)" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:90 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:66 msgid "Function (e.g exchangeRate())" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:168 -msgid "Function ID:" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:90 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:163 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:76 msgid "Function:" msgstr "" @@ -1250,15 +1019,16 @@ msgstr "" #~ msgid "Future" #~ msgstr "未來" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:44 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:42 msgid "Gauge" msgstr "權重" -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:196 +#: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:95 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:642 msgid "Gauge Deployed Successfully" msgstr "" -#: src/components/PageDeployGauge/index.tsx:131 +#: src/components/PageDeployGauge/index.tsx:136 msgid "Gauge deployment is not supported on this network." msgstr "" @@ -1267,27 +1037,27 @@ msgstr "" #~ msgstr "權重投票" #: src/components/PageCreatePool/ConfirmModal/index.tsx:290 -#~ msgid "Go to deploy sidechain gauge" -#~ msgstr "" +msgid "Go to deploy sidechain gauge" +msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:173 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:297 msgid "Go to pool" msgstr "前往池" #: src/layout/default/HeaderMobile.tsx:164 #: src/layout/default/HeaderSecondary.tsx:83 -#~ msgid "Governance" -#~ msgstr "Gov.治理" +msgid "Governance" +msgstr "Gov.治理" #: src/components/layout/default/footer.tsx:46 #~ msgid "Help" #~ msgstr "幫助" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:123 +#: src/components/ComboBoxSelectToken/index.tsx:136 msgid "Hide tokens from very small pools" msgstr "隱藏小池的代幣" -#: src/components/PagePoolList/index.tsx:224 +#: src/components/PagePoolList/index.tsx:220 msgid "Hide very small pools" msgstr "隱藏小池" @@ -1307,7 +1077,7 @@ msgstr "隱藏小池" #~ msgid "High price impact warning!<0/>Swap will have {0}% price impact." #~ msgstr "注意:高價格影響警告!<0/>交易將產生 {0}% 的價格影響。" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "High price impact:" msgstr "注意:高價格影響警告!" @@ -1315,27 +1085,10 @@ msgstr "注意:高價格影響警告!" #~ msgid "High price impact!" #~ msgstr "注意:高價格影響警告!" -#: src/components/PagePool/components/WarningModal.tsx:65 +#: src/components/PagePool/components/WarningModal.tsx:56 msgid "High slippage!<0/>{0} will have {1}% loss." msgstr "注意:高滑點!<0/>{0} 將損失 {1}%。" -#: src/components/PageRiskDisclaimer/index.tsx:87 -msgid "If the token fails to regain its peg, liquidity providers will encounter losses proportional to the severity of the depeg. The potential permanent loss highlights the importance of thorough consideration and caution when participating in activities involving stablecoins and/or derivative assets." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:51 -msgid "Immutability and Irreversibility of Transactions:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:90 -msgid "Impermanent Loss:" -msgstr "" - -#: src/components/PageDashboard/index.tsx:55 -#: src/components/PagePoolList/Page.tsx:57 -msgid "Incentives" -msgstr "" - #: src/components/PageCrvLocker/index.tsx:28 msgid "Increase Amount" msgstr "增加金額" @@ -1349,15 +1102,15 @@ msgstr "增加鎖倉" msgid "Increase Lock Amount" msgstr "增加鎖倉金額" -#: src/components/PageCreatePool/Parameters/index.tsx:266 +#: src/components/PageCreatePool/Parameters/index.tsx:255 msgid "Initial Liquidity Concentration Price" msgstr "初始流動性集中度價格" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:77 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:75 msgid "Initial Price {0}" msgstr "初始價格 {0}" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:63 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:71 msgid "Initial Price B:" msgstr "初始價格B:" @@ -1365,18 +1118,17 @@ msgstr "初始價格B:" #~ msgid "Initial price can't be 0. The price fetch didn't return a price. Please enter it manually." #~ msgstr "初始價格不能為 0。價格獲取失敗,請手動輸入。" -#: src/components/PageCreatePool/Parameters/index.tsx:278 +#: src/components/PageCreatePool/Parameters/index.tsx:273 msgid "Initial price can't be 0. The price fetch didn't return a price. Please enter the token dollar price manually in the input." msgstr "初始價格不能為 0。價格獲取失敗,請手動輸入。" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:46 msgid "Initial Price{0}:" msgstr "初始價格{0}:" #: src/components/PageIntegrations/Page.tsx:38 -#: src/layout/default/Footer.tsx:126 -#: src/layout/default/Header.tsx:80 -#: src/layout/default/Header.tsx:88 +#: src/layout/default/Footer.tsx:127 +#: src/layout/default/Header.tsx:35 msgid "Integrations" msgstr "集成" @@ -1384,21 +1136,16 @@ msgstr "集成" msgid "Invalid date" msgstr "" -#: src/components/PagePoolList/index.tsx:278 +#: src/components/PagePoolList/index.tsx:263 msgid "Join the Telegram" msgstr "加入電報" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:204 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:38 -msgid "Last change occurred between {0} and {1}, when A ramped from {initial_A} to {future_A}." -msgstr "" - -#: src/components/PageDeployGauge/InfoBox.tsx:25 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:60 +#: src/components/PageDeployGauge/InfoBox.tsx:26 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:54 msgid "Learn more" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:139 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:136 msgid "Learn more about Boosting your CRV rewards" msgstr "" @@ -1414,60 +1161,47 @@ msgstr "" #~ msgid "Learn more about V2 pools" #~ msgstr "了解有關 V2 池的更多信息" -#: src/components/PageCreatePool/index.tsx:213 +#: src/components/PageCreatePool/index.tsx:152 msgid "Learn more: Creating Cryptoswap pools" msgstr "" -#: src/components/PageCreatePool/index.tsx:209 +#: src/components/PageCreatePool/index.tsx:148 msgid "Learn more: Creating Stableswap pools" msgstr "" -#: src/components/PageCreatePool/index.tsx:225 +#: src/components/PageCreatePool/index.tsx:164 msgid "Learn more: Read about Cryptoswap parameters" msgstr "" -#: src/components/PageCreatePool/index.tsx:221 +#: src/components/PageCreatePool/index.tsx:160 msgid "Learn more: Understanding Cryptoswap" msgstr "" -#: src/components/PageCreatePool/index.tsx:233 +#: src/components/PageCreatePool/index.tsx:172 msgid "Learn more: Understanding Stableswap" msgstr "" #: src/components/PageCreatePool/components/InfoBox.tsx:28 #: src/components/PageCreatePool/components/InfoBox.tsx:34 -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:79 -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:218 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:65 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:140 msgid "Link to address" msgstr "連結到地址" -#: src/components/PageCreatePool/constants.ts:90 -#: src/components/PageCreatePool/constants.ts:151 -msgid "Liquid Restaking Tokens" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:135 +#: src/components/PageCreatePool/constants.ts:119 msgid "Liquid Staking Derivatives" msgstr "流動抵押衍生品" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:61 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:62 msgid "Liquidity" msgstr "" -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:20 -msgid "Liquidity providers in this pool also earn additional tokens!" -msgstr "" - -#: src/components/PagePool/components/CampaignRewardsBanner.tsx:19 -msgid "Liquidity providers in this pool also earn points!" -msgstr "" - #: src/domain/transfer/pool-stats/pool-parameters.tsx:142 #~ msgid "Liquidity utilization" #~ msgstr "流動性利用" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:63 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:72 msgid "Liquidity utilization:" msgstr "流動性利用:" @@ -1475,8 +1209,9 @@ msgstr "流動性利用:" #~ msgid "Llama Airforce" #~ msgstr "Llama Airforce" -#: src/components/FormConnectWallet.tsx:29 #: src/components/PageCrvLocker/components/FormActions.tsx:27 +#: src/components/PagePool/components/TransferActions.tsx:66 +#: src/components/PageRouterSwap/components/RouterSwapActions.tsx:35 msgid "Loading" msgstr "加載中" @@ -1524,7 +1259,7 @@ msgstr "解鎖日期已更新" #~ msgid "Locked until" #~ msgstr "Locked until" -#: src/components/PageDashboard/components/FormVecrv.tsx:191 +#: src/components/PageDashboard/components/FormVecrv.tsx:184 msgid "Locked until:" msgstr "鎖倉到期日:" @@ -1532,20 +1267,20 @@ msgstr "鎖倉到期日:" #~ msgid "Low Exchange Rate!" #~ msgstr "注意:低匯率!" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:178 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:139 msgid "LP Token ({0})" msgstr "LP代幣 ({0})" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:175 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:142 msgid "LP Token (USD)" msgstr "LP代幣 (USD)" -#: src/components/PageDeployGauge/DeploySidechain.tsx:118 +#: src/components/PageDeployGauge/DeploySidechain.tsx:109 msgid "LP Token Address" msgstr "" #: src/components/PagePool/components/FieldLpToken.tsx:42 -#: src/components/PagePool/UserDetails/index.tsx:99 +#: src/components/PagePool/UserDetails/index.tsx:102 msgid "LP Tokens" msgstr "LP代幣" @@ -1553,14 +1288,6 @@ msgstr "LP代幣" msgid "LP Tokens Avail." msgstr "LP代幣可用的" -#: src/store/createDeployGaugeSlice.ts:227 -#: src/store/createDeployGaugeSlice.ts:264 -#: src/store/createDeployGaugeSlice.ts:301 -#: src/store/createDeployGaugeSlice.ts:338 -#: src/store/createDeployGaugeSlice.ts:374 -msgid "Mainnet gauge deployment successful." -msgstr "" - #: src/components/input-comp/input-max-button.tsx:35 #~ msgid "MAX" #~ msgstr "最大值" @@ -1569,7 +1296,7 @@ msgstr "" #~ msgid "Max amount" #~ msgstr "最大量" -#: src/components/AdvancedSettings.tsx:166 +#: src/components/AdvancedSettings.tsx:157 msgid "Max Slippage" msgstr "最大滑點" @@ -1577,11 +1304,11 @@ msgstr "最大滑點" #~ msgid "MAX*" #~ msgstr "最大值*" -#: src/components/AdvancedSettings.tsx:168 +#: src/components/AdvancedSettings.tsx:159 msgid "Maximum difference between expected price of the trade, versus the price when the trade is executed." msgstr "交易的預期價格與交易執行時的價格之間的最大差異。" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:107 msgid "Measures pool growth; this is not a dollar value" msgstr "衡量池增長; 這不是美元價值" @@ -1589,16 +1316,12 @@ msgstr "衡量池增長; 這不是美元價值" #~ msgid "MetaMask" #~ msgstr "MetaMask" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:99 -msgid "Metapool" -msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:250 +#: src/components/PageCreatePool/Parameters/index.tsx:239 msgid "Mid fee governs fees charged during low volatility." msgstr "中間手續費主導了在低波動性期間收取的費用。" #: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:30 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:181 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:53 msgid "Mid Fee:" msgstr "中間手續費:" @@ -1607,14 +1330,10 @@ msgstr "中間手續費:" #~ msgstr "中間手續費:({0} - {1}%)" #: src/components/PageCreatePool/Parameters/index.tsx:230 -#~ msgid "Mid Fee: ({0} - {1}%)" -#~ msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:241 -msgid "Mid Fee: ({0}% - {1}%)" +msgid "Mid Fee: ({0} - {1}%)" msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:72 +#: src/components/PagePool/UserDetails/index.tsx:75 msgid "min. CRV tAPR %" msgstr "基礎CRV 年化 tAPR %" @@ -1622,7 +1341,7 @@ msgstr "基礎CRV 年化 tAPR %" #~ msgid "Min. Curve {0} LP Tokens:" #~ msgstr "最低限度 Curve {0} LP 代幣:" -#: src/components/AdvancedSettings.tsx:117 +#: src/components/AdvancedSettings.tsx:111 msgid "Min. slippage is {MIN_SLIPPAGE}%" msgstr "最小滑點為 {MIN_SLIPPAGE}%" @@ -1630,7 +1349,7 @@ msgstr "最小滑點為 {MIN_SLIPPAGE}%" #~ msgid "Min. slippage is 0.01%" #~ msgstr "最小滑點為 0.01%" -#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:40 +#: src/components/PagePool/components/DetailInfoEstLpTokens.tsx:42 msgid "Minimum LP Tokens:" msgstr "最少LP代幣:" @@ -1638,56 +1357,48 @@ msgstr "最少LP代幣:" #~ msgid "Minter" #~ msgstr "鎖幣廠" -#: src/store/createDeployGaugeSlice.ts:623 -#: src/store/createDeployGaugeSlice.ts:662 -#: src/store/createDeployGaugeSlice.ts:701 -#: src/store/createDeployGaugeSlice.ts:740 -#: src/store/createDeployGaugeSlice.ts:776 -msgid "Mirror gauge deployment successful." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:125 -#: src/components/PageDeployGauge/ProcessSummary.tsx:79 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:584 +#: src/components/PageDeployGauge/ProcessSummary.tsx:61 msgid "Mirror gauge successfully deployed" msgstr "" #: src/layout/default/HeaderMobile.tsx:146 -#~ msgid "Mode" -#~ msgstr "模式" +msgid "Mode" +msgstr "模式" #: src/layout/default/HeaderMobile.tsx:154 -#~ msgid "More" -#~ msgstr "" +msgid "More" +msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:318 -#: src/components/PageCreatePool/Parameters/index.tsx:391 +#: src/components/PageCreatePool/Parameters/index.tsx:313 +#: src/components/PageCreatePool/Parameters/index.tsx:386 msgid "Moving Average Time ({0} - {1}) seconds" msgstr "移動平均時間 ({0} - {1}) 秒" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:115 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:123 #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:57 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:286 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:124 msgid "Moving Average Time:" msgstr "移動平均時間:" -#: src/components/PagePoolList/index.tsx:106 +#: src/components/PagePoolList/index.tsx:111 msgid "My Pools" msgstr "我的池子" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:37 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:59 msgid "Name:" msgstr "名稱:" -#: src/components/PageDeployGauge/DeploySidechain.tsx:93 +#: src/components/PageDeployGauge/DeploySidechain.tsx:84 msgid "Network:" msgstr "" -#: src/layout/default/Footer.tsx:146 +#: src/layout/default/Footer.tsx:142 msgid "News" msgstr "新聞" -#: src/components/PageCreatePool/index.tsx:252 -#: src/components/PageCreatePool/index.tsx:287 +#: src/components/PageCreatePool/index.tsx:191 +#: src/components/PageCreatePool/index.tsx:238 msgid "Next" msgstr "下一步" @@ -1701,7 +1412,7 @@ msgstr "下一步" #~ msgid "No A value set" #~ msgstr "沒有設置A值" -#: src/components/PageDashboard/index.tsx:161 +#: src/components/PageDashboard/index.tsx:166 msgid "No active pool found for" msgstr "找不到活動池" @@ -1709,23 +1420,19 @@ msgstr "找不到活動池" #~ msgid "No active pool found." #~ msgstr "未找到活動池。" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:73 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 msgid "No address set" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:78 msgid "No asset type set" msgstr "沒有設置資產類型" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:212 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:213 msgid "No claimable rewards" msgstr "沒有可領取的獎勵" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:84 -msgid "No controller data found." -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:92 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:78 msgid "No function set" msgstr "" @@ -1736,19 +1443,19 @@ msgstr "" #~ msgid "No initial price set" #~ msgstr "沒有設置初始價格" -#: src/components/PageIntegrations/index.tsx:130 +#: src/components/PageIntegrations/index.tsx:115 msgid "No integration apps found with for {0} {1}{2}" msgstr "" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:39 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:61 msgid "No name set" msgstr "沒有設置名稱" -#: src/components/PagePoolList/index.tsx:283 +#: src/components/PagePoolList/index.tsx:268 msgid "No pool found for \"{0}\". Feel free to search other tabs, or" msgstr "未找到 \"{0}\" 的池。 搜索其他標籤,或" -#: src/components/PagePoolList/index.tsx:290 +#: src/components/PagePoolList/index.tsx:275 msgid "No pool found in this category" msgstr "在此類別中未找到池" @@ -1767,39 +1474,32 @@ msgstr "沒有設置預設值" #~ msgid "No swap fee set" #~ msgstr "沒有設置交換手續費" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:47 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:69 msgid "No symbol set" msgstr "沒有設置符號" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:148 -msgid "No token found for \"{filterValue}\"" -msgstr "" - -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:278 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:235 msgid "No token found for address {0}" msgstr "找不到地址 {0} 的代幣。" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:76 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:69 msgid "No tokens selected" msgstr "未選擇任何代幣" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:77 -msgid "No trades data found." -msgstr "" - -#: src/components/PageDashboard/components/TableRow.tsx:89 +#: src/components/PageDashboard/components/TableRow.tsx:92 msgid "None" msgstr "無" #: src/components/PagePool/Swap/index.tsx:396 -#~ msgid "Not enough balance for {0}" -#~ msgstr "" +msgid "Not enough balance for {0}" +msgstr "" -#: src/store/createPoolDepositSlice.ts:279 -msgid "Not enough balance for {amountsError}." -msgstr "{amountsError} 餘額不足。" +#: src/domain/transfer/deposit/form-deposit/index.tsx:95 +#: src/domain/transfer/deposit/form-deposit-stake/index.tsx:96 +#~ msgid "Not enough balance for {amountsError}." +#~ msgstr "{amountsError} 餘額不足。" -#: src/components/PagePool/Deposit/components/FormStake.tsx:206 +#: src/components/PagePool/Deposit/components/FormStake.tsx:198 msgid "Not enough LP Tokens balances." msgstr "" @@ -1863,15 +1563,15 @@ msgstr "輕推中" msgid "Nudging and Claiming" msgstr "輕推和領取中" -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "of pool" msgstr "這些池" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 msgid "Off Peg Multiplier:" msgstr "" -#: src/components/PageCreatePool/Parameters/index.tsx:310 +#: src/components/PageCreatePool/Parameters/index.tsx:305 msgid "Offpeg Fee Multiplier ({0} - {1})" msgstr "" @@ -1883,47 +1583,34 @@ msgstr "" #~ msgid "On March 15th, all protocol owned dex liquidity will be removed. You must remove your own dex liquidity before March 15th. After the new STG token is airdropped, the old STG will be worthless. If you continue to provide LP at this point, the old STG token will be sold into your LP removing the other asset you are providing and you will lose funds!!. It is recommended you withdraw and unwrap the LP and (if you wish) re-add the LP with the new STG token after you receive it." #~ msgstr "3 月 15 日,各條鏈上的 dex 流動性將被移除。 你必須在 3 月 15 日之前移除你自己的 dex 流動性。 新的STG代幣空投後,舊的STG將使用價值。 如果此時還繼續提供 LP,舊的 STG 代幣將被出售到您的 LP 中,移除您提供的其他資產,您將損失資金!!。 建議您提取並解開LP,等收到新的 STG 代幣重新添加 LP。 謝謝你!" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:351 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:350 msgid "One coin" msgstr "一個代幣" -#: src/components/PageDeployGauge/InfoBox.tsx:17 +#: src/components/PageDeployGauge/InfoBox.tsx:18 msgid "Only admin/manager can set reward token, set reward token distributor address." msgstr "" -#: src/components/PageCreatePool/constants.ts:222 +#: src/components/PageCreatePool/constants.ts:190 #: src/components/PageCreatePool/Parameters/SelectPoolImplementation.tsx:44 msgid "Optimised" msgstr "優化的" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:210 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:130 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:85 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:132 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:91 msgid "Oracle" msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:83 -msgid "Oracle address needs to be 42 characters long." -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:80 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 msgid "Oracle address needs to start with '0x'." msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 -msgid "Oracle Address:" -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:93 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:69 msgid "Oracle function name needs to end with '()'." msgstr "" -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:95 -msgid "Oracle must have a precision of 18 decimals." -msgstr "" - -#: src/components/PagePool/index.tsx:220 -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:14 +#: src/components/PagePool/index.tsx:202 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:12 msgid "OTHER" msgstr "其他" @@ -1931,22 +1618,18 @@ msgstr "其他" #~ msgid "Others" #~ msgstr "其他" -#: src/components/PageCreatePool/Parameters/index.tsx:263 +#: src/components/PageCreatePool/Parameters/index.tsx:252 msgid "Out fee governs fees charged during high volatility." msgstr "外部手續費主導了在高波動性期間收取的費用。" -#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:187 +#: src/components/PageCreatePool/Summary/ParametersSummary/CryptoswapParameters.tsx:38 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:59 msgid "Out Fee:" msgstr "外部手續費:" #: src/components/PageCreatePool/Parameters/index.tsx:242 -#~ msgid "Out fee: ({midFee} - {0}%)" -#~ msgstr "外部手續費: ({midFee} - {0}%)" - -#: src/components/PageCreatePool/Parameters/index.tsx:253 -msgid "Out fee: ({midFee}% - {0}%)" -msgstr "" +msgid "Out fee: ({midFee} - {0}%)" +msgstr "外部手續費: ({midFee} - {0}%)" #: src/domain/page404.tsx:44 #~ msgid "Page not found" @@ -1959,11 +1642,11 @@ msgstr "" #~ msgid "Parameters" #~ msgstr "參數" -#: src/components/PageCreatePool/components/Navigation.tsx:54 +#: src/components/PageCreatePool/components/Navigation.tsx:106 msgid "PARAMETERS" msgstr "參數" -#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:26 +#: src/components/PageCreatePool/Summary/ParametersSummary/index.tsx:47 msgid "Parameters:" msgstr "" @@ -1971,31 +1654,29 @@ msgstr "" #~ msgid "Percent share in pool" #~ msgstr "池中的百分比份額" -#: src/components/PageRiskDisclaimer/index.tsx:81 -msgid "Permanent Loss of a Peg:" -msgstr "" - -#: src/components/PageDashboard/components/FormClaimFeesButtons.tsx:64 +#: src/components/PageDashboard/components/FormClaimFees.tsx:57 msgid "Please approve claim veCRV rewards." msgstr "" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:90 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:93 -#: src/components/PagePool/Swap/index.tsx:183 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:87 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:88 +#: src/components/PagePool/Swap/index.tsx:179 +#: src/components/PageRouterSwap/index.tsx:206 msgid "Please approve spending your {0}." msgstr "請批准花費您的 {0}。" -#: src/components/PageRouterSwap/index.tsx:211 -msgid "Please approve spending your {fromToken}." -msgstr "請批准花費您的 {fromToken}。" +#: src/domain/quick-swap/index.tsx:278 +#: src/domain/transfer/swap/index.tsx:278 +#~ msgid "Please approve spending your {fromToken}." +#~ msgstr "請批准花費您的 {fromToken}。" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:101 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:52 msgid "Please approve spending your CRV." msgstr "請批准使用您的 CRV。" -#: src/components/PagePool/Deposit/components/FormStake.tsx:59 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:95 +#: src/components/PagePool/Deposit/components/FormStake.tsx:57 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:94 msgid "Please approve spending your LP Tokens." msgstr "請批准使用您的 LP 代幣。" @@ -2015,7 +1696,7 @@ msgstr "" msgid "Please confirm claim of {tokensMessage}" msgstr "請確認 {tokensMessage} 的領取" -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:104 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:99 msgid "Please confirm deposit and staking of {tokenText} LP Tokens at max {maxSlippage}% slippage." msgstr "請確認以最大 {maxSlippage}% 的滑點存入和質押 {tokenText} LP 代幣。" @@ -2023,7 +1704,7 @@ msgstr "請確認以最大 {maxSlippage}% 的滑點存入和質押 {tokenText} L #~ msgid "Please confirm deposit and staking of {tokenText} LP Tokens." #~ msgstr "請確認 {tokenText} LP 代幣的存款和質押。" -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:101 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:98 msgid "Please confirm deposit of {tokenText} at max {maxSlippage}% slippage." msgstr "請確認以最大 {maxSlippage}% 的滑點存入 {tokenText}。" @@ -2059,11 +1740,12 @@ msgstr "請確認 {tokensMessage} 的輕推和領取" msgid "Please confirm nudge rewards" msgstr "請確認輕推獎勵" -#: src/components/PagePool/Deposit/components/FormStake.tsx:69 +#: src/components/PagePool/Deposit/components/FormStake.tsx:67 msgid "Please confirm staking of {0} LP Tokens" msgstr "請確認 {0} 個 LP 代幣的抵押" -#: src/components/PagePool/Swap/index.tsx:130 +#: src/components/PagePool/Swap/index.tsx:126 +#: src/components/PageRouterSwap/index.tsx:155 msgid "Please confirm swap {fromAmount} {fromToken} for {toToken} at max slippage {maxSlippage}%." msgstr "請確認將 {fromAmount} {fromToken} 換成 {toToken},最大滑點 {maxSlippage}%." @@ -2079,21 +1761,17 @@ msgstr "請確認將 {fromAmount} {fromToken} 換成 {toToken},最大滑點 {m #~ msgid "Please confirm swapping {0} {1} at max {maxSlippage}% slippage." #~ msgstr "請確認以最大 {maxSlippage}% 的滑點交換 {0} {1}。" -#: src/store/createCreatePoolSlice.ts:793 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:80 msgid "Please confirm to create pool {poolName}." msgstr "請確認要建立池 {poolName}。" #: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:116 -#~ msgid "Please confirm to deploy gauge for {0}." -#~ msgstr "" - -#: src/store/createDeployGaugeSlice.ts:189 -msgid "Please confirm to deploy gauge for {shortenAddress}." +msgid "Please confirm to deploy gauge for {0}." msgstr "" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:46 -#~ msgid "Please confirm to deploy gauge." -#~ msgstr "" +msgid "Please confirm to deploy gauge." +msgstr "" #: src/components/PagePool/Withdraw/components/FormUnstake.tsx:51 msgid "Please confirm unstaking of {0} LP Tokens" @@ -2107,7 +1785,7 @@ msgstr "" msgid "Please confirm withdraw of {lockedAmount} CRV." msgstr "請確認提取 {lockedAmount} CRV。" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:106 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:105 msgid "Please confirm withdrawal of {0} LP Tokens at max {maxSlippage}% slippage." msgstr "" @@ -2119,11 +1797,11 @@ msgstr "" #~ msgid "Please confirm withdrawal of {lpTokenPayload} LP Tokens." #~ msgstr "請確認提取 {lpTokenPayload} LP代幣。" -#: src/components/PageCreatePool/TokensInPool/index.tsx:751 +#: src/components/PageCreatePool/TokensInPool/index.tsx:583 msgid "Please connect a wallet to select tokens" msgstr "請連接錢包以選擇代幣" -#: src/components/PageDashboard/index.tsx:148 +#: src/components/PageDashboard/index.tsx:153 msgid "Please connect wallet or enter a wallet address to view active pools." msgstr "請連接錢包或輸入錢包地址查看活躍的池。" @@ -2131,7 +1809,7 @@ msgstr "請連接錢包或輸入錢包地址查看活躍的池。" #~ msgid "Please connect wallet to view active pools." #~ msgstr "請連接錢包以查看各池資訊。" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:28 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:26 msgid "Please select tokens to be able to set initial price" msgstr "請選擇代幣以便設置初始價格。" @@ -2143,54 +1821,41 @@ msgstr "請選擇代幣以便設置初始價格。" #~ msgid "Please switch your wallet's network to" #~ msgstr "請將您的錢包網絡切換到" -#: src/components/PagePoolList/Page.tsx:60 -msgid "Points" -msgstr "" - -#: src/components/PageDashboard/index.tsx:52 -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 -#: src/components/PagePoolList/Page.tsx:54 +#: src/components/PageDashboard/index.tsx:54 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 +#: src/components/PagePoolList/Page.tsx:56 msgid "Pool" msgstr "池" -#: src/store/createCreatePoolSlice.ts:853 -#: src/store/createCreatePoolSlice.ts:934 -#: src/store/createCreatePoolSlice.ts:1033 -#: src/store/createCreatePoolSlice.ts:1103 -#: src/store/createCreatePoolSlice.ts:1192 -#: src/store/createCreatePoolSlice.ts:1272 -msgid "Pool {poolName} deployment successful." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:163 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:265 msgid "Pool {poolName} was successfully created!" msgstr "池 {poolName} 創建成功!" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:31 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:29 msgid "Pool / Token" msgstr "池/代幣" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/index.tsx:256 +#: src/components/PagePool/PoolDetails/PoolInfo/index.tsx:216 msgid "Pool Activity" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:70 +#: src/components/PageDeployGauge/DeployMainnet.tsx:61 msgid "Pool Address" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:16 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:15 msgid "Pool APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:27 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:26 msgid "Pool APY + Interest APY" msgstr "" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:19 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:18 msgid "Pool APY + Lending APY" msgstr "池APY + 借貸APY" -#: src/components/PagePoolList/components/TooltipBaseApy.tsx:22 +#: src/components/PagePoolList/components/TooltipBaseApy.tsx:21 msgid "Pool APY + Staking APY" msgstr "池APY + 質押APY" @@ -2198,22 +1863,23 @@ msgstr "池APY + 質押APY" #~ msgid "Pool contains rebasing tokens" #~ msgstr "池包含重定基(rebase)代幣" -#: src/components/PageCreatePool/index.tsx:180 -#: src/layout/default/Header.tsx:78 -#: src/layout/default/Header.tsx:87 +#: src/components/PageCreatePool/index.tsx:119 +#: src/layout/default/Header.tsx:33 msgid "Pool Creation" msgstr "創建池" -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:51 -#: src/components/PageCreatePool/ConfirmModal/index.tsx:70 +#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:392 msgid "Pool Creation Complete" msgstr "創建池完成" -#: src/components/PageCreatePool/index.tsx:305 +#: src/components/PageCreatePool/index.tsx:256 msgid "Pool creation is not yet available on this network." msgstr "" -#: src/components/PagePool/index.tsx:123 +#: src/components/PagePool/index.tsx:104 +#: src/components/PagePool/index.tsx:109 +#: src/components/PagePool/index.tsx:114 +#: src/components/PagePool/index.tsx:117 msgid "Pool Details" msgstr "" @@ -2225,12 +1891,11 @@ msgstr "池實執行" msgid "Pool Implementation:" msgstr "池實執行:" -#: src/components/PageCreatePool/components/Navigation.tsx:67 +#: src/components/PageCreatePool/components/Navigation.tsx:157 msgid "POOL INFO" msgstr "池信息" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:34 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:94 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:56 msgid "Pool Info:" msgstr "池資訊:" @@ -2239,25 +1904,18 @@ msgstr "池資訊:" #~ msgstr "池名稱 (例如 CRV/ETH)" #: src/components/PageCreatePool/PoolInfo/index.tsx:30 -#~ msgid "Pool Name (e.g. CRV/ETH)" -#~ msgstr "" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:30 -msgid "Pool Name (e.g. stETH/ETH)" +msgid "Pool Name (e.g. CRV/ETH)" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:152 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:50 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:159 msgid "Pool Parameters" msgstr "池參數" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:58 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:45 msgid "Pool Parameters Presets" msgstr "池參數預設" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 -msgid "Pool Parameters:" -msgstr "" - #: src/domain/create-pool/components/navigation.tsx:59 #~ msgid "POOL PRESETS" #~ msgstr "池預設值" @@ -2271,7 +1929,7 @@ msgstr "" #~ msgid "POOL SETUP" #~ msgstr "池設置" -#: src/components/PageCreatePool/Summary/index.tsx:27 +#: src/components/PageCreatePool/Summary/index.tsx:40 msgid "Pool Summary" msgstr "" @@ -2280,18 +1938,14 @@ msgstr "" #~ msgstr "池符號 (例如 CRVETH)" #: src/components/PageCreatePool/PoolInfo/index.tsx:35 -#~ msgid "Pool Symbol (e.g. CRVETH)" -#~ msgstr "" - -#: src/components/PageCreatePool/PoolInfo/index.tsx:35 -msgid "Pool Symbol (e.g. stETHETH)" +msgid "Pool Symbol (e.g. CRVETH)" msgstr "" -#: src/components/PageCreatePool/PoolType/index.tsx:26 +#: src/components/PageCreatePool/PoolType/index.tsx:24 msgid "Pool Type" msgstr "池類型" -#: src/components/PageCreatePool/components/Navigation.tsx:28 +#: src/components/PageCreatePool/components/Navigation.tsx:40 msgid "POOL TYPE" msgstr "池類型" @@ -2301,106 +1955,72 @@ msgstr "池類型" #~ msgstr "在調整中間手續費之前需要設置池類型。" #: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:29 -#: src/components/PageDeployGauge/DeployMainnet.tsx:60 -#: src/components/PageDeployGauge/DeploySidechain.tsx:107 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:96 +#: src/components/PageDeployGauge/DeployMainnet.tsx:51 +#: src/components/PageDeployGauge/DeploySidechain.tsx:98 msgid "Pool Type:" msgstr "" -#: src/components/PagePoolList/Page.tsx:114 -#: src/layout/default/Header.tsx:77 -#: src/layout/default/Header.tsx:85 +#: src/components/PagePoolList/Page.tsx:122 +#: src/layout/default/Header.tsx:32 msgid "Pools" msgstr "池子" #: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#~ msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" -#~ msgstr "" +msgid "Pools with basepools ({0}) allow a maximum of 2 tokens" +msgstr "" #: src/domain/create-pool/tokens-in-pool/index.tsx:757 #~ msgid "Pools with basepools (3Crv, FRAXBP, sbtc2Crv) allow a maximum of 2 tokens" #~ msgstr "帶有基礎池(3Crv、FRAXBP、sbtc2Crv)的池允許最多 2 個代幣。" -#: src/components/PageCreatePool/TokensInPool/index.tsx:770 -msgid "Pools with basepools allow a maximum of 2 tokens" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:126 -msgid "Pools with Lending Assets:" -msgstr "" - #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:22 #: src/components/PageCreatePool/Summary/PoolPresetSummary.tsx:27 msgid "Preset:" msgstr "預設值:" -#: src/components/PageCreatePool/index.tsx:242 -#: src/components/PageCreatePool/index.tsx:277 +#: src/components/PageCreatePool/index.tsx:181 +#: src/components/PageCreatePool/index.tsx:228 msgid "Previous" msgstr "上一步" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:82 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:80 msgid "Price A ({0})" msgstr "" -#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:87 +#: src/components/PageCreatePool/Parameters/InitialPrice.tsx:85 msgid "Price B ({0})" msgstr "" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:26 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:24 msgid "Price change in the market that happens when a trader buys or sells an asset." msgstr "交易者買賣資產時發生的市場價格變化。" -#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:23 +#: src/components/PageRouterSwap/components/DetailInfoPriceImpact.tsx:21 msgid "Price impact:" msgstr "價格影響:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:298 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:118 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:135 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:125 msgid "Price Oracle:" msgstr "指的是LP的預言機價格:" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:317 -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:136 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:154 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:143 msgid "Price Scale:" msgstr "指的是當前浮動的預言機價格:" -#: src/components/PageRiskDisclaimer/index.tsx:108 -msgid "Price Volatility:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:23 -msgid "Providing liquidity on Curve doesn't come without risks. Before making a deposit, it is best to research and understand the risks involved." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:92 -msgid "Providing liquidity to Curve pools may expose users to the risk of impermanent loss. Fluctuations in asset prices after supplying to a pool can result in losses when users remove liquidity. Before engaging in liquidity provision activities, users are advised to carefully evaluate the potential for impermanent loss and consider their own risk tolerance." -msgstr "" - #: src/components/layout/default/header.tsx:26 #~ msgid "Quick Swap" #~ msgstr "兑换器" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:246 -msgid "Ramp {0} A ends on:" -msgstr "" - #: src/domain/transfer/pool-stats/pool-parameters.tsx:134 #~ msgid "Ramp up A ends on" #~ msgstr "增加A值在" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:87 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:202 -#~ msgid "Ramp up A ends on:" -#~ msgstr "增加A值在:" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:224 -msgid "Ramping {0} A:" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:55 -msgid "Ramping A:" -msgstr "" +msgid "Ramp up A ends on:" +msgstr "增加A值在:" #: src/domain/transfer/pool-stats/pool-parameters.tsx:124 #~ msgid "Ramping up A" @@ -2408,40 +2028,27 @@ msgstr "" #: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:72 #: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:186 -#~ msgid "Ramping up A:" -#~ msgstr "目標A值:" +msgid "Ramping up A:" +msgstr "目標A值:" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:211 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:135 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:86 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:133 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:96 msgid "Rebasing" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:778 +#: src/components/PageCreatePool/TokensInPool/index.tsx:622 msgid "Rebasing tokens are not supported in {CRYPTOSWAP} pools" msgstr "" -#: src/components/PageCreatePool/TokensInPool/index.tsx:771 +#: src/components/PageCreatePool/TokensInPool/index.tsx:613 msgid "Rebasing tokens are not supported in this version of Stableswap" msgstr "" -#: src/components/PageDashboard/components/Summary.tsx:130 +#: src/components/PageDashboard/components/Summary.tsx:136 msgid "Recently viewed addresses" msgstr "最近查看的地址" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:116 -msgid "Registry:" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:134 -msgid "Regulatory Risk" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:136 -msgid "Regulatory Uncertainty:" -msgstr "" - -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/LiquidityData.tsx:69 +#: src/components/PagePool/PoolDetails/PoolInfo/LiquidityData.tsx:68 msgid "Remove" msgstr "移除" @@ -2449,21 +2056,21 @@ msgstr "移除" #~ msgid "Remove Liquidity Approved" #~ msgstr "移除流動性 批准" -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:85 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:102 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:57 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 msgid "Remove token" msgstr "移除代幣" -#: src/components/PageCreatePool/Parameters/index.tsx:294 +#: src/components/PageCreatePool/Parameters/index.tsx:289 msgid "Reset advanced" msgstr "重置進階設置" -#: src/components/PageCreatePool/Parameters/index.tsx:220 +#: src/components/PageCreatePool/Parameters/index.tsx:209 msgid "Reset Fees" msgstr "重置手續費" -#: src/layout/default/Footer.tsx:105 -#: src/layout/default/Header.tsx:195 +#: src/layout/default/Footer.tsx:147 +#: src/layout/default/HeaderMobile.tsx:189 msgid "Resources" msgstr "資源" @@ -2479,45 +2086,29 @@ msgstr "資源" #~ msgid "Retry Claim Rewards" #~ msgstr "重試領取獎勵" -#: src/components/PagePoolList/Page.tsx:55 -msgid "Rewards Base" -msgstr "" - #: src/components/PagePoolList/Page.tsx:57 -#~ msgid "Rewards Base vAPY" -#~ msgstr "獎勵 tAPR" - -#: src/components/PagePoolList/Page.tsx:56 -msgid "Rewards CRV" -msgstr "" +msgid "Rewards Base vAPY" +msgstr "獎勵 tAPR" #: src/components/PagePoolList/Page.tsx:66 -#~ msgid "Rewards CRV tAPR" -#~ msgstr "獎勵 tAPR (CRV)" - -#: src/components/PagePoolList/Page.tsx:57 -msgid "Rewards Incentives" -msgstr "" +msgid "Rewards CRV tAPR" +msgstr "獎勵 tAPR (CRV)" #: src/components/PagePoolList/Page.tsx:68 -#~ msgid "Rewards Incentives tAPR" -#~ msgstr "獎勵 tAPR(更多獎勵)" +msgid "Rewards Incentives tAPR" +msgstr "獎勵 tAPR(更多獎勵)" -#: src/components/PageDashboard/components/TableHead.tsx:72 -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:26 +#: src/components/PageDashboard/index.tsx:59 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:94 +#: src/components/PagePoolList/Page.tsx:61 msgid "Rewards tAPR" msgstr "獎勵 tAPR" -#: src/components/PagePoolList/components/TableRowMobile.tsx:134 -msgid "REWARDS tAPR" -msgstr "" - -#: src/components/PageDashboard/index.tsx:54 +#: src/components/PageDashboard/index.tsx:64 msgid "Rewards tAPR (CRV)" msgstr "獎勵 tAPR (CRV)" -#: src/components/PageDashboard/index.tsx:55 +#: src/components/PageDashboard/index.tsx:66 msgid "Rewards tAPR (Incentives)" msgstr "獎勵 tAPR(更多獎勵)" @@ -2525,33 +2116,29 @@ msgstr "獎勵 tAPR(更多獎勵)" #~ msgid "Risk" #~ msgstr "風險" -#: src/components/PageRiskDisclaimer/Page.tsx:28 -msgid "Risk Disclaimer" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:89 msgid "Risks of using {0}" msgstr "{0}池 使用風險" -#: src/components/AdvancedSettings.tsx:158 +#: src/components/AdvancedSettings.tsx:149 msgid "Save" msgstr "保存" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:191 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:151 msgid "Search by name or paste address" msgstr "按名稱搜索或貼上地址" -#: src/components/PagePoolList/index.tsx:189 +#: src/components/PagePoolList/index.tsx:185 msgid "Search by pool name, pool address, token name or token address" msgstr "按礦池名稱、礦池地址、代幣名稱或代幣地址搜索" -#: src/components/ComboBoxSelectToken/ComboBox.tsx:83 -#: src/components/ComboBoxSelectToken/ComboBox.tsx:84 -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:203 +#: src/components/ComboBoxSelectToken/index.tsx:117 +#: src/components/ComboBoxSelectToken/index.tsx:129 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:163 msgid "Search by token name or address" msgstr "按代幣名稱或地址搜索" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:261 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:219 msgid "Search generated no results" msgstr "搜索沒有結果" @@ -2563,12 +2150,12 @@ msgstr "搜索沒有結果" #~ msgid "Select" #~ msgstr "選擇" -#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:176 +#: src/components/PageCreatePool/SelectTokenModal/ComboBoxTokenPicker.tsx:136 msgid "Select a token" msgstr "選擇一個代幣" -#: src/components/PagePool/Swap/index.tsx:371 -#: src/components/PagePool/Swap/index.tsx:454 +#: src/components/PagePool/Swap/index.tsx:366 +#: src/components/PagePool/Swap/index.tsx:449 msgid "Select a Token" msgstr "選擇一個代幣" @@ -2576,7 +2163,7 @@ msgstr "選擇一個代幣" #~ msgid "Select date" #~ msgstr "選擇日期" -#: src/components/PageDeployGauge/DeploySidechain.tsx:96 +#: src/components/PageDeployGauge/DeploySidechain.tsx:87 msgid "Select Network" msgstr "" @@ -2584,15 +2171,11 @@ msgstr "" #~ msgid "Select pool asset type tag" #~ msgstr "選擇池資產類型標籤" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:68 -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:74 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:55 +#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:61 msgid "Select preset" msgstr "" -#: src/components/PageIntegrations/components/SelectIntegrationTags.tsx:25 -msgid "Select tag" -msgstr "" - #: src/components/PageCrvLocker/components/FieldDatePicker.tsx:91 msgid "Select unlock date" msgstr "選擇解鎖日期" @@ -2601,25 +2184,17 @@ msgstr "選擇解鎖日期" msgid "Set pool asset type tag:" msgstr "" -#: src/components/PageDeployGauge/DeployMainnet.tsx:62 -#: src/components/PageDeployGauge/DeploySidechain.tsx:109 +#: src/components/PageDeployGauge/DeployMainnet.tsx:53 +#: src/components/PageDeployGauge/DeploySidechain.tsx:100 msgid "Set Pool Type" msgstr "" -#: src/components/PageDashboard/components/FormVecrv.tsx:181 +#: src/components/PageDashboard/components/FormVecrv.tsx:174 msgid "share of total" msgstr "佔總數的份額" -#: src/store/createDeployGaugeSlice.ts:422 -#: src/store/createDeployGaugeSlice.ts:460 -#: src/store/createDeployGaugeSlice.ts:498 -#: src/store/createDeployGaugeSlice.ts:536 -#: src/store/createDeployGaugeSlice.ts:574 -msgid "Sidechain gauge deployment successful." -msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:122 -#: src/components/PageDeployGauge/ProcessSummary.tsx:47 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:581 +#: src/components/PageDeployGauge/ProcessSummary.tsx:40 msgid "Sidechain gauge successfully deployed" msgstr "" @@ -2639,89 +2214,58 @@ msgstr "滑點來自於存入太多不平衡的代幣,並且當前的代幣價 msgid "Slippage Loss" msgstr "滑點損失" -#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:14 +#: src/components/PagePool/components/DetailInfoSlippageTolerance.tsx:18 msgid "Slippage tolerance:" msgstr "滑點寬限" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:229 -msgid "Slowly changing {0} A so that it doesn't negatively change virtual price growth of shares" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersA.tsx:59 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:190 msgid "Slowly changing up A so that it doesn't negatively change virtual price growth of shares" msgstr "緩慢調整A值,以免因流動性池代幣的虛擬價格波動而產生負面影響" -#: src/components/PageRiskDisclaimer/index.tsx:35 -msgid "Smart Contract Audits" -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:42 -msgid "Smart Contract Risk:" -msgstr "" - -#: src/components/PagePoolList/index.tsx:272 +#: src/components/PagePoolList/index.tsx:257 msgid "Sorry, we are unable to load your pools." msgstr "抱歉,我們無法加載您的池。" #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:40 #: src/components/PagePoolList/components/DialogSort/DialogSortDesktop.tsx:47 -#~ msgid "Sort by" -#~ msgstr "" +msgid "Sort by" +msgstr "" #: src/components/PagePoolList/components/DialogSort/DialogSortMobile.tsx:57 -#~ msgid "Sort By" -#~ msgstr "排序方式" +msgid "Sort By" +msgstr "排序方式" #: src/components/PageCrvLocker/components/FormLockCreate.tsx:149 #: src/components/PageCrvLocker/components/FormLockCrv.tsx:92 -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:136 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:139 -#: src/components/PagePool/Deposit/components/FormStake.tsx:100 -#: src/components/PagePool/Swap/index.tsx:181 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:149 -#: src/components/PageRouterSwap/index.tsx:209 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:133 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:134 +#: src/components/PagePool/Deposit/components/FormStake.tsx:98 +#: src/components/PagePool/Swap/index.tsx:177 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:148 +#: src/components/PageRouterSwap/index.tsx:204 msgid "Spending Approved" msgstr "支出已批准" -#: src/components/PagePoolList/index.tsx:104 +#: src/components/PagePoolList/index.tsx:110 msgid "Stable NG" msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:83 -msgid "Stablecoins and other derivative assets are designed to maintain a peg to a reference asset. If one of the pool assets drops below its peg, it effectively means that liquidity providers in the pool hold almost all their liquidity in that token. The depegged token may never recover as a result of a technical failure, insolvency, or other adverse situations." -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:31 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:75 +#: src/components/PageCreatePool/PoolType/index.tsx:29 +#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:34 msgid "Stableswap" msgstr "穩定幣交換(Stableswap)" -#: src/components/PageRiskDisclaimer/index.tsx:97 -msgid "StableSwap pools" -msgstr "" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:769 -msgid "Stableswap pools allow up to 8 tokens" -msgstr "" - -#: src/components/PageCreatePool/PoolType/index.tsx:37 +#: src/components/PageCreatePool/PoolType/index.tsx:35 msgid "Stableswap pools are currently unavailable on this chain" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:76 -msgid "Stableswap-NG" -msgstr "" - -#: src/components/PageCreatePool/Summary/PoolTypeSummary.tsx:35 -msgid "Stableswap{0}" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 -#: src/components/PagePool/Deposit/index.tsx:36 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 +#: src/components/PagePool/Deposit/index.tsx:35 msgid "Stake" msgstr "質押" -#: src/components/PagePool/Deposit/components/FormStake.tsx:107 +#: src/components/PagePool/Deposit/components/FormStake.tsx:105 msgid "Stake Complete" msgstr "質押完成" @@ -2733,26 +2277,21 @@ msgstr "質押完成" #~ msgid "Staked LP Tokens" #~ msgstr "質押LP代幣" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:31 -msgid "Staked percent" -msgstr "" - -#: src/components/PagePool/UserDetails/index.tsx:94 +#: src/components/PagePool/UserDetails/index.tsx:97 msgid "Staked share:" msgstr "質押份額:" -#: src/components/PagePool/UserDetails/index.tsx:101 +#: src/components/PagePool/UserDetails/index.tsx:104 msgid "Staked:" msgstr "質押的代幣:" -#: src/components/PagePool/Deposit/index.tsx:121 -#: src/components/PagePool/Deposit/index.tsx:130 +#: src/components/PagePool/Deposit/index.tsx:119 +#: src/components/PagePool/Deposit/index.tsx:128 msgid "Staking is disabled due to inactive Gauge." msgstr "" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:209 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:125 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:84 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:131 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:86 msgid "Standard" msgstr "" @@ -2760,27 +2299,27 @@ msgstr "" #~ msgid "Stats" #~ msgstr "統計數據" -#: src/components/DetailInfoEstGas.tsx:88 +#: src/components/DetailInfoEstGas.tsx:82 msgid "Step {0} of {1}" msgstr "{1} 的第 {0} 步" -#: src/components/PageDeployGauge/index.tsx:94 +#: src/components/PageDeployGauge/index.tsx:93 msgid "Step 1" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:93 +#: src/components/PageDeployGauge/ProcessSummary.tsx:72 msgid "Step 1 and Step 2 must be completed using the same wallet" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:32 +#: src/components/PageDeployGauge/ProcessSummary.tsx:33 msgid "Step 1:" msgstr "" -#: src/components/PageDeployGauge/index.tsx:106 +#: src/components/PageDeployGauge/index.tsx:105 msgid "Step 2" msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:62 +#: src/components/PageDeployGauge/ProcessSummary.tsx:52 msgid "Step 2:" msgstr "" @@ -2816,60 +2355,51 @@ msgstr "" #~ msgid "Successfully locked additional {0} CRV." #~ msgstr "已成功鎖定額外的 {0} 個 CRV。" -#: src/components/PageCreatePool/constants.ts:120 +#: src/components/PageCreatePool/constants.ts:104 msgid "Suitable for forex pairs with low relative volatility" msgstr "適用於相對波動性較低的外匯交易對。" -#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PageCreatePool/constants.ts:120 msgid "Suitable for liquid staking derivatives soft-pegged to its underlying asset." msgstr "適用於柔性挂鉤其基礎資產的流動抵押衍生品(LSD)。" -#: src/components/PageCreatePool/constants.ts:91 -#: src/components/PageCreatePool/constants.ts:152 -msgid "Suitable for LRTs" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:104 +#: src/components/PageCreatePool/constants.ts:88 msgid "Suitable for most volatile pairs such as LDO <> ETH" msgstr "適用於最具波動性的交易對,例如 LDO <> ETH。" -#: src/components/PageCreatePool/constants.ts:79 +#: src/components/PageCreatePool/constants.ts:75 msgid "Suitable for stablecoins that are crypto-backed" msgstr "適用於加密貨幣抵押的穩定幣。" -#: src/components/PageCreatePool/constants.ts:67 +#: src/components/PageCreatePool/constants.ts:63 msgid "Suitable for stablecoins that are fiat-redeemable" msgstr "適用於可兌換法幣的穩定幣。" -#: src/components/PageCreatePool/constants.ts:169 +#: src/components/PageCreatePool/constants.ts:137 msgid "Suitable for USD stablecoin <> BTC stablecoin <> ETH." msgstr "" -#: src/components/PageCreatePool/constants.ts:185 +#: src/components/PageCreatePool/constants.ts:153 msgid "Suitable for volatile tokens paired against ETH and USD stablecoins" msgstr "" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:104 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:167 msgid "Summary" msgstr "摘要" -#: src/components/PagePool/index.tsx:198 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:70 -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PagePoolList/components/TableRowMobile.tsx:165 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/index.tsx:191 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:71 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PagePoolList/components/TableRowMobile.tsx:171 +#: src/components/PageRouterSwap/index.tsx:216 +#: src/components/PageRouterSwap/Page.tsx:112 #: src/components/PageRouterSwap/Page.tsx:116 -#: src/components/PageRouterSwap/Page.tsx:127 -#: src/layout/default/Header.tsx:95 +#: src/layout/default/Header.tsx:31 msgid "Swap" msgstr "兑换" -#: src/components/PageRouterSwap/index.tsx:159 -msgid "swap {fromAmount} {fromToken} for {0} {toToken} at max slippage {maxSlippage}%." -msgstr "" - -#: src/components/PagePool/Swap/index.tsx:193 -#: src/components/PageRouterSwap/index.tsx:221 +#: src/components/PagePool/Swap/index.tsx:189 +#: src/components/PageRouterSwap/index.tsx:216 msgid "Swap Complete" msgstr "交換完成" @@ -2878,12 +2408,8 @@ msgstr "交換完成" #~ msgstr "交換手續費 ({0} - {1}%)" #: src/components/PageCreatePool/Parameters/index.tsx:215 -#~ msgid "Swap Fee ({0} - {1}%)" -#~ msgstr "交換手續費 ({0} - {1}%)" - -#: src/components/PageCreatePool/Parameters/index.tsx:226 -msgid "Swap Fee ({0}% - {1}%)" -msgstr "" +msgid "Swap Fee ({0} - {1}%)" +msgstr "交換手續費 ({0} - {1}%)" #: src/components/PageCreatePool/Summary/ParametersSummary/StableswapParameters.tsx:32 msgid "Swap Fee:" @@ -2897,7 +2423,7 @@ msgstr "暫時無法交換" #~ msgid "Swap type:" #~ msgstr "交換類型:" -#: src/components/PagePool/Swap/index.tsx:511 +#: src/components/PagePool/Swap/index.tsx:512 msgid "Swap Wrapped" msgstr "交換封裝代幣" @@ -2906,19 +2432,19 @@ msgstr "交換封裝代幣" #~ msgstr "將 {0} 交換為 {1}" #: src/components/PageRouterSwap/index.tsx:162 -#~ msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" -#~ msgstr "已将 {fromAmount} {fromToken} 兑换为 {0} {toToken}" +msgid "Swapped {fromAmount} {fromToken} for {0} {toToken}" +msgstr "已将 {fromAmount} {fromToken} 兑换为 {0} {toToken}" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:47 -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:54 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:48 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:55 msgid "Swaps" msgstr "" -#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:75 +#: src/components/PageCreatePool/components/SwitchTokensButton.tsx:37 msgid "Switch tokens" msgstr "切換代幣" -#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:45 +#: src/components/PageCreatePool/Summary/PoolInfoSummary.tsx:67 msgid "Symbol:" msgstr "符號:" @@ -2930,11 +2456,7 @@ msgstr "" #~ msgid "Technical Docs" #~ msgstr "技術文檔" -#: src/components/PageRiskDisclaimer/index.tsx:40 -msgid "Technology Risk" -msgstr "" - -#: src/layout/default/Footer.tsx:38 +#: src/layout/default/Footer.tsx:33 msgid "Telegram" msgstr "電報" @@ -2947,33 +2469,21 @@ msgstr "電報" #~ msgstr "中文電報" #: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -#~ msgid "The address needs to be 42 characters long." -#~ msgstr "" - -#: src/components/PageDeployGauge/InfoBox.tsx:12 -msgid "The address that deploys a gauge is set as the gauge admin/manager." +msgid "The address needs to be 42 characters long." msgstr "" -#: src/components/PageRiskDisclaimer/index.tsx:70 -msgid "The Curve Emergency Admin is a" +#: src/components/PageDeployGauge/InfoBox.tsx:13 +msgid "The address that deploys a gauge is set as the gauge admin/manager." msgstr "" #: src/domain/create-pool/index.tsx:204 #~ msgid "The Curve pool creation factory is not yet available on this network." #~ msgstr "暫時不支援此鏈創池。。" -#: src/components/PageRiskDisclaimer/index.tsx:67 -msgid "The Curve protocol is governed by a Decentralized Autonomous Organization (DAO) comprised of veCRV tokenholders that requires a 1-week vote period with 51% approval and a sufficient voter quorum to execute any actions. It controls critical system functions, including the implementation of new system contracts and the adjustment of system parameters." -msgstr "" - -#: src/components/PagePool/Swap/index.tsx:558 +#: src/components/PagePool/Swap/index.tsx:478 msgid "The entered amount exceeds the available currency reserves." msgstr "" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:50 -msgid "The expected amount you would like to receive, {0}, will actually be {toAmountOutput}." -msgstr "" - #: src/components/PageIntegrations/Page.tsx:43 msgid "The following application all allege they are building atop the Curve ecosystem. Please note that no guarantee is made as to the authenticity, veracity or safety of any of these protocols. You assume all risks for using any links, so please conduct your own research and exercise caution. If you observe any issues with any link or would like to add to this list, please create a PR in the following Github repository <0>https://github.com/curvefi/curve-external-integrations." msgstr "" @@ -2983,15 +2493,7 @@ msgstr "" #~ msgstr "下一步是存入流動性。" #: src/components/PageCreatePool/ConfirmModal/index.tsx:268 -#~ msgid "The next step is to deploy a gauge." -#~ msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:114 -msgid "The overall market dynamics, including price volatility, liquidity fluctuations, and broader economic factors, can impact the value of user funds when providing liquidity. Sudden market movements or unexpected events can result in losses that may be difficult to anticipate or mitigate." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:138 -msgid "The regulatory landscape surrounding blockchain technology, DeFi protocols, tokens, cryptocurrencies, and related activities is constantly evolving, resulting in regulatory uncertainty. The lack of clear and consistent regulations may impact legal obligations, compliance requirements, and potential risks associated with the protocol activities." +msgid "The next step is to deploy a gauge." msgstr "" #: src/hooks/useTokenAlert.tsx:27 @@ -3003,26 +2505,22 @@ msgstr "Ren 網絡目前正在運行,但預計將在不久的將來下線。 #~ msgstr "Ren 網絡目前正在運行,但預計將在不久的將來下線。 確切日期目前未知。 這是我們無法控制的,但我們會盡一切努力確保 Ren 資產的掛鉤得以維持。謝謝。" #: src/components/PageDashboard/components/FormClaimFees.tsx:68 -#~ msgid "The rewards you claimed are viewable in 3pool." -#~ msgstr "您領取的獎勵可在 3pool 中查看。" +msgid "The rewards you claimed are viewable in 3pool." +msgstr "您領取的獎勵可在 3pool 中查看。" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:29 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParametersDaoFees.tsx:25 msgid "The total fee on each trade is split in two parts: one part goes to the pool’s Liquidity Providers, another part goes to the DAO (i.e. Curve veCRV holders)" msgstr "每筆交易的總費用分為兩部分:一部分給資金池的流動性提供者,另一部分給 DAO(veCRV 持有者)" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:99 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:90 msgid "There was an error fetching the pool activity data." msgstr "" -#: src/components/PagePoolList/components/ChipVolatileBaseApy.tsx:15 -msgid "This is a volatile number that will very likely not persist." -msgstr "" - -#: src/components/PoolRewardsCrv.tsx:48 +#: src/components/PoolRewardsCrv.tsx:43 msgid "This pool has CRV rewards that aren’t currently being distributed.<0/>This pool has a very small amount of rewards waiting to be distributed to it; but since the amount of rewards is very small, the bridge used to send these CRV tokens over is holding onto those tokens until they grow to an amount big enough to be bridged. If this pool continues receiving votes, the amount of tokens to be distributed will grow every Thursday, and eventually unlock and be distributed then." msgstr "該池有CRV獎勵,目前尚未分配。<0/>該池有極少量的獎勵等待分配給它; 但是由於獎勵的數量非常少,用於發送這些CRV代幣的橋樑會一直持有這些代幣,直到它們增長到足以被橋接的數量。 如果這個池子繼續接受投票,每個星期四分配的代幣數量就會增加,最終解鎖並分配。" -#: src/components/PagePool/Withdraw/components/FormClaim.tsx:218 +#: src/components/PagePool/Withdraw/components/FormClaim.tsx:219 msgid "This pool has CRV rewards that aren’t streaming yet. Click ‘Claim CRV’ to resume reward streaming for you and everyone else!" msgstr "該池有尚未傳輸的 CRV 獎勵。 點擊“領取 CRV”,為您和其他所有人恢復獎勵流通!" @@ -3030,151 +2528,88 @@ msgstr "該池有尚未傳輸的 CRV 獎勵。 點擊“領取 CRV”,為您 #~ msgid "This pool has CRV rewards that aren’t streaming yet. Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" #~ msgstr "該池有尚未被分發的 CRV 獎勵。 前往該池的“提款/領取”頁面,然後單擊“輕推CRV獎勵”按鈕,為您和其他所有人恢復獎勵分發流!" -#: src/components/PoolRewardsCrv.tsx:30 +#: src/components/PoolRewardsCrv.tsx:28 msgid "This pool has CRV rewards that aren’t streaming yet.<0/>Head to this pool’s “Withdraw/Claim” page and click on the “Nudge CRV rewards” button to resume reward streaming for you and everyone else!" msgstr "該池有尚未被分發的 CRV 獎勵。 前往該池的“提款/領取”頁面,然後單擊“輕推CRV獎勵”按鈕,為您和其他所有人恢復獎勵分發流!" -#: src/components/PagePool/components/AlertSeedAmounts.tsx:52 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amount of the other token should be {1}." -msgstr "" - -#: src/components/PagePool/components/AlertSeedAmounts.tsx:54 -msgid "This pool is empty. Assuming you are adding {0}, the equivalent amounts of the other tokens should be:" -msgstr "" - #: src/components/PagePool/components/TransferActions.tsx:47 -#~ msgid "This pool is still empty, it should be seeded with the following rate {0}" -#~ msgstr "此池還是空的,應按以下速率{0}開池" +msgid "This pool is still empty, it should be seeded with the following rate {0}" +msgstr "此池還是空的,應按以下速率{0}開池" #: src/components/PagePool/components/TransferActions.tsx:48 -#~ msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." -#~ msgstr "此池還是空的。 假設匯率為 1:1,則應使用 {0} 開池。" +msgid "This pool is still empty. Assuming an exchange rate of 1:1, it should be seeded with {0}." +msgstr "此池還是空的。 假設匯率為 1:1,則應使用 {0} 開池。" #: src/domain/transfer/components/transfer-actions.tsx:49 #~ msgid "This pool is still empty. It needs to be seeded with an initial deposit in order to enable swaps." #~ msgstr "這個池子還是空的。 為了啟動交換,它需要初始存款。" #: src/components/PagePool/components/WarningModal.tsx:71 -#~ msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:69 -#~ msgid "This swap has a high price impact ({0}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:80 -msgid "This swap has a high price impact ({formattedValue}) and low exchange rate ({formattedExchangeRate})." +msgid "This swap has a high price impact ({0}%) and low exchange rate ({1}%)." msgstr "" -#: src/components/PagePool/components/WarningModal.tsx:78 -msgid "This swap has a high price impact ({formattedValue})." +#: src/components/PagePool/components/WarningModal.tsx:69 +msgid "This swap has a high price impact ({0}%)." msgstr "" #: src/components/PagePool/components/WarningModal.tsx:67 -#~ msgid "This swap has a low exchange rate ({0}%)." -#~ msgstr "" - -#: src/components/PagePool/components/WarningModal.tsx:76 -msgid "This swap has a low exchange rate ({formattedExchangeRate})." +msgid "This swap has a low exchange rate ({0}%)." msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:80 -msgid "Three Coin Cryptoswap-NG" -msgstr "" - -#: src/components/PageCreatePool/constants.ts:184 +#: src/components/PageCreatePool/constants.ts:152 msgid "Three Coin Volatile" msgstr "" -#: src/components/PagePool/PoolDetails/ChartOhlcWrapper/PoolActivity.tsx:71 +#: src/components/PagePool/PoolDetails/PoolInfo/PoolActivity.tsx:72 msgid "Time" msgstr "" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:234 -msgid "to sim)." -msgstr "" - -#: src/components/PageDeployGauge/index.tsx:84 +#: src/components/PageDeployGauge/index.tsx:83 msgid "Toggle between mainnet and sidechain gauge deployment" msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:36 +#: src/components/PagePool/PoolDetails/PoolStats/Contracts.tsx:34 msgid "Token" msgstr "代幣" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:38 -#: src/components/PageCreatePool/TokensInPool/index.tsx:602 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:38 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:36 +#: src/components/PageCreatePool/TokensInPool/index.tsx:510 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:26 msgid "Token A" msgstr "代幣 A" -#: src/components/PageDashboard/components/TableHead.tsx:73 -#: src/components/PagePoolList/components/TableHeadRewards.tsx:27 -#: src/components/PagePoolList/components/TableRowMobile.tsx:137 +#: src/components/PageDashboard/index.tsx:60 +#: src/components/PagePoolList/Page.tsx:62 msgid "Token APR based on current prices of tokens and reward rates" msgstr "代幣的APR年化率是基於當前代幣價格和獎勵率" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:100 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:97 msgid "Token APR based on current prices of tokens and reward rates." msgstr "代幣的APR年化率是基於當前代幣價格和獎勵率。" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:41 -#: src/components/PageCreatePool/TokensInPool/index.tsx:621 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:41 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:39 +#: src/components/PageCreatePool/TokensInPool/index.tsx:529 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:29 msgid "Token B" msgstr "代幣 B" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:44 -#: src/components/PageCreatePool/TokensInPool/index.tsx:642 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:79 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:44 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:42 +#: src/components/PageCreatePool/TokensInPool/index.tsx:550 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:53 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:32 msgid "Token C" msgstr "代幣 C" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:47 -#: src/components/PageCreatePool/TokensInPool/index.tsx:662 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:62 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:47 +#: src/components/PageCreatePool/Summary/OracleSummary.tsx:45 +#: src/components/PageCreatePool/TokensInPool/index.tsx:574 +#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 +#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:35 msgid "Token D" msgstr "代幣 D" -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:50 -#: src/components/PageCreatePool/TokensInPool/index.tsx:682 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:63 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:50 -msgid "Token E" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:53 -#: src/components/PageCreatePool/TokensInPool/index.tsx:702 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:64 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:53 -msgid "Token F" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:56 -#: src/components/PageCreatePool/TokensInPool/index.tsx:722 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:65 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:56 -msgid "Token G" -msgstr "" - -#: src/components/PageCreatePool/Summary/OracleSummary.tsx:59 -#: src/components/PageCreatePool/TokensInPool/index.tsx:742 -#: src/components/PageCreatePool/TokensInPool/SelectToken.tsx:66 -#: src/components/PageCreatePool/TokensInPool/SetOracle.tsx:59 -msgid "Token H" -msgstr "" - #: src/components/PageCreatePool/TokensInPool/index.tsx:589 -#~ msgid "" -#~ "Tokens appear to be unpegged (>5% deviation from 1:1).\n" -#~ "Consider using Cryptoswap instead." -#~ msgstr "" - -#: src/components/PageCreatePool/TokensInPool/index.tsx:757 msgid "" -"Tokens appear to be unpegged (above 5% deviation from 1:1).\n" +"Tokens appear to be unpegged (>5% deviation from 1:1).\n" "Consider using Cryptoswap instead." msgstr "" @@ -3186,31 +2621,28 @@ msgstr "" #~ msgid "Tokens Approval Failed" #~ msgstr "代幣批准失敗" -#: src/components/PageCreatePool/components/Navigation.tsx:41 +#: src/components/PageCreatePool/components/Navigation.tsx:63 msgid "TOKENS IN POOL" msgstr "池中的代幣" -#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:61 +#: src/components/PageCreatePool/Summary/TokensInPoolSummary.tsx:58 msgid "Tokens In Pool:" msgstr "池中的代幣:" -#: src/components/PageDashboard/components/Summary.tsx:95 +#: src/components/PageDashboard/components/Summary.tsx:96 msgid "Total Balances" msgstr "總餘額" -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:31 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:32 msgid "Total Daily Profits" msgstr "每日總利潤" -#: src/layout/default/Header.tsx:69 +#: src/layout/default/HeaderMobile.tsx:207 +#: src/layout/default/HeaderSecondary.tsx:50 msgid "Total Deposits" msgstr "總存款" -#: src/components/PagePool/PoolDetails/PoolStats/PoolTotalStaked.tsx:20 -msgid "Total LP Tokens staked:" -msgstr "" - -#: src/components/PageDashboard/components/Summary.tsx:159 +#: src/components/PageDashboard/components/Summary.tsx:165 msgid "Total Summary" msgstr "總摘要" @@ -3226,27 +2658,21 @@ msgstr "交易路由:" #~ msgid "trading fees distributed to CRV lockers" #~ msgstr "分配給CRV鎖倉者的交易費用" -#: src/components/PageDashboard/components/FormClaimFees.tsx:43 +#: src/components/PageDashboard/components/FormClaimFees.tsx:93 msgid "Trading fees distributed to CRV lockers" msgstr "" -#: src/components/PageRouterSwap/index.tsx:168 -msgid "Transaction complete. Received {0} {toToken}." -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:204 -#: src/components/PageDeployGauge/ProcessSummary.tsx:53 -#: src/components/PageDeployGauge/ProcessSummary.tsx:85 +#: src/components/PageDeployGauge/ProcessSummary.tsx:43 +#: src/components/PageDeployGauge/ProcessSummary.tsx:64 msgid "Transaction:" msgstr "" -#: src/components/PageCreatePool/constants.ts:168 -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:78 -#: src/components/PagePoolList/index.tsx:102 +#: src/components/PageCreatePool/constants.ts:136 +#: src/components/PagePoolList/index.tsx:108 msgid "Tricrypto" msgstr "" -#: src/components/PagePoolList/Page.tsx:58 +#: src/components/PagePoolList/Page.tsx:69 msgid "TVL" msgstr "總鎖定價值" @@ -3254,34 +2680,31 @@ msgstr "總鎖定價值" #~ msgid "Twitter" #~ msgstr "Twitter" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:77 -msgid "Two Coin Cryptoswap" -msgstr "" - -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:79 -msgid "Two Coin Cryptoswap-NG" -msgstr "" - #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:122 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:165 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:227 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:262 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:301 #: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:351 -#~ msgid "Tx: {0} created" -#~ msgstr "已創建交易:{0}" - -#: src/components/PageCreatePool/ConfirmModal/CreatePoolButton.tsx:34 -msgid "Tx: {poolId} created" -msgstr "" +msgid "Tx: {0} created" +msgstr "已創建交易:{0}" #: src/components/PageCreatePool/ConfirmModal/DeployGaugeButton.tsx:64 -#~ msgid "Tx: Gauge deployed" -#~ msgstr "" - -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:106 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:115 -#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:185 +msgid "Tx: Gauge deployed" +msgstr "" + +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:148 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:184 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:220 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:256 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:294 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:328 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:362 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:396 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:434 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:467 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:500 +#: src/components/PageDeployGauge/components/DeployGaugeButton.tsx:533 msgid "Tx: Gauge for {0} deployed" msgstr "" @@ -3400,32 +2823,28 @@ msgid "Unable to get locked CRV info" msgstr "" #: src/components/AlertFormError.tsx:61 -#: src/components/PageDashboard/index.tsx:154 +#: src/components/PageDashboard/index.tsx:159 msgid "Unable to get pool list" msgstr "無法獲取各池列表" -#: src/store/createUserSlice.ts:90 -msgid "Unable to get pools" -msgstr "" - #: src/domain/transfer/withdraw/form-claim/index.tsx:122 #~ msgid "Unable to get rewards" #~ msgstr "無法獲得獎勵" #: src/components/PagePool/index.tsx:151 -#~ msgid "Unable to get seed initial rate" -#~ msgstr "無法獲得seed initial rate" +msgid "Unable to get seed initial rate" +msgstr "無法獲得seed initial rate" #: src/domain/transfer/deposit/form-deposit/index.tsx:191 #: src/domain/transfer/deposit/form-deposit-stake/index.tsx:189 #~ msgid "Unable to get slippage" #~ msgstr "無法獲得滑點數據" -#: src/components/DetailInfoEstGas.tsx:105 +#: src/components/DetailInfoEstGas.tsx:98 msgid "Unable to get USD rate" msgstr "無法獲取美元匯率" -#: src/components/PagePool/components/TransferActions.tsx:46 +#: src/components/PagePool/components/TransferActions.tsx:58 msgid "Unable to get wallet balances" msgstr "無法獲取錢包餘額" @@ -3515,7 +2934,7 @@ msgstr "" #~ msgid "Unstaked {lpTokenPayload} LP Tokens" #~ msgstr "解除質押 {lpTokenPayload} LP 代幣" -#: src/components/PagePool/UserDetails/index.tsx:104 +#: src/components/PagePool/UserDetails/index.tsx:107 msgid "Unstaked:" msgstr "未質押的代幣:" @@ -3523,11 +2942,7 @@ msgstr "未質押的代幣:" #~ msgid "Unstaking" #~ msgstr "解除質押中" -#: src/components/PageRiskDisclaimer/index.tsx:117 -msgid "Unvetted Tokens:" -msgstr "" - -#: src/components/PageCreatePool/Parameters/index.tsx:268 +#: src/components/PageCreatePool/Parameters/index.tsx:257 msgid "Update Quote" msgstr "更新報價" @@ -3535,24 +2950,24 @@ msgstr "更新報價" #~ msgid "Update Unlock Date" #~ msgstr "更新解鎖日期" -#: src/components/PageCreatePool/ConfirmModal/index.tsx:190 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:304 msgid "Upload an icon for a new token" msgstr "上傳新代幣的圖標" -#: src/components/PagePool/UserDetails/index.tsx:175 +#: src/components/PagePool/UserDetails/index.tsx:174 msgid "USD balance" msgstr "美元餘額" -#: src/components/PageDashboard/index.tsx:57 +#: src/components/PageDashboard/index.tsx:68 msgid "USD Profits" msgstr "美元利潤" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:58 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:60 msgid "USD total" msgstr "美元總額" -#: src/components/PageDashboard/components/SummaryClaimable.tsx:65 -#: src/components/PageDashboard/components/SummaryRecurrence.tsx:71 +#: src/components/PageDashboard/components/SummaryClaimable.tsx:59 +#: src/components/PageDashboard/components/SummaryRecurrence.tsx:65 msgid "USD Total" msgstr "美元總計" @@ -3560,7 +2975,7 @@ msgstr "美元總計" #~ msgid "USD total balance updates every ~1 minute" #~ msgstr "美元總餘額每約1分鐘更新一次" -#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:61 +#: src/components/PagePool/PoolDetails/CurrencyReserves/index.tsx:64 msgid "USD total balance updates every ~5 minute" msgstr "美元總餘額每~5分鐘更新一次" @@ -3568,31 +2983,32 @@ msgstr "美元總餘額每~5分鐘更新一次" msgid "User rejected action" msgstr "" -#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:18 +#: src/components/PagePool/PoolDetails/PoolStats/index.tsx:79 +#: src/components/PagePoolList/components/TableCellReferenceAsset.tsx:16 msgid "V2 pools contain non pegged assets. Liquidity providers are exposed to all assets in the pools." msgstr "V2 池包含非掛鉤穩定資產。 流動性提供者暴露於池中的所有資產。" -#: src/components/PageDashboard/components/TableHead.tsx:67 -#: src/components/PagePoolList/components/TableHead.tsx:80 -#: src/components/PagePoolList/components/TableHead.tsx:100 +#: src/components/PageDashboard/components/TableHead.tsx:85 +#: src/components/PagePoolList/components/TableHead.tsx:91 +#: src/components/PagePoolList/components/TableHead.tsx:113 msgid "Variable APY based on today's trading activity" msgstr "動態APY是基於今天的交易量 " -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:55 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:49 msgid "Variable APY based on today's trading activity." msgstr "動態APY是基於今天的交易量。" -#: src/components/PageDashboard/components/FormClaimFees.tsx:42 -msgid "veCRV rewards" -msgstr "veCRV 獎勵" +#: src/domain/user-dashboard/summary.tsx:215 +#~ msgid "veCRV rewards" +#~ msgstr "veCRV 獎勵" #: src/domain/user-dashboard/summary.tsx:215 #~ msgid "veCRV rewards:" #~ msgstr "veCRV 獎勵:" #: src/components/PageDashboard/components/FormClaimFees.tsx:89 -#~ msgid "veCRV rewards: <0>{0} 3CRV" -#~ msgstr "" +msgid "veCRV rewards: <0>{0} 3CRV" +msgstr "" #: src/domain/user-dashboard/components/form-claim-lp-rewards.tsx:95 #~ msgid "veCRV rewards: <0>{claimFeesAmount} 3CRV" @@ -3602,11 +3018,11 @@ msgstr "veCRV 獎勵" #~ msgid "Vesting" #~ msgstr "vesting解鎖" -#: src/components/PageDashboard/components/Summary.tsx:122 +#: src/components/PageDashboard/components/Summary.tsx:128 msgid "View address" msgstr "查看地址" -#: src/components/PagePoolList/index.tsx:285 +#: src/components/PagePoolList/index.tsx:270 msgid "view all pools." msgstr "查看所有池。" @@ -3614,7 +3030,7 @@ msgstr "查看所有池。" #~ msgid "Virtual price" #~ msgstr "虛擬價格" -#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:96 +#: src/components/PagePool/PoolDetails/PoolStats/PoolParameters.tsx:103 msgid "Virtual price:" msgstr "虛擬價格:" @@ -3635,95 +3051,66 @@ msgstr "虛擬價格:" #~ msgid "Visit old UI" #~ msgstr "訪問舊用戶界面" -#: src/components/PagePool/PoolDetails/CurrencyReserves/CurrencyReservesContent.tsx:59 -msgid "Visit pool" -msgstr "" - -#: src/components/PageCreatePool/ConfirmModal/index.tsx:166 +#: src/components/PageCreatePool/ConfirmModal/index.tsx:295 msgid "Visit the new pool to deposit liquidity." msgstr "" -#: src/components/PageDeployGauge/ProcessSummary.tsx:97 +#: src/components/PageDeployGauge/ProcessSummary.tsx:76 msgid "Visit the pool" msgstr "" -#: src/components/PagePoolList/Page.tsx:59 +#: src/components/PagePoolList/Page.tsx:70 msgid "Volume" msgstr "量" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:112 -msgid "Vyper Version:" -msgstr "" - -#: src/components/PagePool/Deposit/components/FormDeposit.tsx:147 -#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:150 -#: src/components/PagePool/Swap/index.tsx:197 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:160 -#: src/components/PageRouterSwap/index.tsx:226 +#: src/components/PagePool/Deposit/components/FormDeposit.tsx:144 +#: src/components/PagePool/Deposit/components/FormDepositStake.tsx:145 +#: src/components/PagePool/Swap/index.tsx:193 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:159 +#: src/components/PageRouterSwap/index.tsx:221 msgid "Warning!" msgstr "警告!" #: src/components/PageRouterSwap/index.tsx:500 -#~ msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" -#~ msgstr "" +msgid "Warning! Due to slippage, the expected amount you would like to receive ({0}) will actually be {1}" +msgstr "" #: src/components/AlertFormWarning.tsx:22 -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:48 msgid "Warning! Exchange rate is too low!" msgstr "警告! 匯率太低了!" -#: src/components/PageRouterSwap/components/RouterSwapAlerts.tsx:47 -msgid "Warning! High price impact!" -msgstr "" - #: src/components/PageRouterSwap/index.tsx:496 -#~ msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." -#~ msgstr "" +msgid "Warning! The exchange rate is too low, and due to slippage, the expected amount you would like to receive ({0}) will actually be {1}." +msgstr "" -#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:40 +#: src/components/PagePool/PoolDetails/PoolStats/Rewards.tsx:34 msgid "Weekly" msgstr "每週" -#: src/components/PageRiskDisclaimer/index.tsx:123 -msgid "When participating as a liquidity provider in any pool, users should carefully assess the tokens' functionality, security audits, team credibility, community feedback, and other relevant factors to make informed decisions and mitigate potential risks associated with the pool assets." -msgstr "" - -#: src/components/PageRiskDisclaimer/index.tsx:53 -msgid "When you engage in transactions on Ethereum or EVM-compatible blockchains, it is important to understand that these transactions are immutable and irreversible. Once a transaction is confirmed and recorded on the blockchain, it cannot be modified, reversed, or deleted. This means that if a user sends funds to an incorrect address or engage in a fraudulent transaction, it may not be possible to recover the funds. It is crucial to exercise caution, verify transaction details, and use secure wallets to minimize the risk of irreversible transactions." -msgstr "" - -#: src/layout/default/Footer.tsx:131 +#: src/layout/default/Footer.tsx:97 msgid "Whitepaper" msgstr "白皮書" -#: src/layout/default/Footer.tsx:73 +#: src/layout/default/Footer.tsx:68 msgid "Wiki CN" msgstr "Wiki 中文" -#: src/components/PageCreatePool/Parameters/SelectPreset.tsx:232 -msgid "with similar assets for inspiration (or use" -msgstr "" - -#: src/components/AlertSlippage.tsx:24 -msgid "With your current slippage tolerance setting ({0}), the expected output displayed above might incur up to <0>{1} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -msgstr "" - #: src/components/AlertSlippage.tsx:24 -#~ msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." -#~ msgstr "使用您當前的滑點容限設置 ({maxSlippage}%),上面顯示的預期輸出可能會產生高達 <0>${0} 的滑點(除了價格影響)。 我們建議您降低上面的滑點容限設置。" +msgid "With your current slippage tolerance setting ({maxSlippage}%), the expected output displayed above might incur up to <0>${0} worth of slippage (in addition to the price impact). We recommend that you reduce your slippage tolerance setting just above." +msgstr "使用您當前的滑點容限設置 ({maxSlippage}%),上面顯示的預期輸出可能會產生高達 <0>${0} 的滑點(除了價格影響)。 我們建議您降低上面的滑點容限設置。" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 #: src/components/PagePool/Withdraw/index.tsx:31 -#: src/components/PagePoolList/components/TableRowMobile.tsx:162 +#: src/components/PagePoolList/components/TableRowMobile.tsx:168 msgid "Withdraw" msgstr "提款" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw Claim" msgstr "" #: src/components/PageDashboard/components/FormVecrv.tsx:72 -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:156 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:155 msgid "Withdraw Complete" msgstr "提款完成" @@ -3745,7 +3132,7 @@ msgstr "提款 CRV 完成" #~ msgid "Withdraw Liquidity Approval Failed" #~ msgstr "提款批准失敗" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:460 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:459 msgid "Withdraw Wrapped" msgstr "提款封裝代幣" @@ -3753,7 +3140,7 @@ msgstr "提款封裝代幣" #~ msgid "Withdraw/ Claim" #~ msgstr "提款/領取" -#: src/components/PagePool/index.tsx:197 +#: src/components/PagePool/index.tsx:190 msgid "Withdraw/Claim" msgstr "提款/領取" @@ -3761,7 +3148,7 @@ msgstr "提款/領取" #~ msgid "Withdrawing" #~ msgstr "提款中" -#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:111 +#: src/components/PagePool/Withdraw/components/FormWithdraw.tsx:110 msgid "Withdrew {0} LP Tokens for {tokenText}" msgstr "" @@ -3769,11 +3156,11 @@ msgstr "" #~ msgid "Withdrew {lpTokenPayload} LP Tokens, received {0}" #~ msgstr "撤回 {lpTokenPayload} 個LP代幣,收到 {0}" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:341 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:178 msgid "Xcp Profit A:" msgstr "" -#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:335 +#: src/components/PagePool/PoolDetails/PoolParameters/index.tsx:172 msgid "Xcp Profit:" msgstr "" @@ -3786,20 +3173,21 @@ msgstr "" msgid "You have a balance in this pool" msgstr "您在此池中有些餘額" -#: src/components/PageCrvLocker/components/FormLockDate.tsx:214 +#: src/components/PageCrvLocker/components/FormLockDate.tsx:215 msgid "You have reached the maximum locked date." msgstr "" -#: src/components/PagePool/UserDetails/index.tsx:76 +#: src/components/PagePool/UserDetails/index.tsx:79 msgid "your boost" msgstr "你的CRV加速" -#: src/components/PagePool/UserDetails/index.tsx:111 -#: src/components/PagePool/UserDetails/index.tsx:116 +#: src/components/PagePool/UserDetails/index.tsx:114 +#: src/components/PagePool/UserDetails/index.tsx:119 msgid "Your CRV Rewards tAPR:" msgstr "你的CRV獎勵年化率" -#: src/components/PagePool/index.tsx:126 +#: src/components/PagePool/index.tsx:105 +#: src/components/PagePool/index.tsx:110 msgid "Your Details" msgstr "" @@ -3807,6 +3195,6 @@ msgstr "" msgid "Your lock has expired, claim your <0>{lockedAmountDisplay} CRV" msgstr "您的CRV鎖倉已過期,領取您的<0>{lockedAmountDisplay} CRV" -#: src/components/PagePool/UserDetails/index.tsx:92 +#: src/components/PagePool/UserDetails/index.tsx:95 msgid "Your position" msgstr "你的頭寸" diff --git a/packages/curve-lib/src/shared/lib/queries/factory.ts b/packages/curve-lib/src/shared/lib/queries/factory.ts index 6dbceda88..208e82a2d 100644 --- a/packages/curve-lib/src/shared/lib/queries/factory.ts +++ b/packages/curve-lib/src/shared/lib/queries/factory.ts @@ -9,7 +9,7 @@ export const createQueryHook = ( return useQuery(options) } -export const createGetQueryData = any[]>>( +export const createGetQueryData = readonly any[]>>( keys: KeysObject ) => (key: Key, keyData: Parameters[0]) => From 243c58d1b875a984f4a9fdad91c99dbd65fdcafd Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 14 Oct 2024 15:36:49 +0200 Subject: [PATCH 029/137] fix: markets page load stalled --- .../src/entities/chain/api/markets-api.ts | 1 - apps/lend/src/entities/chain/lib/chain-tvl.ts | 1 + .../lend/src/entities/chain/lib/data-hooks.ts | 7 +++-- .../src/entities/chain/model/query-options.ts | 4 +-- .../src/entities/chain/model/validation.ts | 2 +- apps/lend/src/lib/apiLending.ts | 28 ------------------- apps/lend/src/store/createAppSlice.ts | 1 + 7 files changed, 10 insertions(+), 34 deletions(-) diff --git a/apps/lend/src/entities/chain/api/markets-api.ts b/apps/lend/src/entities/chain/api/markets-api.ts index 3cf84a567..373098c51 100644 --- a/apps/lend/src/entities/chain/api/markets-api.ts +++ b/apps/lend/src/entities/chain/api/markets-api.ts @@ -13,6 +13,5 @@ export const queryOneWayMarketNames: QueryFunction< assertChainValidity({ chainId }) const {api} = useStore.getState() - await api!.oneWayfactory.fetchMarkets() return api!.oneWayfactory.getMarketList() } diff --git a/apps/lend/src/entities/chain/lib/chain-tvl.ts b/apps/lend/src/entities/chain/lib/chain-tvl.ts index 60617198e..0da2eb853 100644 --- a/apps/lend/src/entities/chain/lib/chain-tvl.ts +++ b/apps/lend/src/entities/chain/lib/chain-tvl.ts @@ -13,6 +13,7 @@ export const useTvl = (chainId: ChainId): PartialQueryResult => { const tokenAddresses = useMemo( () => Object.values(marketMapping ?? {}) + // note: include the borrowed tokens here, to be used in `filterSmallMarkets` .flatMap((market) => [market.borrowed_token, market.collateral_token]) .map((t) => t.address), [marketMapping], diff --git a/apps/lend/src/entities/chain/lib/data-hooks.ts b/apps/lend/src/entities/chain/lib/data-hooks.ts index e1d165d08..0dc118f6d 100644 --- a/apps/lend/src/entities/chain/lib/data-hooks.ts +++ b/apps/lend/src/entities/chain/lib/data-hooks.ts @@ -3,16 +3,19 @@ import networks from '@/networks' import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' import { useMemo } from 'react' import { useApi } from './chain-info' +import { checkChainValidity } from '@/entities/chain' export const useOneWayMarketMapping = (chainId: ChainId) => { + const chainValid = checkChainValidity({ chainId }) // extra check to make sure the API is loaded before we use stale market names + const { data: marketNames, ...rest } = useOneWayMarketNames({ chainId }) const { data: api } = useApi(); const data: Record | undefined = useMemo(() => - marketNames && api && Object.fromEntries( + chainValid && marketNames && api ? Object.fromEntries( marketNames .filter(marketName => !networks[chainId].hideMarketsInUI[marketName]) .map(name => [name, api.getOneWayMarket(name)]) - ), [api, chainId, marketNames] + ) : undefined, [api, chainId, chainValid, marketNames] ) return { data, ...rest } } diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts index dcbf960d9..52a8cc7b1 100644 --- a/apps/lend/src/entities/chain/model/query-options.ts +++ b/apps/lend/src/entities/chain/model/query-options.ts @@ -5,10 +5,10 @@ import { queryOneWayMarketNames } from '../api/markets-api' import { chainKeys } from './query-keys' import { ChainQueryParams } from '../types' -export const getOneWayMarketNames = (params: ChainQueryParams) => +export const getOneWayMarketNames = (params: ChainQueryParams, condition = true) => queryOptions({ queryKey: chainKeys.markets(params), queryFn: queryOneWayMarketNames, staleTime: REFRESH_INTERVAL['5m'], - enabled: checkChainValidity(params), + enabled: condition && checkChainValidity(params), }) diff --git a/apps/lend/src/entities/chain/model/validation.ts b/apps/lend/src/entities/chain/model/validation.ts index f3065168b..904f61914 100644 --- a/apps/lend/src/entities/chain/model/validation.ts +++ b/apps/lend/src/entities/chain/model/validation.ts @@ -8,7 +8,7 @@ export const chainValidationGroup = ({ chainId }: ChainQueryParams) => test('chainId', () => { enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId() const { api, isLoadingApi } = useStore.getState() - enforce(isLoadingApi).message('API should be loaded').equals(chainId) + enforce(isLoadingApi).message('API should be loaded').equals(false) enforce(api?.chainId).message('Chain ID should be loaded').equals(chainId) }) }) diff --git a/apps/lend/src/lib/apiLending.ts b/apps/lend/src/lib/apiLending.ts index 5dcf1e6d7..401aca2d7 100644 --- a/apps/lend/src/lib/apiLending.ts +++ b/apps/lend/src/lib/apiLending.ts @@ -46,19 +46,6 @@ export const helpers = { val2 = val2 || '0' return BN(val1).isGreaterThan(val2) }, - fetchMarkets: async (api: Api) => { - const resp = { marketList: [] as string[], error: '' } - try { - log('fetchMarkets', api.chainId) - await api.oneWayfactory.fetchMarkets(USE_API) - resp.marketList = api.oneWayfactory.getMarketList() - return resp - } catch (error) { - resp.error = 'error-api' - console.error(error) - return resp - } - }, fetchCustomGasFees: async (curve: Api) => { let resp: { customFeeData: Record | null; error: string } = { customFeeData: null, error: '' } try { @@ -96,18 +83,6 @@ export const helpers = { return resp } }, - fetchUsdRate: async (api: Api, tokenAddress: string) => { - let resp: { usdRate: string | number; error: string } = { usdRate: 0, error: '' } - try { - resp.usdRate = await api.getUsdRate(tokenAddress) - return resp - } catch (error) { - console.error(error) - resp.error = getErrorMessage(error, 'error-usd-rate') - resp.usdRate = 'NaN' - return resp - } - }, getStepStatus: (isComplete: boolean, isInProgress: boolean, isValid: boolean): StepStatus => { return isComplete ? 'succeeded' : isInProgress ? 'in-progress' : isValid ? 'current' : 'pending' }, @@ -132,9 +107,6 @@ export const helpers = { } const market = { - hasLeverage: async (market: OneWayMarketTemplate) => { - return market.leverage.hasLeverage() - }, fetchStatsParameters: async (markets: OneWayMarketTemplate[]) => { log('fetchStatsParameters', markets.length) let results: { [id: string]: MarketStatParameters } = {} diff --git a/apps/lend/src/store/createAppSlice.ts b/apps/lend/src/store/createAppSlice.ts index ae64353b9..dee1b68cd 100644 --- a/apps/lend/src/store/createAppSlice.ts +++ b/apps/lend/src/store/createAppSlice.ts @@ -111,6 +111,7 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => await api.oneWayfactory.fetchMarkets(); state.updateGlobalStoreByKey('isLoadingApi', false) + console.log({fetching: 'markets done'}) if (!prevApi || isNetworkSwitched) { // fetch markets TVL (remove once ready from api) From c73360cfe443dcd743a09a38b8cf6d8f4175ec56 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Mon, 14 Oct 2024 16:07:59 +0200 Subject: [PATCH 030/137] fix: remove logging --- apps/lend/src/store/createAppSlice.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/lend/src/store/createAppSlice.ts b/apps/lend/src/store/createAppSlice.ts index dee1b68cd..ae64353b9 100644 --- a/apps/lend/src/store/createAppSlice.ts +++ b/apps/lend/src/store/createAppSlice.ts @@ -111,7 +111,6 @@ const createAppSlice = (set: SetState, get: GetState): AppSlice => await api.oneWayfactory.fetchMarkets(); state.updateGlobalStoreByKey('isLoadingApi', false) - console.log({fetching: 'markets done'}) if (!prevApi || isNetworkSwitched) { // fetch markets TVL (remove once ready from api) From a075c5c0f6412a5bb1182c66715aebd4c0811cf1 Mon Sep 17 00:00:00 2001 From: Ignat Date: Tue, 15 Oct 2024 16:55:30 +0500 Subject: [PATCH 031/137] feat: implement `MUI` themes generator --- .../curve-ui-kit/src/entities/themes/index.ts | 1 + .../entities/themes/lib/generate-themes.ts | 19 +++++ .../src/entities/themes/lib/index.ts | 1 + .../src/entities/themes/model/components.ts | 16 +++++ .../src/entities/themes/model/index.ts | 4 ++ .../src/entities/themes/model/pallette.ts | 69 +++++++++++++++++++ .../src/entities/themes/model/spacing.ts | 32 +++++++++ .../src/entities/themes/model/typography.ts | 34 +++++++++ 8 files changed, 176 insertions(+) create mode 100644 packages/curve-ui-kit/src/entities/themes/index.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/lib/index.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/model/components.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/model/index.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/model/pallette.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/model/spacing.ts create mode 100644 packages/curve-ui-kit/src/entities/themes/model/typography.ts diff --git a/packages/curve-ui-kit/src/entities/themes/index.ts b/packages/curve-ui-kit/src/entities/themes/index.ts new file mode 100644 index 000000000..99b409687 --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/index.ts @@ -0,0 +1 @@ +export * from './lib' diff --git a/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts b/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts new file mode 100644 index 000000000..9435e1e5e --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts @@ -0,0 +1,19 @@ +import { createTheme as createMuiTheme, type Theme } from '@mui/material/styles' +import { basicMuiTheme, type ThemeKey } from '@/shared/lib/basic-theme' +import { createComponents, createPalette, createSpacing, createTypography } from '../model' + +function generateTheme(mode: ThemeKey): Theme { + const muiTheme = createMuiTheme({ + ...basicMuiTheme, + palette: createPalette(mode), + typography: createTypography(mode), + components: createComponents(mode), + ...createSpacing(mode), + }) + + return muiTheme +} + +export const lightTheme = generateTheme('light') +export const darkTheme = generateTheme('dark') +export const chadTheme = generateTheme('chad') diff --git a/packages/curve-ui-kit/src/entities/themes/lib/index.ts b/packages/curve-ui-kit/src/entities/themes/lib/index.ts new file mode 100644 index 000000000..1c2683041 --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/lib/index.ts @@ -0,0 +1 @@ +export * from './generate-themes' diff --git a/packages/curve-ui-kit/src/entities/themes/model/components.ts b/packages/curve-ui-kit/src/entities/themes/model/components.ts new file mode 100644 index 000000000..1241cabc4 --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/model/components.ts @@ -0,0 +1,16 @@ +import { type ThemeOptions } from '@mui/material/styles' +import { figmaTokens } from '@/shared/api/figma-tokens' +import type { ThemeKey } from '@/shared/lib/basic-theme' +import { defineMuiButton } from '@/shared/ui/Button' +import { defineMuiCssBaseline } from '@/shared/ui/CssBaseline' +import { defineMuiTypography } from '@/shared/ui/Typography' + +export const createComponents = (mode: ThemeKey) => { + const components: ThemeOptions['components'] = { + MuiTypography: defineMuiTypography(), + MuiCssBaseline: defineMuiCssBaseline(), + MuiButton: defineMuiButton(figmaTokens, mode), + } + + return components +} diff --git a/packages/curve-ui-kit/src/entities/themes/model/index.ts b/packages/curve-ui-kit/src/entities/themes/model/index.ts new file mode 100644 index 000000000..ffc8ef0b9 --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/model/index.ts @@ -0,0 +1,4 @@ +export * from './components' +export * from './pallette' +export * from './spacing' +export * from './typography' diff --git a/packages/curve-ui-kit/src/entities/themes/model/pallette.ts b/packages/curve-ui-kit/src/entities/themes/model/pallette.ts new file mode 100644 index 000000000..e14f793ba --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/model/pallette.ts @@ -0,0 +1,69 @@ +import type { ThemeOptions } from '@mui/material' +import { extractPairs, figmaTokens } from '@/shared/api/figma-tokens' +import type { ThemeKey } from '@/shared/lib/basic-theme' + +export const createPalette = (mode: ThemeKey) => { + const theme = figmaTokens.themes.desktop[mode] + + const palette: ThemeOptions['palette'] = { + mode: mode === 'dark' ? 'dark' : 'light', + neutral: { + ...extractPairs(theme.color.neutral), + main: theme.color.neutral['500'], + light: theme.color.neutral['300'], + dark: theme.color.neutral['700'], + }, + primary: { + ...extractPairs(theme.color.primary), + main: theme.color.primary['500'], + light: theme.color.primary['300'], + dark: theme.color.primary['700'], + contrastText: theme.text.textcolors.primary, + }, + secondary: { + ...extractPairs(theme.color.secondary), + main: theme.color.secondary['500'], + light: theme.color.secondary['300'], + dark: theme.color.secondary['700'], + contrastText: theme.text.textcolors.secondary, + }, + tertiary: { + ...extractPairs(theme.color.tertiary), + main: theme.color.tertiary['400'], + contrastText: theme.text.textcolors.tertiary, + }, + error: { + main: theme.feedback.alert, + contrastText: theme.text.textcolors.alert, + }, + warning: { + main: theme.feedback.warning, + contrastText: theme.text.textcolors.warning, + }, + info: { + main: theme.color.primary['300'], + contrastText: theme.text.textcolors.primary, + }, + success: { + main: theme.feedback.success, + contrastText: theme.text.textcolors.success, + }, + text: { + primary: theme.text.textcolors.primary, + secondary: theme.text.textcolors.secondary, + disabled: theme.text.textcolors.disabled, + }, + background: { + default: theme.layer['1'].fill, + paper: theme.layer['2'].fill, + // TODO: add layer 3 fill, app background, highlight fill + }, + grey: extractPairs(figmaTokens.primitives.grays), + green: extractPairs(figmaTokens.primitives.greens), + red: extractPairs(figmaTokens.primitives.reds), + blue: extractPairs(figmaTokens.primitives.blues), + violet: extractPairs(figmaTokens.primitives.violet), + } + + return palette +} diff --git a/packages/curve-ui-kit/src/entities/themes/model/spacing.ts b/packages/curve-ui-kit/src/entities/themes/model/spacing.ts new file mode 100644 index 000000000..6bf9a48e2 --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/model/spacing.ts @@ -0,0 +1,32 @@ +import { type ThemeOptions } from '@mui/material/styles' + +import { figmaTokens, extractNumber } from '@/shared/api/figma-tokens' +import { type ThemeKey } from '@/shared/lib/basic-theme' + +export const createSpacing = (mode: ThemeKey) => { + const { xxs, xs, sm, md, lg, xl, xxl } = figmaTokens.mappedSizesAndSpaces.desktop.spacing + const { + xxs: mXxs, + xs: mXs, + sm: mSm, + md: mMd, + lg: mLg, + xl: mXl, + xxl: mXxl, + } = figmaTokens.mappedSizesAndSpaces.mobile.spacing + const theme = figmaTokens.themes.desktop[mode] + + const spaces: ThemeOptions = { + spacing: [0, xxs, xs, sm, md, lg, xl, xxl], + + // TODO: realize mobile spacing + // [basicMuiTheme.breakpoints.down('tablet')]: { + // spacing: [0, mXxs, mXs, mSm, mMd, mLg, mXl, mXxl], + // }, + shape: { + borderRadius: extractNumber(theme.radius.md), + }, + } + + return spaces +} diff --git a/packages/curve-ui-kit/src/entities/themes/model/typography.ts b/packages/curve-ui-kit/src/entities/themes/model/typography.ts new file mode 100644 index 000000000..4caaadef2 --- /dev/null +++ b/packages/curve-ui-kit/src/entities/themes/model/typography.ts @@ -0,0 +1,34 @@ +import { type TypographyOptions } from '@mui/material/styles/createTypography' +import { figmaTokens } from '@/shared/api/figma-tokens' +import { basicMuiTheme, ThemeFontFamily, type ThemeKey } from '@/shared/lib/basic-theme' +import { omitProperty } from '@/shared/lib/object-properties' +import { disabledTypographyKeys } from '@/shared/ui/Typography' + +export const createTypography = (mode: ThemeKey) => { + const typographyVariants = Object.entries(figmaTokens.typography).reduce((acc, [key, value]) => { + acc[key as keyof typeof figmaTokens.typography] = omitProperty(value, 'description') + return acc + }, {} as TypographyOptions) + + const disabledTypographyVariants = disabledTypographyKeys.reduce((acc, variant) => { + acc[variant] = undefined + return acc + }, {} as TypographyOptions) + + const typography: TypographyOptions = { + fontFamily: ThemeFontFamily[mode], + fontWeightBold: 700, + fontWeightMedium: 600, + fontWeightRegular: 500, + fontWeightLight: 400, + fontSize: 16, + [basicMuiTheme.breakpoints.down('tablet')]: { + fontSize: 12, + }, + + ...disabledTypographyVariants, + ...typographyVariants, + } + + return typography +} From 3ce481bc37ce1150e86ce031acb015a2c3d47d96 Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 21 Oct 2024 19:15:03 +0500 Subject: [PATCH 032/137] ci: `vercel` deployment branch filtering --- .gitignore | 3 --- .vercel/dao-branch-filtering.sh | 14 ++++++++++++++ .vercel/storybook-branch-filtering.sh | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 .vercel/dao-branch-filtering.sh create mode 100644 .vercel/storybook-branch-filtering.sh diff --git a/.gitignore b/.gitignore index df0ce53c3..ce1899a3b 100644 --- a/.gitignore +++ b/.gitignore @@ -46,9 +46,6 @@ yarn-error.log* # husky .husky -# vercel -.vercel - # lingui compiled translation files src/locales/_build/ src/locales/**/*.js diff --git a/.vercel/dao-branch-filtering.sh b/.vercel/dao-branch-filtering.sh new file mode 100644 index 000000000..1e412306a --- /dev/null +++ b/.vercel/dao-branch-filtering.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +echo "VERCEL_GIT_COMMIT_REF: $VERCEL_GIT_COMMIT_REF" + +if [[ "$VERCEL_GIT_COMMIT_REF" == "staging" || "$VERCEL_GIT_COMMIT_REF" == "task/init-dao-app" ]] ; then + # Proceed with the build + echo "✅ - Build can proceed" + exit 1; + +else + # Don't build + echo "🛑 - Build cancelled" + exit 0; +fi \ No newline at end of file diff --git a/.vercel/storybook-branch-filtering.sh b/.vercel/storybook-branch-filtering.sh new file mode 100644 index 000000000..988b9e3be --- /dev/null +++ b/.vercel/storybook-branch-filtering.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +echo "VERCEL_GIT_COMMIT_REF: $VERCEL_GIT_COMMIT_REF" + +if [[ "$VERCEL_GIT_COMMIT_REF" == "develop" ]] ; then + # Proceed with the build + echo "✅ - Build can proceed" + exit 1; + +else + # Don't build + echo "🛑 - Build cancelled" + exit 0; +fi \ No newline at end of file From 547055ddaaece7c5fc9d54edabe5c6fd70ee820b Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 21 Oct 2024 20:29:23 +0500 Subject: [PATCH 033/137] chore: add empty `dao` folder --- apps/dao/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/dao/.gitkeep diff --git a/apps/dao/.gitkeep b/apps/dao/.gitkeep new file mode 100644 index 000000000..e69de29bb From 44eb911e3af4f065f94a71ed1134d235977e051e Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 21 Oct 2024 22:00:30 +0500 Subject: [PATCH 034/137] chore: after review changes --- packages/curve-ui-kit/.storybook/main.ts | 4 +-- packages/curve-ui-kit/.storybook/preview.tsx | 13 +++++++-- .../entities/themes/lib/generate-themes.ts | 7 ++--- .../src/entities/themes/model/components.ts | 14 ++++------ .../src/entities/themes/model/pallette.ts | 6 ++--- .../src/entities/themes/model/spacing.ts | 6 ++--- .../src/entities/themes/model/typography.ts | 6 ++--- .../api/figma-tokens/extract-figma-values.ts | 20 +------------- .../api/figma-tokens/resolve/resolver.ts | 22 +++++++++++++++ .../validation/analyze_figma_tokens.py | 27 +++++++++++++++++++ .../src/shared/ui/Button/Button.tsx | 8 +++--- .../src/shared/ui/Button/muiButton.ts | 6 ++--- .../ui/Button/stories/Button.stories.ts | 16 +++++------ .../shared/ui/CssBaseline/muiCssBaseline.ts | 5 ++-- .../src/shared/ui/Typography/Typography.tsx | 8 +----- .../src/shared/ui/Typography/muiTypography.ts | 6 ++--- .../Typography/variants/resolve-typography.ts | 24 +++++++++++++++++ 17 files changed, 118 insertions(+), 80 deletions(-) diff --git a/packages/curve-ui-kit/.storybook/main.ts b/packages/curve-ui-kit/.storybook/main.ts index bff88fe59..82cdc12a0 100644 --- a/packages/curve-ui-kit/.storybook/main.ts +++ b/packages/curve-ui-kit/.storybook/main.ts @@ -6,8 +6,8 @@ import path from 'path' * This function is used to resolve the absolute path of a package. * It is needed in projects that use Yarn PnP or are set up within a monorepo. */ -function getAbsolutePath(value) { - return dirname(require.resolve(join(value, 'package.json'))) +function getAbsolutePath(packageName: string) { + return dirname(require.resolve(join(packageName, 'package.json'))) } const config: StorybookConfig = { diff --git a/packages/curve-ui-kit/.storybook/preview.tsx b/packages/curve-ui-kit/.storybook/preview.tsx index 996d83e91..b4f80970b 100644 --- a/packages/curve-ui-kit/.storybook/preview.tsx +++ b/packages/curve-ui-kit/.storybook/preview.tsx @@ -4,7 +4,6 @@ import type { Decorator, Preview, ReactRenderer } from '@storybook/react' import { chadTheme, darkTheme, lightTheme } from '../src/entities/themes' -console.log('lightTheme', lightTheme) export const decorators: Decorator[] = [ withThemeFromJSXProvider({ themes: { @@ -34,7 +33,17 @@ const preview: Preview = { }, }, docs: { - // TODO: fix docs container theme + // TODO: Fix docs container theme application + // The current issue is that the theme is only applied to individual components + // within the docs, but not to the root level of the documentation container. + // This results in inconsistent styling, where component examples may have the + // correct theme, but the surrounding documentation does not. + // + // Potential solution: + // Implement a custom docs container that applies the theme at the root level. + // This may involve creating a wrapper component that uses the current theme + // from the Storybook context and applies it to the entire docs container. + // // container: ({ children, context }) => { // const theme = context.store.userGlobals.globals.theme // return ( diff --git a/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts b/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts index 9435e1e5e..76fb9e829 100644 --- a/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts +++ b/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts @@ -2,8 +2,8 @@ import { createTheme as createMuiTheme, type Theme } from '@mui/material/styles' import { basicMuiTheme, type ThemeKey } from '@/shared/lib/basic-theme' import { createComponents, createPalette, createSpacing, createTypography } from '../model' -function generateTheme(mode: ThemeKey): Theme { - const muiTheme = createMuiTheme({ +const generateTheme = (mode: ThemeKey): Theme => + createMuiTheme({ ...basicMuiTheme, palette: createPalette(mode), typography: createTypography(mode), @@ -11,9 +11,6 @@ function generateTheme(mode: ThemeKey): Theme { ...createSpacing(mode), }) - return muiTheme -} - export const lightTheme = generateTheme('light') export const darkTheme = generateTheme('dark') export const chadTheme = generateTheme('chad') diff --git a/packages/curve-ui-kit/src/entities/themes/model/components.ts b/packages/curve-ui-kit/src/entities/themes/model/components.ts index 1241cabc4..50758d6cc 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/components.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/components.ts @@ -5,12 +5,8 @@ import { defineMuiButton } from '@/shared/ui/Button' import { defineMuiCssBaseline } from '@/shared/ui/CssBaseline' import { defineMuiTypography } from '@/shared/ui/Typography' -export const createComponents = (mode: ThemeKey) => { - const components: ThemeOptions['components'] = { - MuiTypography: defineMuiTypography(), - MuiCssBaseline: defineMuiCssBaseline(), - MuiButton: defineMuiButton(figmaTokens, mode), - } - - return components -} +export const createComponents = (mode: ThemeKey): ThemeOptions['components'] => ({ + MuiTypography: defineMuiTypography(), + MuiCssBaseline: defineMuiCssBaseline(), + MuiButton: defineMuiButton(figmaTokens, mode), +}) diff --git a/packages/curve-ui-kit/src/entities/themes/model/pallette.ts b/packages/curve-ui-kit/src/entities/themes/model/pallette.ts index e14f793ba..aeef287a1 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/pallette.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/pallette.ts @@ -2,10 +2,10 @@ import type { ThemeOptions } from '@mui/material' import { extractPairs, figmaTokens } from '@/shared/api/figma-tokens' import type { ThemeKey } from '@/shared/lib/basic-theme' -export const createPalette = (mode: ThemeKey) => { +export const createPalette = (mode: ThemeKey): ThemeOptions['palette'] => { const theme = figmaTokens.themes.desktop[mode] - const palette: ThemeOptions['palette'] = { + return { mode: mode === 'dark' ? 'dark' : 'light', neutral: { ...extractPairs(theme.color.neutral), @@ -64,6 +64,4 @@ export const createPalette = (mode: ThemeKey) => { blue: extractPairs(figmaTokens.primitives.blues), violet: extractPairs(figmaTokens.primitives.violet), } - - return palette } diff --git a/packages/curve-ui-kit/src/entities/themes/model/spacing.ts b/packages/curve-ui-kit/src/entities/themes/model/spacing.ts index 6bf9a48e2..1dd1c253c 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/spacing.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/spacing.ts @@ -3,7 +3,7 @@ import { type ThemeOptions } from '@mui/material/styles' import { figmaTokens, extractNumber } from '@/shared/api/figma-tokens' import { type ThemeKey } from '@/shared/lib/basic-theme' -export const createSpacing = (mode: ThemeKey) => { +export const createSpacing = (mode: ThemeKey): ThemeOptions => { const { xxs, xs, sm, md, lg, xl, xxl } = figmaTokens.mappedSizesAndSpaces.desktop.spacing const { xxs: mXxs, @@ -16,7 +16,7 @@ export const createSpacing = (mode: ThemeKey) => { } = figmaTokens.mappedSizesAndSpaces.mobile.spacing const theme = figmaTokens.themes.desktop[mode] - const spaces: ThemeOptions = { + return { spacing: [0, xxs, xs, sm, md, lg, xl, xxl], // TODO: realize mobile spacing @@ -27,6 +27,4 @@ export const createSpacing = (mode: ThemeKey) => { borderRadius: extractNumber(theme.radius.md), }, } - - return spaces } diff --git a/packages/curve-ui-kit/src/entities/themes/model/typography.ts b/packages/curve-ui-kit/src/entities/themes/model/typography.ts index 4caaadef2..f5d237ed9 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/typography.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/typography.ts @@ -4,7 +4,7 @@ import { basicMuiTheme, ThemeFontFamily, type ThemeKey } from '@/shared/lib/basi import { omitProperty } from '@/shared/lib/object-properties' import { disabledTypographyKeys } from '@/shared/ui/Typography' -export const createTypography = (mode: ThemeKey) => { +export const createTypography = (mode: ThemeKey): TypographyOptions => { const typographyVariants = Object.entries(figmaTokens.typography).reduce((acc, [key, value]) => { acc[key as keyof typeof figmaTokens.typography] = omitProperty(value, 'description') return acc @@ -15,7 +15,7 @@ export const createTypography = (mode: ThemeKey) => { return acc }, {} as TypographyOptions) - const typography: TypographyOptions = { + return { fontFamily: ThemeFontFamily[mode], fontWeightBold: 700, fontWeightMedium: 600, @@ -29,6 +29,4 @@ export const createTypography = (mode: ThemeKey) => { ...disabledTypographyVariants, ...typographyVariants, } - - return typography } diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts index a83bda6cc..b539b3446 100644 --- a/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/extract-figma-values.ts @@ -1,18 +1,3 @@ -/** - * Extracts values from a Figma token object, excluding specified keys. - * @param obj - The Figma token object to extract values from. - * @param excludeKeys - An array of keys to exclude from extraction. - * @returns An array of extracted values. - */ -export function extractValues>( - obj: T, - excludeKeys: string[] = [], -): ExtractedValues { - return Object.entries(obj) - .filter(([key]) => !excludeKeys.includes(key)) - .map(([, value]) => value) as ExtractedValues -} - /** * Extracts key-value pairs from a Figma token object, excluding specified keys. * @param obj - The Figma token object to extract key-value pairs from. @@ -26,8 +11,7 @@ export function extractPairs>( return Object.entries(obj).reduce( (acc, [key, value]) => { if (!excludeKeys.includes(key)) { - // @ts-expect-error - acc[key] = value + return { ...acc, [key]: value } } return acc }, @@ -66,8 +50,6 @@ export type FigmaValueObject = { type ExcludeKeys = Exclude -export type ExtractedValues = Array]> - export type ExtractedKeyValuePairs = { [P in ExcludeKeys]: T[P] } diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts index 19b4de3fb..7d63693b0 100644 --- a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolver.ts @@ -1,5 +1,11 @@ import type { CurveFigmaDesignTokens, ScreenType } from '../tokens' +/** + * Resolves nested token values in a Figma design token tree. + * This type recursively unwraps token objects and resolves referenced values. + * + * @template T - The type of the token tree + */ export type ResolvedValue = T extends { type: string; value: infer V } ? V extends string ? V extends `{${string}}` @@ -10,6 +16,13 @@ export type ResolvedValue = T extends { type: string; value: infer V } ? { [K in keyof T]: ResolvedValue } : T +/** + * Resolves a token value given a token path. + * This type navigates through the token tree to find and resolve the referenced value. + * + * @template TokenTree - The type of the entire token tree + * @template TokenPath - A string representing the path to a token value + */ export type ResolvedTokenValue = TokenPath extends `{${infer Path}}` ? Path extends keyof TokenTree ? TokenTree[Path] extends { value: infer V } @@ -22,6 +35,15 @@ export type ResolvedTokenValue = TokenPath : never : never +/** + * Resolves all token references in a Figma design token tree. + * This function traverses the entire token tree, resolving any referenced values + * and handling screen type-specific tokens. + * + * @param tokenTree - The original Figma design token tree + * @param screenType - The target screen type for resolution (default: 'desktop') + * @returns A new token tree with all references resolved + */ export function resolveFigmaTokens( tokenTree: T, screenType: ScreenType = 'desktop', diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py index 803442122..c434384a4 100644 --- a/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/validation/analyze_figma_tokens.py @@ -2,7 +2,21 @@ import re from collections import defaultdict +""" +This script analyzes a Figma design tokens JSON file to identify and categorize token references. +It helps in understanding the structure and dependencies within the design token system. +""" + def analyze_json_file(file_path): + """ + Analyzes a JSON file containing Figma design tokens. + + Args: + file_path (str): Path to the JSON file containing Figma design tokens. + + This function reads the JSON file, traverses its structure, and identifies token references. + It then prints out a categorized list of these references. + """ with open(file_path, 'r') as file: data = json.load(file) @@ -10,6 +24,15 @@ def analyze_json_file(file_path): reference_pattern = re.compile(r'\{([^}]+)\}') def traverse(obj, path): + """ + Recursively traverses the JSON object to find token references. + + Args: + obj: The current object or value being traversed. + path (list): The current path in the JSON structure. + + This function identifies references in string values and adds them to the references dictionary. + """ if isinstance(obj, dict): for key, value in obj.items(): new_path = path + [key] @@ -27,10 +50,14 @@ def traverse(obj, path): traverse(data, []) + # Print the categorized references for category, refs in sorted(references.items()): print(f"\n{category}:") for ref in sorted(refs): print(f" - {ref}") +# File path to the Figma design tokens JSON file file_path = '../curve-figma-design-tokens/curve-figma-design.tokens.json' + +# Run the analysis analyze_json_file(file_path) diff --git a/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx b/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx index 2e3b07939..69c0774cd 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx +++ b/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx @@ -1,9 +1,7 @@ import { Button as MuiButton, ButtonProps as MuiButtonProps } from '@mui/material' -export interface ButtonProps extends MuiButtonProps { - label: string -} +export interface ButtonProps extends MuiButtonProps {} -export const Button = ({ label, ...props }: ButtonProps) => { - return {label} +export const Button = ({ children, ...props }: ButtonProps) => { + return {children} } diff --git a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts index 8e9e95f5c..dc7641ad3 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts @@ -3,7 +3,7 @@ import { type FigmaTokens, extractNumber } from '@/shared/api/figma-tokens' import { basicMuiTheme, type ThemeKey } from '@/shared/lib/basic-theme' import { omitProperty } from '@/shared/lib/object-properties' -export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey) => { +export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey): Components['MuiButton'] => { const buttonDesktop = figmaTokens.themes.desktop[mode].button const buttonMobile = figmaTokens.themes.mobile[mode].button const spacingDesktop = figmaTokens.mappedSizesAndSpaces.desktop.spacing @@ -69,7 +69,7 @@ export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey) => { } } - const muiButton: Components['MuiButton'] = { + return { styleOverrides: { root: { variants: [ @@ -131,6 +131,4 @@ export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey) => { }, }, } - - return muiButton } diff --git a/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts b/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts index 594c768e8..ebf6ed7cc 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts @@ -16,7 +16,7 @@ const meta: Meta = { options: ['primary', 'secondary', 'success', 'alert', 'navigation', undefined], description: 'The color of the component', }, - label: { + children: { control: 'text', description: 'The label of the component', }, @@ -51,14 +51,14 @@ export const Primary: Story = { args: { variant: 'contained', color: 'primary', - label: 'Primary', + children: 'Primary', }, } export const Secondary: Story = { args: { variant: 'contained', color: 'secondary', - label: 'Secondary', + children: 'Secondary', }, } @@ -66,7 +66,7 @@ export const Outlined: Story = { args: { variant: 'outlined', color: undefined, - label: 'Outlined', + children: 'Outlined', }, } @@ -74,7 +74,7 @@ export const Ghost: Story = { args: { variant: 'ghost', color: undefined, - label: 'Ghost', + children: 'Ghost', }, } @@ -82,7 +82,7 @@ export const Success: Story = { args: { variant: 'contained', color: 'success', - label: 'Success', + children: 'Success', }, } @@ -90,7 +90,7 @@ export const Alert: Story = { args: { variant: 'contained', color: 'alert', - label: 'Alert', + children: 'Alert', }, } @@ -98,7 +98,7 @@ export const Navigation: Story = { args: { variant: 'contained', color: 'navigation', - label: 'Navigation', + children: 'Navigation', }, } diff --git a/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts b/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts index 70abe1b3f..dc27aefec 100644 --- a/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts +++ b/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts @@ -1,7 +1,7 @@ import type { Components } from '@mui/material/styles' -export const defineMuiCssBaseline = () => { - const component: Components['MuiCssBaseline'] = { +export const defineMuiCssBaseline = (): Components['MuiCssBaseline'] => { + return { styleOverrides: ` @font-face { font-family: 'Mona Sans'; @@ -21,5 +21,4 @@ export const defineMuiCssBaseline = () => { } `, } - return component } diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx b/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx index 657b42bc8..0b544be53 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx +++ b/packages/curve-ui-kit/src/shared/ui/Typography/Typography.tsx @@ -1,7 +1 @@ -import { Typography as MuiTypography, TypographyProps as MuiTypographyProps } from '@mui/material' - -export interface TypographyProps extends MuiTypographyProps {} - -export const Typography = ({ ...props }: TypographyProps) => { - return -} +export { Typography, type TypographyProps } from '@mui/material' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts index 6d003bce8..4ca1d41d5 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts @@ -1,7 +1,7 @@ import type { Components } from '@mui/material/styles' -export const defineMuiTypography = () => { - const component: Components['MuiTypography'] = { +export const defineMuiTypography = (): Components['MuiTypography'] => { + return { defaultProps: { variant: 'bodyMRegular', variantMapping: { @@ -21,6 +21,4 @@ export const defineMuiTypography = () => { }, }, } - - return component } diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts index 1faa1c809..00e57ee46 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts @@ -3,8 +3,18 @@ import { ThemeFontFamily, type ThemeKey } from '@/shared/lib/basic-theme' import { capitalizeFirstLetter, capitalizeSpecificWords } from '@/shared/lib/capitalize' import type { NonTableTypographyVariantKey, TableTypographyVariantKey, TypographyVariantKey } from './config' +/** + * List of words that should be capitalized in typography variant keys. + */ const wordsToCapitalize = ['bold', 'regular', 'medium', 'light', 'notional', 'label'] +/** + * Transforms a Figma typography token into a React CSS properties object. + * This function maps Figma-specific typography properties to their CSS equivalents. + * + * @param token - The Figma typography token to transform + * @returns A React CSS properties object with an optional description + */ function transformTypographyToken(token: FigmaTypographyToken): React.CSSProperties & { description?: string } { const { fontSize, @@ -37,6 +47,13 @@ function transformTypographyToken(token: FigmaTypographyToken): React.CSSPropert } } +/** + * Resolves typography variants from Figma typography tokens, excluding table-specific styles. + * This function creates a mapping of typography variant keys to their corresponding CSS properties. + * + * @param figmaTypography - The Figma typography object containing all typography styles + * @returns An object mapping non-table typography variant keys to their CSS properties + */ export function resolveTypographyVariants>( figmaTypography: T, ): Record { @@ -58,6 +75,13 @@ export function resolveTypographyVariants } +/** + * Resolves table-specific typography variants from Figma typography tokens. + * This function creates a mapping of table typography variant keys to their corresponding CSS properties. + * + * @param figmaTypography - The Figma typography object containing table-specific styles + * @returns An object mapping table typography variant keys to their CSS properties + */ export function resolveTableTypographyVariants>( figmaTypography: T, ): Record { From 6e1cc76ecfce0d1cc75e5152428f3e646a9df67a Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 21 Oct 2024 22:02:40 +0500 Subject: [PATCH 035/137] ci: deploy storybook from the current branch --- .vercel/storybook-branch-filtering.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vercel/storybook-branch-filtering.sh b/.vercel/storybook-branch-filtering.sh index 988b9e3be..7af20624b 100644 --- a/.vercel/storybook-branch-filtering.sh +++ b/.vercel/storybook-branch-filtering.sh @@ -2,7 +2,7 @@ echo "VERCEL_GIT_COMMIT_REF: $VERCEL_GIT_COMMIT_REF" -if [[ "$VERCEL_GIT_COMMIT_REF" == "develop" ]] ; then +if [[ "$VERCEL_GIT_COMMIT_REF" == "develop" || "$VERCEL_GIT_COMMIT_REF" == "task/new-design-system" ]] ; then # Proceed with the build echo "✅ - Build can proceed" exit 1; From 54d20505af5cd148f675e6ada53994745017478c Mon Sep 17 00:00:00 2001 From: Ignat Date: Mon, 21 Oct 2024 22:20:42 +0500 Subject: [PATCH 036/137] chore: remove `.gitkeep` file --- packages/curve-ui-kit/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/curve-ui-kit/.gitkeep diff --git a/packages/curve-ui-kit/.gitkeep b/packages/curve-ui-kit/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 5b7dd47a910fa9fb3249c8a7cd7821cf4ed477ac Mon Sep 17 00:00:00 2001 From: Ignat Date: Tue, 22 Oct 2024 20:10:51 +0500 Subject: [PATCH 037/137] chore: after review changes --- packages/curve-ui-kit/.storybook/main.ts | 28 ++++- .../src/pages/Introduction/Introduction.mdx | 2 +- .../src/shared/ui/Button/muiButton.ts | 104 ++++++++---------- .../src/shared/ui/Typography/muiTypography.ts | 38 +++---- 4 files changed, 94 insertions(+), 78 deletions(-) diff --git a/packages/curve-ui-kit/.storybook/main.ts b/packages/curve-ui-kit/.storybook/main.ts index 82cdc12a0..07439793d 100644 --- a/packages/curve-ui-kit/.storybook/main.ts +++ b/packages/curve-ui-kit/.storybook/main.ts @@ -33,7 +33,33 @@ const config: StorybookConfig = { docs: {}, typescript: {}, - // TODO: wait for fix https://github.com/storybookjs/storybook/issues/12129 + /** + * TODO: Temporary workaround for Storybook issue #12129 + * + * There's currently a bug in Storybook that affects the TypeScript configuration + * and causes issues with react-docgen-typescript. The configuration below is commented out + * due to these issues. + * + * Instead, we're currently using a solution proposed in a comment on the GitHub issue: + * https://github.com/storybookjs/storybook/issues/12129#issuecomment-1486722918 + * + * This solution involves manually defining `argTypes` in each story file. While this + * requires more work, it allows us to have proper typing and avoid build errors. + * + * Example usage in a story file: + * ``` + * export default { + * component: MyComponent, + * argTypes: { + * prop1: { control: 'text' }, + * prop2: { control: 'boolean' }, + * }, + * } as Meta; + * ``` + * + * Once the Storybook issue is resolved, we can revisit this configuration and potentially + * switch back to using react-docgen-typescript for automatic prop type inference. + */ // typescript: { // reactDocgen: react-docgen-typescript, // reactDocgenTypescriptOptions: { diff --git a/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx b/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx index dd8d2f7bd..41cd364f7 100644 --- a/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx +++ b/packages/curve-ui-kit/src/pages/Introduction/Introduction.mdx @@ -146,7 +146,7 @@ export const DiscordIcon = () => (

Contribute on GitHub

Help us improve the Curve.fi UI Kit by contributing to our repository.

- + Visit Repository diff --git a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts index dc7641ad3..2b4f45396 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts @@ -9,65 +9,57 @@ export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey): Compo const spacingDesktop = figmaTokens.mappedSizesAndSpaces.desktop.spacing const spacingMobile = figmaTokens.mappedSizesAndSpaces.mobile.spacing - const getColorButtonStyle = (color: 'primary' | 'secondary' | 'success' | 'alert'): CSSObject => { - return { - backgroundColor: buttonDesktop[color].default?.fill, - color: buttonDesktop[color].default['label & icon'], - '&:hover': { - backgroundColor: buttonDesktop[color].hover.fill, - color: buttonDesktop[color].hover['label & icon'], - }, - '&:disabled': { - backgroundColor: buttonDesktop[color].disabled.fill, - color: buttonDesktop[color].disabled['label & icon'], - }, - } - } + const getColorButtonStyle = (color: 'primary' | 'secondary' | 'success' | 'alert'): CSSObject => ({ + backgroundColor: buttonDesktop[color].default?.fill, + color: buttonDesktop[color].default['label & icon'], + '&:hover': { + backgroundColor: buttonDesktop[color].hover.fill, + color: buttonDesktop[color].hover['label & icon'], + }, + '&:disabled': { + backgroundColor: buttonDesktop[color].disabled.fill, + color: buttonDesktop[color].disabled['label & icon'], + }, + }) - const getNavigationButtonStyle = (): CSSObject => { - return { - color: buttonDesktop.navigation.default['label & icon'], - '&:hover': { - backgroundColor: buttonDesktop.navigation.hover.fill, - color: buttonDesktop.navigation.hover['label & icon'], - }, - '&:current': { - backgroundColor: buttonDesktop.navigation.current.fill, - color: buttonDesktop.navigation.current['label & icon'], - }, - } - } + const getNavigationButtonStyle = (): CSSObject => ({ + color: buttonDesktop.navigation.default['label & icon'], + '&:hover': { + backgroundColor: buttonDesktop.navigation.hover.fill, + color: buttonDesktop.navigation.hover['label & icon'], + }, + '&:current': { + backgroundColor: buttonDesktop.navigation.current.fill, + color: buttonDesktop.navigation.current['label & icon'], + }, + }) - const getVariantButtonStyle = (variant: 'outlined'): CSSObject => { - return { - backgroundColor: 'transparent', - borderColor: buttonDesktop[variant].default.outline, - color: buttonDesktop[variant].default['label & icon'], - '&:hover': { - borderColor: buttonDesktop[variant].hover.outline, - color: buttonDesktop[variant].hover['label & icon'], - }, - '&:disabled': { - borderColor: buttonDesktop[variant].disabled.outline, - color: buttonDesktop[variant].disabled['label & icon'], - }, - } - } + const getVariantButtonStyle = (variant: 'outlined'): CSSObject => ({ + backgroundColor: 'transparent', + borderColor: buttonDesktop[variant].default.outline, + color: buttonDesktop[variant].default['label & icon'], + '&:hover': { + borderColor: buttonDesktop[variant].hover.outline, + color: buttonDesktop[variant].hover['label & icon'], + }, + '&:disabled': { + borderColor: buttonDesktop[variant].disabled.outline, + color: buttonDesktop[variant].disabled['label & icon'], + }, + }) - const getGhostButtonStyle = (): CSSObject => { - return { - backgroundColor: 'transparent', - color: buttonDesktop.ghost.default['label & icon'], - '&:hover': { - backgroundColor: buttonDesktop.ghost.hover.fill, - color: buttonDesktop.ghost.hover['label & icon'], - }, - '&:disabled': { - backgroundColor: buttonDesktop.ghost.disabled.fill, - color: buttonDesktop.ghost.disabled['label & icon'], - }, - } - } + const getGhostButtonStyle = (): CSSObject => ({ + backgroundColor: 'transparent', + color: buttonDesktop.ghost.default['label & icon'], + '&:hover': { + backgroundColor: buttonDesktop.ghost.hover.fill, + color: buttonDesktop.ghost.hover['label & icon'], + }, + '&:disabled': { + backgroundColor: buttonDesktop.ghost.disabled.fill, + color: buttonDesktop.ghost.disabled['label & icon'], + }, + }) return { styleOverrides: { diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts index 4ca1d41d5..c6d8924c5 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/muiTypography.ts @@ -1,24 +1,22 @@ import type { Components } from '@mui/material/styles' -export const defineMuiTypography = (): Components['MuiTypography'] => { - return { - defaultProps: { - variant: 'bodyMRegular', - variantMapping: { - bodyMBold: 'p', - bodyMRegular: 'p', - bodySBold: 'p', - bodySRegular: 'p', - bodyXsBold: 'p', - bodyXsRegular: 'p', +export const defineMuiTypography = (): Components['MuiTypography'] => ({ + defaultProps: { + variant: 'bodyMRegular', + variantMapping: { + bodyMBold: 'p', + bodyMRegular: 'p', + bodySBold: 'p', + bodySRegular: 'p', + bodyXsBold: 'p', + bodyXsRegular: 'p', - headingXxl: 'h1', - headingMBold: 'h2', - headingMLight: 'h3', - headingSBold: 'h4', - headingXsBold: 'h5', - headingXsMedium: 'h6', - }, + headingXxl: 'h1', + headingMBold: 'h2', + headingMLight: 'h3', + headingSBold: 'h4', + headingXsBold: 'h5', + headingXsMedium: 'h6', }, - } -} + }, +}) From c7e3d84d06814aab1f9b998f30d203d50aa6400f Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 23 Oct 2024 10:15:25 +0200 Subject: [PATCH 038/137] refactor: use query factory --- .../src/entities/chain/api/markets-api.ts | 14 ++---------- apps/lend/src/entities/chain/index.ts | 1 - .../lend/src/entities/chain/lib/data-hooks.ts | 9 ++++---- apps/lend/src/entities/chain/lib/index.ts | 1 - .../src/entities/chain/lib/query-hooks.ts | 5 ++--- .../lend/src/entities/chain/lib/validation.ts | 9 -------- .../src/entities/chain/model/query-keys.ts | 6 ++--- .../src/entities/chain/model/query-options.ts | 22 ++++++++----------- .../src/entities/chain/model/validation.ts | 4 ++-- apps/lend/src/entities/chain/types.ts | 5 ----- apps/lend/src/entities/token/api.ts | 7 ++++++ .../src/entities/token/api/token-rates.ts | 13 ----------- apps/lend/src/entities/token/lib.ts | 15 +++++++++++++ apps/lend/src/entities/token/lib/index.ts | 3 --- .../lend/src/entities/token/lib/query-data.ts | 5 ----- .../src/entities/token/lib/query-hooks.ts | 10 --------- .../lend/src/entities/token/lib/validation.ts | 9 -------- apps/lend/src/entities/token/model/index.ts | 4 +--- .../src/entities/token/model/query-keys.ts | 6 ----- .../src/entities/token/model/query-options.ts | 14 ------------ .../src/entities/token/model/token-query.ts | 13 +++++++++++ .../src/entities/token/model/validation.ts | 6 ++--- apps/lend/src/entities/token/types.ts | 15 ++++--------- apps/lend/src/store/createMarketListSlice.ts | 18 ++------------- 24 files changed, 68 insertions(+), 146 deletions(-) delete mode 100644 apps/lend/src/entities/chain/lib/validation.ts delete mode 100644 apps/lend/src/entities/chain/types.ts create mode 100644 apps/lend/src/entities/token/api.ts delete mode 100644 apps/lend/src/entities/token/api/token-rates.ts create mode 100644 apps/lend/src/entities/token/lib.ts delete mode 100644 apps/lend/src/entities/token/lib/index.ts delete mode 100644 apps/lend/src/entities/token/lib/query-data.ts delete mode 100644 apps/lend/src/entities/token/lib/query-hooks.ts delete mode 100644 apps/lend/src/entities/token/lib/validation.ts delete mode 100644 apps/lend/src/entities/token/model/query-keys.ts delete mode 100644 apps/lend/src/entities/token/model/query-options.ts create mode 100644 apps/lend/src/entities/token/model/token-query.ts diff --git a/apps/lend/src/entities/chain/api/markets-api.ts b/apps/lend/src/entities/chain/api/markets-api.ts index 373098c51..e639b5ebf 100644 --- a/apps/lend/src/entities/chain/api/markets-api.ts +++ b/apps/lend/src/entities/chain/api/markets-api.ts @@ -1,17 +1,7 @@ -import { QueryFunction } from '@tanstack/react-query' -import { logQuery } from '@/shared/lib/logging' -import { assertChainValidity } from '../lib/validation' +import { ChainQuery } from '@/shared/model/query' import useStore from '@/store/useStore' -import { ChainQueryKeyType } from '../model' - -export const queryOneWayMarketNames: QueryFunction< - string[], - ChainQueryKeyType<'markets'> -> = async ({ queryKey }) => { - logQuery(queryKey) - const [, chainId, , ] = queryKey - assertChainValidity({ chainId }) +export const queryOneWayMarketNames = async ({}: ChainQuery): Promise => { const {api} = useStore.getState() return api!.oneWayfactory.getMarketList() } diff --git a/apps/lend/src/entities/chain/index.ts b/apps/lend/src/entities/chain/index.ts index 64aadcacc..99b409687 100644 --- a/apps/lend/src/entities/chain/index.ts +++ b/apps/lend/src/entities/chain/index.ts @@ -1,2 +1 @@ export * from './lib' -export * from './types' diff --git a/apps/lend/src/entities/chain/lib/data-hooks.ts b/apps/lend/src/entities/chain/lib/data-hooks.ts index 0dc118f6d..ca22b2ecc 100644 --- a/apps/lend/src/entities/chain/lib/data-hooks.ts +++ b/apps/lend/src/entities/chain/lib/data-hooks.ts @@ -1,12 +1,13 @@ -import { useOneWayMarketNames } from './query-hooks' -import networks from '@/networks' import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' import { useMemo } from 'react' +import { chainValidationSuite } from '@/entities/chain/model' +import { checkValidity } from '@/shared/lib/validation' import { useApi } from './chain-info' -import { checkChainValidity } from '@/entities/chain' +import { useOneWayMarketNames } from './query-hooks' +import networks from '@/networks' export const useOneWayMarketMapping = (chainId: ChainId) => { - const chainValid = checkChainValidity({ chainId }) // extra check to make sure the API is loaded before we use stale market names + const chainValid = checkValidity(chainValidationSuite, { chainId }); // extra check to make sure the API is loaded before we use stale market names const { data: marketNames, ...rest } = useOneWayMarketNames({ chainId }) const { data: api } = useApi(); diff --git a/apps/lend/src/entities/chain/lib/index.ts b/apps/lend/src/entities/chain/lib/index.ts index 4c40b74b2..4a7afc06d 100644 --- a/apps/lend/src/entities/chain/lib/index.ts +++ b/apps/lend/src/entities/chain/lib/index.ts @@ -1,4 +1,3 @@ -export * from './validation' export * from './data-hooks' export * from './query-hooks' export * from './chain-info' diff --git a/apps/lend/src/entities/chain/lib/query-hooks.ts b/apps/lend/src/entities/chain/lib/query-hooks.ts index fdd746611..4bc1acb33 100644 --- a/apps/lend/src/entities/chain/lib/query-hooks.ts +++ b/apps/lend/src/entities/chain/lib/query-hooks.ts @@ -1,4 +1,3 @@ -import { createQueryHook } from '@/shared/lib/queries' -import { getOneWayMarketNames } from '../model/query-options' +import { oneWayMarketNames } from '../model' -export const useOneWayMarketNames = createQueryHook(getOneWayMarketNames); +export const { useQuery: useOneWayMarketNames } = oneWayMarketNames; diff --git a/apps/lend/src/entities/chain/lib/validation.ts b/apps/lend/src/entities/chain/lib/validation.ts deleted file mode 100644 index b6611094e..000000000 --- a/apps/lend/src/entities/chain/lib/validation.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CombinedChainParams } from '../types' -import { chainValidationSuite } from '../model/validation' -import { assertValidity, checkValidity } from '@/shared/lib/validation' - -export const assertChainValidity = (data: T, fields?: Extract[]) => - assertValidity(chainValidationSuite, data, fields) - -export const checkChainValidity = (data: T, fields?: Extract[]) => - checkValidity(chainValidationSuite, data, fields) diff --git a/apps/lend/src/entities/chain/model/query-keys.ts b/apps/lend/src/entities/chain/model/query-keys.ts index f1a1a5651..e189f4f41 100644 --- a/apps/lend/src/entities/chain/model/query-keys.ts +++ b/apps/lend/src/entities/chain/model/query-keys.ts @@ -1,9 +1,9 @@ -import type { ChainQueryParams } from '../types' import type { ExtractQueryKeyType } from '@/shared/types/api' +import { ChainParams } from '@/shared/model/query' export const chainKeys = { - root: ({ chainId }: ChainQueryParams) => ['chain', chainId] as const, - markets: ({ chainId }: ChainQueryParams) => ['chain', chainId, 'markets'] as const, + root: ({ chainId }: ChainParams) => ['chain', chainId] as const, + } as const export type ChainQueryKeyType = ExtractQueryKeyType diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts index 52a8cc7b1..43025c097 100644 --- a/apps/lend/src/entities/chain/model/query-options.ts +++ b/apps/lend/src/entities/chain/model/query-options.ts @@ -1,14 +1,10 @@ -import { queryOptions } from '@tanstack/react-query' -import { REFRESH_INTERVAL } from '@/constants' -import { checkChainValidity } from '../lib/validation' -import { queryOneWayMarketNames } from '../api/markets-api' -import { chainKeys } from './query-keys' -import { ChainQueryParams } from '../types' +import { queryOneWayMarketNames } from '@/entities/chain/api/markets-api' +import { chainValidationSuite } from '@/entities/chain/model/validation' +import { ChainParams, queryFactory } from '@/shared/model/query' -export const getOneWayMarketNames = (params: ChainQueryParams, condition = true) => - queryOptions({ - queryKey: chainKeys.markets(params), - queryFn: queryOneWayMarketNames, - staleTime: REFRESH_INTERVAL['5m'], - enabled: condition && checkChainValidity(params), - }) +export const oneWayMarketNames = queryFactory({ + queryKey: ({ chainId }: ChainParams) => ['chain', { chainId }, 'markets'] as const, + queryFn: queryOneWayMarketNames, + staleTime: '5m', + validationSuite: chainValidationSuite +}) diff --git a/apps/lend/src/entities/chain/model/validation.ts b/apps/lend/src/entities/chain/model/validation.ts index 904f61914..2e0377faf 100644 --- a/apps/lend/src/entities/chain/model/validation.ts +++ b/apps/lend/src/entities/chain/model/validation.ts @@ -1,9 +1,9 @@ -import type { ChainQueryParams } from '../types' import { createValidationSuite } from '@/shared/lib/validation' import { enforce, group, test } from 'vest' import useStore from '@/store/useStore' +import { ChainParams } from '@/shared/model/query' -export const chainValidationGroup = ({ chainId }: ChainQueryParams) => +export const chainValidationGroup = ({ chainId }: ChainParams) => group('chainValidation', () => { test('chainId', () => { enforce(chainId).message('Chain ID is required').isNotEmpty().message('Invalid chain ID').isValidChainId() diff --git a/apps/lend/src/entities/chain/types.ts b/apps/lend/src/entities/chain/types.ts deleted file mode 100644 index 3ccc7c995..000000000 --- a/apps/lend/src/entities/chain/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type ChainQueryParams = { - chainId?: ChainId -} - -export type CombinedChainParams = ChainQueryParams diff --git a/apps/lend/src/entities/token/api.ts b/apps/lend/src/entities/token/api.ts new file mode 100644 index 000000000..4a957be98 --- /dev/null +++ b/apps/lend/src/entities/token/api.ts @@ -0,0 +1,7 @@ +import { TokenQuery } from '@/entities/token/index' +import useStore from '@/store/useStore' + +export const queryTokenUsdRate = async ({ tokenAddress}: TokenQuery): Promise => { + const { api } = useStore.getState() + return await api!.getUsdRate(tokenAddress) +} diff --git a/apps/lend/src/entities/token/api/token-rates.ts b/apps/lend/src/entities/token/api/token-rates.ts deleted file mode 100644 index 4e9a5412b..000000000 --- a/apps/lend/src/entities/token/api/token-rates.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { QueryFunction } from '@tanstack/react-query' -import { logQuery } from '@/shared/lib/logging' -import { assertTokenValidity } from '@/entities/token/lib/validation' -import useStore from '@/store/useStore' -import { TokenQueryKeyType } from '@/entities/token' - -export const queryTokenUsdRate: QueryFunction> = async ({ queryKey }) => { - logQuery(queryKey) - const [, chainId, , tokenAddress] = queryKey - const _valid = assertTokenValidity({ chainId, tokenAddress }) - const { api } = useStore.getState() - return await api!.getUsdRate(_valid.tokenAddress) -} diff --git a/apps/lend/src/entities/token/lib.ts b/apps/lend/src/entities/token/lib.ts new file mode 100644 index 000000000..4241588dd --- /dev/null +++ b/apps/lend/src/entities/token/lib.ts @@ -0,0 +1,15 @@ +import { tokenUsdRate } from '@/entities/token/model' +import { useQueryMapping } from '@/shared/lib/queries' +import { ChainParams } from '@/shared/model/query' + +export const { + getQueryData: getTokenUsdRateQueryData, + useQuery: useTokenUsdRate, + getQueryOptions: getTokenUsdRateQueryOptions +} = tokenUsdRate + +export const useTokenUsdRates = ({ chainId, tokenAddresses = [] }: ChainParams & { tokenAddresses?: string[] }) => + useQueryMapping( + tokenAddresses.map((tokenAddress) => getTokenUsdRateQueryOptions({ chainId, tokenAddress })), + tokenAddresses + ) diff --git a/apps/lend/src/entities/token/lib/index.ts b/apps/lend/src/entities/token/lib/index.ts deleted file mode 100644 index ebeda0f45..000000000 --- a/apps/lend/src/entities/token/lib/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './query-hooks' -export * from './query-data' -export * from './validation' diff --git a/apps/lend/src/entities/token/lib/query-data.ts b/apps/lend/src/entities/token/lib/query-data.ts deleted file mode 100644 index 09b21f8a0..000000000 --- a/apps/lend/src/entities/token/lib/query-data.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { tokenKeys } from '../model' -import { createGetQueryData } from '@/shared/lib/queries' - - -export const getTokenQueryData = createGetQueryData(tokenKeys) diff --git a/apps/lend/src/entities/token/lib/query-hooks.ts b/apps/lend/src/entities/token/lib/query-hooks.ts deleted file mode 100644 index 12be8badc..000000000 --- a/apps/lend/src/entities/token/lib/query-hooks.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createQueryHook, useQueryMapping } from '@/shared/lib/queries' -import { getTokenUsdRateQueryOptions } from '@/entities/token/model' -import { ChainQueryParams } from '@/entities/chain' - -export const useTokenUsdRate = createQueryHook(getTokenUsdRateQueryOptions) -export const useTokenUsdRates = ({ chainId, tokenAddresses = [] }: ChainQueryParams & { tokenAddresses?: string[] }) => - useQueryMapping( - tokenAddresses.map((tokenAddress) => getTokenUsdRateQueryOptions({ chainId, tokenAddress })), - tokenAddresses, - ) diff --git a/apps/lend/src/entities/token/lib/validation.ts b/apps/lend/src/entities/token/lib/validation.ts deleted file mode 100644 index 5d2101589..000000000 --- a/apps/lend/src/entities/token/lib/validation.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CombinedTokenParams } from '@/entities/token' -import { assertValidity, checkValidity, ValidatedData } from '@/shared/lib/validation' -import { tokenValidationSuite } from '@/entities/token/model/validation' - -export const assertTokenValidity = (data: T, fields?: Extract[]) => - assertValidity(tokenValidationSuite, data, fields) - -export const checkTokenValidity = (data: T, fields?: Extract[]) => - checkValidity(tokenValidationSuite, data, fields) diff --git a/apps/lend/src/entities/token/model/index.ts b/apps/lend/src/entities/token/model/index.ts index 6668b7943..8fa1c6e1e 100644 --- a/apps/lend/src/entities/token/model/index.ts +++ b/apps/lend/src/entities/token/model/index.ts @@ -1,3 +1 @@ -export * from './query-keys' -export * from './query-options' -export * from './validation' +export { tokenUsdRate } from './token-query' diff --git a/apps/lend/src/entities/token/model/query-keys.ts b/apps/lend/src/entities/token/model/query-keys.ts deleted file mode 100644 index 1d96a3522..000000000 --- a/apps/lend/src/entities/token/model/query-keys.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { TokenQueryParams } from '@/entities/token' - -export const tokenKeys = { - root: ({ chainId, tokenAddress }: TokenQueryParams) => ['chain', chainId, 'token', tokenAddress] as const, - usdRate: (params: TokenQueryParams) => [...tokenKeys.root(params), 'usdRate'] as const, -} as const diff --git a/apps/lend/src/entities/token/model/query-options.ts b/apps/lend/src/entities/token/model/query-options.ts deleted file mode 100644 index f01ea4f23..000000000 --- a/apps/lend/src/entities/token/model/query-options.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { queryOptions } from '@tanstack/react-query' -import { TokenQueryParams } from '@/entities/token' -import { queryTokenUsdRate } from '@/entities/token/api/token-rates' -import { REFRESH_INTERVAL } from '@/constants' -import { checkTokenValidity } from '@/entities/token/lib/validation' -import { tokenKeys } from '@/entities/token/model' - -export const getTokenUsdRateQueryOptions = (params: TokenQueryParams) => - queryOptions({ - queryKey: tokenKeys.usdRate(params), - queryFn: queryTokenUsdRate, - staleTime: REFRESH_INTERVAL['5m'], - enabled: checkTokenValidity(params), - }) diff --git a/apps/lend/src/entities/token/model/token-query.ts b/apps/lend/src/entities/token/model/token-query.ts new file mode 100644 index 000000000..3f99d46c0 --- /dev/null +++ b/apps/lend/src/entities/token/model/token-query.ts @@ -0,0 +1,13 @@ +import { TokenParams } from '@/entities/token' +import { queryTokenUsdRate } from '@/entities/token/api' +import { tokenValidationSuite } from '@/entities/token/model' +import { queryFactory, rootKeys } from '@/shared/model/query' + +const root = ({ chainId, tokenAddress }: TokenParams) => [...rootKeys.chain({chainId}), 'token', { tokenAddress }] as const + +export const tokenUsdRate = queryFactory({ + queryKey: (params: TokenParams) => [...root(params), 'usdRate'] as const, + queryFn: queryTokenUsdRate, + staleTime: '5m', + validationSuite: tokenValidationSuite, +}) diff --git a/apps/lend/src/entities/token/model/validation.ts b/apps/lend/src/entities/token/model/validation.ts index e8e3897bc..bc1ec9826 100644 --- a/apps/lend/src/entities/token/model/validation.ts +++ b/apps/lend/src/entities/token/model/validation.ts @@ -1,9 +1,9 @@ -import type { TokenQueryParams } from '@/entities/token/types' -import { createValidationSuite } from '@/shared/lib/validation' import { enforce, group, test } from 'vest' import { chainValidationGroup } from '@/entities/chain/model' +import type { TokenParams } from '@/entities/token/types' +import { createValidationSuite } from '@/shared/lib/validation' -export const tokenValidationGroup = ({ chainId, tokenAddress }: TokenQueryParams) => +export const tokenValidationGroup = ({ chainId, tokenAddress }: TokenParams) => group('tokenValidation', () => { chainValidationGroup({ chainId }) test('tokenAddress', () => { diff --git a/apps/lend/src/entities/token/types.ts b/apps/lend/src/entities/token/types.ts index 1d53fdddb..84c84e960 100644 --- a/apps/lend/src/entities/token/types.ts +++ b/apps/lend/src/entities/token/types.ts @@ -1,12 +1,5 @@ -import { ChainQueryParams } from '@/entities/chain/types' -import type { ExtractQueryKeyType } from '@/shared/types/api' -import { tokenKeys } from '@/entities/token/model' +import { FieldsOf } from '@/shared/lib/validation' +import { ChainQuery } from '@/shared/model/query' -export type TokenQueryParams = ChainQueryParams & { - tokenAddress?: string -} - -export type CombinedTokenParams = TokenQueryParams - -export type TokenKey = keyof typeof tokenKeys -export type TokenQueryKeyType = ExtractQueryKeyType +export type TokenQuery = ChainQuery & { tokenAddress: string }; +export type TokenParams = FieldsOf; diff --git a/apps/lend/src/store/createMarketListSlice.ts b/apps/lend/src/store/createMarketListSlice.ts index a5071f12f..629e2e537 100644 --- a/apps/lend/src/store/createMarketListSlice.ts +++ b/apps/lend/src/store/createMarketListSlice.ts @@ -4,7 +4,6 @@ import type { FilterTypeKey, FormStatus, MarketListItemResult, - MarketListMapper, SearchParams, TableSettings } from '@/components/PageMarketList/types' @@ -19,7 +18,7 @@ import { getTotalApr } from '@/utils/utilsRewards' import { helpers } from '@/lib/apiLending' import { sleep } from '@/utils/helpers' import networks from '@/networks' -import { getTokenQueryData } from '@/entities/token' +import { getTokenUsdRateQueryData } from '@/entities/token' import { IDict } from '@curvefi/lending-api/lib/interfaces' import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' @@ -90,7 +89,7 @@ const createMarketListSlice = (set: SetState, get: GetState): Mark const { smallMarketAmount, marketListShowOnlyInSmallMarkets } = networks[chainId] return markets.filter((market) => { const { cap } = capAndAvailableMapper[market.id] ?? {} - const usdRate = getTokenQueryData('usdRate', { chainId, tokenAddress: market.borrowed_token.address }) + const usdRate = getTokenUsdRateQueryData({ chainId, tokenAddress: market.borrowed_token.address }) if (typeof usdRate === 'undefined') return true if (marketListShowOnlyInSmallMarkets[market.id]) return false return +cap * usdRate > smallMarketAmount @@ -420,19 +419,6 @@ export function _getActiveKey(chainId: ChainId, searchParams: SearchParams) { return `${chainId}-${filterTypeKey}-${filterKey}-${parsedSearchText}${sortByStr}` } -function _getOwmDatasFromMarketList(marketListMapper: MarketListMapper, marketMapping: IDict) { - let result: { [owmId: string]: OneWayMarketTemplate } = {} - - // get all owmIds - Object.keys(marketListMapper).forEach((tokenAddress) => { - const { markets } = marketListMapper[tokenAddress] - Object.keys(markets).forEach((owmId) => { - result[owmId] = marketMapping[owmId] - }) - }) - return Object.values(result) ?? [] -} - function sortByRewards(market: OneWayMarketTemplate, rewardsMapper: MarketsRewardsMapper, ratesMapper: MarketsRatesMapper) { const rewards = rewardsMapper[market.id]?.rewards const rates = ratesMapper[market.id]?.rates From 03da037258395679950d6914b3fb0999740c049a Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 23 Oct 2024 13:19:53 +0200 Subject: [PATCH 039/137] fix: hotfix validation Better fix will be in a separate PR (commit 1dd4f4fb0) --- apps/lend/src/entities/token/api/token-rates.ts | 6 +++--- apps/lend/src/entities/token/lib/validation.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/lend/src/entities/token/api/token-rates.ts b/apps/lend/src/entities/token/api/token-rates.ts index 4e9a5412b..9503ab6fb 100644 --- a/apps/lend/src/entities/token/api/token-rates.ts +++ b/apps/lend/src/entities/token/api/token-rates.ts @@ -1,13 +1,13 @@ import { QueryFunction } from '@tanstack/react-query' -import { logQuery } from '@/shared/lib/logging' +import { TokenQueryKeyType } from '@/entities/token' import { assertTokenValidity } from '@/entities/token/lib/validation' +import { logQuery } from '@/shared/lib/logging' import useStore from '@/store/useStore' -import { TokenQueryKeyType } from '@/entities/token' export const queryTokenUsdRate: QueryFunction> = async ({ queryKey }) => { logQuery(queryKey) const [, chainId, , tokenAddress] = queryKey const _valid = assertTokenValidity({ chainId, tokenAddress }) const { api } = useStore.getState() - return await api!.getUsdRate(_valid.tokenAddress) + return await api!.getUsdRate(_valid.tokenAddress as string) } diff --git a/apps/lend/src/entities/token/lib/validation.ts b/apps/lend/src/entities/token/lib/validation.ts index 5d2101589..f8d1b7475 100644 --- a/apps/lend/src/entities/token/lib/validation.ts +++ b/apps/lend/src/entities/token/lib/validation.ts @@ -1,6 +1,6 @@ import { CombinedTokenParams } from '@/entities/token' -import { assertValidity, checkValidity, ValidatedData } from '@/shared/lib/validation' import { tokenValidationSuite } from '@/entities/token/model/validation' +import { assertValidity, checkValidity } from '@/shared/lib/validation' export const assertTokenValidity = (data: T, fields?: Extract[]) => assertValidity(tokenValidationSuite, data, fields) From 4de9bb29528efe73259a8445cd79460d27847c3b Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 23 Oct 2024 14:12:15 +0200 Subject: [PATCH 040/137] fix: review comments --- apps/lend/src/components/ChartOhlcWrapper/index.tsx | 2 +- apps/lend/src/components/DetailInfoCrvIncentives.tsx | 2 +- apps/lend/src/components/DetailInfoHealth.tsx | 2 +- .../components/DetailsMarket/components/MarketParameters.tsx | 2 +- apps/lend/src/components/PageLoanCreate/Page.tsx | 2 +- apps/lend/src/components/PageLoanManage/Page.tsx | 2 +- .../components/TableRowViewContentTable/TableRowContainer.tsx | 2 +- apps/lend/src/components/PageVault/Page.tsx | 2 +- .../src/components/SharedCellData/CellTotalCollateralValue.tsx | 2 +- .../src/entities/chain/api/{markets-api.ts => markets-query.ts} | 0 apps/lend/src/entities/chain/model/query-options.ts | 2 +- apps/lend/src/hooks/useSupplyTotalApr.ts | 2 +- apps/lend/src/hooks/useVaultShares.ts | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename apps/lend/src/entities/chain/api/{markets-api.ts => markets-query.ts} (100%) diff --git a/apps/lend/src/components/ChartOhlcWrapper/index.tsx b/apps/lend/src/components/ChartOhlcWrapper/index.tsx index 61a337305..4e04f37ff 100644 --- a/apps/lend/src/components/ChartOhlcWrapper/index.tsx +++ b/apps/lend/src/components/ChartOhlcWrapper/index.tsx @@ -18,7 +18,7 @@ import AlertBox from '@/ui/AlertBox' import { useOneWayMarket } from '@/entities/chain' const ChartOhlcWrapper: React.FC = ({ rChainId, userActiveKey, rOwmId }) => { - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const isAdvanceMode = useStore((state) => state.isAdvanceMode) const themeType = useStore((state) => state.themeType) const borrowMoreActiveKey = useStore((state) => state.loanBorrowMore.activeKey) diff --git a/apps/lend/src/components/DetailInfoCrvIncentives.tsx b/apps/lend/src/components/DetailInfoCrvIncentives.tsx index 7ee72a653..2d32b93f6 100644 --- a/apps/lend/src/components/DetailInfoCrvIncentives.tsx +++ b/apps/lend/src/components/DetailInfoCrvIncentives.tsx @@ -32,7 +32,7 @@ const DetailInfoCrvIncentives = ({ lpTokenAmount: string }) => { const { tooltipValues } = useSupplyTotalApr(rChainId, rOwmId) - const gaugeAddress = useOneWayMarket(rChainId, rOwmId)?.data?.addresses?.gauge + const gaugeAddress = useOneWayMarket(rChainId, rOwmId).data?.addresses?.gauge const gaugeTotalSupply = useAbiTotalSupply(rChainId, gaugeAddress) const isGaugeAddressInvalid = gaugeAddress === INVALID_ADDRESS diff --git a/apps/lend/src/components/DetailInfoHealth.tsx b/apps/lend/src/components/DetailInfoHealth.tsx index ce3904228..e93baa74a 100644 --- a/apps/lend/src/components/DetailInfoHealth.tsx +++ b/apps/lend/src/components/DetailInfoHealth.tsx @@ -44,7 +44,7 @@ const DetailInfoHealth = ({ loading: boolean setHealthMode: React.Dispatch> }) => { - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const oraclePriceBand = useStore((state) => state.markets.pricesMapper[rChainId]?.[rOwmId]?.prices?.oraclePriceBand) const userLoanDetails = useStore((state) => state.user.loansDetailsMapper[userActiveKey]?.details) diff --git a/apps/lend/src/components/DetailsMarket/components/MarketParameters.tsx b/apps/lend/src/components/DetailsMarket/components/MarketParameters.tsx index d83f94ee4..69816c307 100644 --- a/apps/lend/src/components/DetailsMarket/components/MarketParameters.tsx +++ b/apps/lend/src/components/DetailsMarket/components/MarketParameters.tsx @@ -20,7 +20,7 @@ const MarketParameters = ({ rOwmId: string type: 'borrow' | 'supply' }) => { - const owm = useOneWayMarket(rChainId, rOwmId)?.data + const owm = useOneWayMarket(rChainId, rOwmId).data const isAdvanceMode = useStore((state) => state.isAdvanceMode) const loanPricesResp = useStore((state) => state.markets.pricesMapper[rChainId]?.[rOwmId]) const parametersResp = useStore((state) => state.markets.statsParametersMapper[rChainId]?.[rOwmId]) diff --git a/apps/lend/src/components/PageLoanCreate/Page.tsx b/apps/lend/src/components/PageLoanCreate/Page.tsx index 330f914da..54d81a58f 100644 --- a/apps/lend/src/components/PageLoanCreate/Page.tsx +++ b/apps/lend/src/components/PageLoanCreate/Page.tsx @@ -45,7 +45,7 @@ const Page: NextPage = () => { const titleMapper = useTitleMapper() const { rChainId, rOwmId, rFormType, rSubdirectory } = routerParams - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const isAdvanceMode = useStore((state) => state.isAdvanceMode) const isLoadingApi = useStore((state) => state.isLoadingApi) const isPageVisible = useStore((state) => state.isPageVisible) diff --git a/apps/lend/src/components/PageLoanManage/Page.tsx b/apps/lend/src/components/PageLoanManage/Page.tsx index 399a6bd42..729cf5bab 100644 --- a/apps/lend/src/components/PageLoanManage/Page.tsx +++ b/apps/lend/src/components/PageLoanManage/Page.tsx @@ -49,7 +49,7 @@ const Page: NextPage = () => { const titleMapper = useTitleMapper() const { rChainId, rOwmId, rFormType, rSubdirectory } = routerParams - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const userActiveKey = helpers.getUserActiveKey(api, market!) const isAdvanceMode = useStore((state) => state.isAdvanceMode) diff --git a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx index badf57e23..505b05961 100644 --- a/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx +++ b/apps/lend/src/components/PageMarketList/components/TableRowViewContentTable/TableRowContainer.tsx @@ -24,7 +24,7 @@ const TableRowContainer = ( const marketsBalancesMapper = useStore((state) => state.user.marketsBalancesMapper) const setMarketsStateByKey = useStore((state) => state.markets.setStateByKey) - const market = useOneWayMarket(rChainId, owmId)?.data! + const market = useOneWayMarket(rChainId, owmId).data! const userActiveKey = helpers.getUserActiveKey(api, market) const loanExists = loansExistsMapper[userActiveKey]?.loanExists ?? false diff --git a/apps/lend/src/components/PageVault/Page.tsx b/apps/lend/src/components/PageVault/Page.tsx index 3906a29b7..19dcee391 100644 --- a/apps/lend/src/components/PageVault/Page.tsx +++ b/apps/lend/src/components/PageVault/Page.tsx @@ -41,7 +41,7 @@ const Page: NextPage = () => { const titleMapper = useTitleMapper() const { rChainId, rOwmId, rSubdirectory, rFormType } = routerParams - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const isAdvanceMode = useStore((state) => state.isAdvanceMode) const isLoadingApi = useStore((state) => state.isLoadingApi) const isPageVisible = useStore((state) => state.isPageVisible) diff --git a/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx b/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx index c5f54f8cc..a6327430f 100644 --- a/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx +++ b/apps/lend/src/components/SharedCellData/CellTotalCollateralValue.tsx @@ -8,7 +8,7 @@ import TextCaption from '@/ui/TextCaption' import { useOneWayMarket } from '@/entities/chain' const CellTotalCollateralValue = ({ rChainId, rOwmId }: { rChainId: ChainId; rOwmId: string }) => { - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const isAdvanceMode = useStore((state) => state.isAdvanceMode) const totalCollateralValue = useStore((state) => state.markets.totalCollateralValuesMapper[rChainId]?.[rOwmId]) const fetchTotalCollateralValue = useStore((state) => state.markets.fetchTotalCollateralValue) diff --git a/apps/lend/src/entities/chain/api/markets-api.ts b/apps/lend/src/entities/chain/api/markets-query.ts similarity index 100% rename from apps/lend/src/entities/chain/api/markets-api.ts rename to apps/lend/src/entities/chain/api/markets-query.ts diff --git a/apps/lend/src/entities/chain/model/query-options.ts b/apps/lend/src/entities/chain/model/query-options.ts index 43025c097..f988ee904 100644 --- a/apps/lend/src/entities/chain/model/query-options.ts +++ b/apps/lend/src/entities/chain/model/query-options.ts @@ -1,4 +1,4 @@ -import { queryOneWayMarketNames } from '@/entities/chain/api/markets-api' +import { queryOneWayMarketNames } from '@/entities/chain/api/markets-query' import { chainValidationSuite } from '@/entities/chain/model/validation' import { ChainParams, queryFactory } from '@/shared/model/query' diff --git a/apps/lend/src/hooks/useSupplyTotalApr.ts b/apps/lend/src/hooks/useSupplyTotalApr.ts index 295fe393e..248a0ba53 100644 --- a/apps/lend/src/hooks/useSupplyTotalApr.ts +++ b/apps/lend/src/hooks/useSupplyTotalApr.ts @@ -7,7 +7,7 @@ import { getTotalApr } from '@/utils/utilsRewards' import { useOneWayMarket } from '@/entities/chain' function useSupplyTotalApr(rChainId: ChainId, rOwmId: string) { - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const marketRewardsResp = useStore((state) => state.markets.rewardsMapper[rChainId]?.[rOwmId]) const marketRatesResp = useStore((state) => state.markets.ratesMapper[rChainId]?.[rOwmId]) diff --git a/apps/lend/src/hooks/useVaultShares.ts b/apps/lend/src/hooks/useVaultShares.ts index c65c28ab5..639c27adc 100644 --- a/apps/lend/src/hooks/useVaultShares.ts +++ b/apps/lend/src/hooks/useVaultShares.ts @@ -6,7 +6,7 @@ import { useTokenUsdRate } from '@/entities/token' import { useOneWayMarket } from '@/entities/chain' function useVaultShares(rChainId: ChainId, rOwmId: string, vaultShares: string | number | undefined = '0') { - const market = useOneWayMarket(rChainId, rOwmId)?.data + const market = useOneWayMarket(rChainId, rOwmId).data const pricePerShareResp = useStore((state) => state.markets.vaultPricePerShare[rChainId]?.[rOwmId]) const { address = '', symbol = '' } = market?.borrowed_token ?? {} const { data: usdRate } = useTokenUsdRate({ chainId: rChainId, tokenAddress: address }) From dd97eae055e73542580946dfa9ac0989a6731597 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 23 Oct 2024 15:16:12 +0200 Subject: [PATCH 041/137] refactor: get rid of API hook --- apps/lend/src/entities/chain/lib/chain-info.ts | 10 +++------- apps/lend/src/entities/chain/lib/data-hooks.ts | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/lend/src/entities/chain/lib/chain-info.ts b/apps/lend/src/entities/chain/lib/chain-info.ts index 964adce8d..f24a13fc8 100644 --- a/apps/lend/src/entities/chain/lib/chain-info.ts +++ b/apps/lend/src/entities/chain/lib/chain-info.ts @@ -1,13 +1,9 @@ -import useStore from '@/store/useStore' import { useMemo } from 'react' import { FETCHING, PartialQueryResult, READY } from '@/shared/lib/queries' - -export const useApi = (): PartialQueryResult => { - const api = useStore((state) => state.api) - return useMemo(() => (api ? { ...READY, data: api } : FETCHING), [api]) -} +import useStore from '@/store/useStore' export const useChainId = (): PartialQueryResult => { - const apiResult = useApi(); + const api = useStore((state) => state.api) + const apiResult = useMemo(() => (api ? { ...READY, data: api } : FETCHING), [api]) return useMemo(() => ({...apiResult, data: apiResult?.data?.chainId}), [apiResult]) } diff --git a/apps/lend/src/entities/chain/lib/data-hooks.ts b/apps/lend/src/entities/chain/lib/data-hooks.ts index ca22b2ecc..90a339151 100644 --- a/apps/lend/src/entities/chain/lib/data-hooks.ts +++ b/apps/lend/src/entities/chain/lib/data-hooks.ts @@ -2,15 +2,15 @@ import { OneWayMarketTemplate } from '@curvefi/lending-api/lib/markets' import { useMemo } from 'react' import { chainValidationSuite } from '@/entities/chain/model' import { checkValidity } from '@/shared/lib/validation' -import { useApi } from './chain-info' import { useOneWayMarketNames } from './query-hooks' import networks from '@/networks' +import useStore from '@/store/useStore' export const useOneWayMarketMapping = (chainId: ChainId) => { const chainValid = checkValidity(chainValidationSuite, { chainId }); // extra check to make sure the API is loaded before we use stale market names const { data: marketNames, ...rest } = useOneWayMarketNames({ chainId }) - const { data: api } = useApi(); + const api = useStore((state) => state.api) const data: Record | undefined = useMemo(() => chainValid && marketNames && api ? Object.fromEntries( marketNames From 267f5b0a51fe03b7df684a1830c876d6cec72434 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 25 Oct 2024 11:17:53 +0200 Subject: [PATCH 042/137] Fix imports --- apps/lend/src/pages/_app.tsx | 5 +---- apps/main/src/pages/_app.tsx | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/lend/src/pages/_app.tsx b/apps/lend/src/pages/_app.tsx index dd7aa3225..64e926c53 100644 --- a/apps/lend/src/pages/_app.tsx +++ b/apps/lend/src/pages/_app.tsx @@ -8,12 +8,10 @@ import 'focus-visible' import '@/globals.css' import { HashRouter } from 'react-router-dom' import type { AppProps } from 'next/app' -import { connectWalletLocales } from '@/common/features/connect-wallet' +import { connectWalletLocales, initOnboard } from '@/common/features/connect-wallet' import { persister, queryClient } from '@/shared/api/query-client' import GlobalStyle from '@/globalStyle' import Page from '@/layout/index' -import { persister, queryClient } from '@/shared/api/query-client' -import { QueryProvider } from '@/ui/QueryProvider' import { dynamicActivate, initTranslation } from '@/lib/i18n' import { messages as messagesEn } from '@/locales/en/messages.js' import networks from '@/networks' @@ -23,7 +21,6 @@ import { QueryProvider } from '@/ui/QueryProvider' import { isMobile, removeExtraSpaces } from '@/utils/helpers' import { getLocaleFromUrl } from '@/utils/utilsRouter' import { getStorageValue } from '@/utils/utilsStorage' -import { initOnboard } from '@/common/features/connect-wallet' i18n.load({ en: messagesEn }) i18n.activate('en') diff --git a/apps/main/src/pages/_app.tsx b/apps/main/src/pages/_app.tsx index e413ec26d..e7df16146 100644 --- a/apps/main/src/pages/_app.tsx +++ b/apps/main/src/pages/_app.tsx @@ -10,6 +10,7 @@ import { I18nProvider as AriaI18nProvider } from 'react-aria' import { HashRouter } from 'react-router-dom' import type { AppProps } from 'next/app' import { connectWalletLocales } from '@/common/features/connect-wallet' +import { initOnboard } from '@/common/features/connect-wallet' import { persister, queryClient } from '@/shared/api/query-client' import { REFRESH_INTERVAL } from '@/constants' import GlobalStyle from '@/globalStyle' @@ -23,7 +24,6 @@ import { QueryProvider } from '@/ui/QueryProvider' import { getPageWidthClassName } from '@/ui/utils' import { getStorageValue, isMobile, removeExtraSpaces } from '@/utils' import { getLocaleFromUrl } from '@/utils/utilsRouter' -import { initOnboard } from '@/common/features/connect-wallet' i18n.load({ en: messagesEn }) i18n.activate('en') From b0d072f8174a683261ed86e1be03b673f8d62ad7 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Sun, 27 Oct 2024 08:25:44 +0100 Subject: [PATCH 043/137] feat: connect wallet ui fix: import issues --- .vercel/storybook-branch-filtering.sh | 4 +- apps/lend/src/layout/Header.tsx | 9 ++-- apps/lend/tsconfig.json | 3 +- apps/loan/tsconfig.json | 8 ++-- apps/main/src/components/PagePool/index.tsx | 2 +- .../ui/AddRewardToken.tsx | 2 +- .../ui/AmountTokenInput.tsx | 2 +- .../deposit-gauge-reward/ui/DepositReward.tsx | 4 +- .../deposit-gauge-reward/ui/EpochInput.tsx | 2 +- .../deposit-gauge-reward/ui/GasEstimation.tsx | 2 +- .../deposit-gauge-reward/ui/HelperFields.tsx | 2 +- .../src/features/connect-wallet/index.ts | 1 + .../connect-wallet/ui/ConnectWallet.tsx | 16 +++++++ .../connect-wallet/ui/ConnectWalletButton.tsx | 9 ++++ .../ui/ConnectedWalletLabel.tsx | 17 ++++++++ .../src/features/connect-wallet/ui/index.ts | 3 ++ .../src/features/switch-chain/index.ts | 1 + .../switch-chain/ui/ChainSwitcher.tsx | 42 +++++++++++++++++++ .../src/features/switch-chain/ui/index.ts | 1 + .../src/features/switch-language/index.ts | 1 + .../switch-language/ui/LanguageSwitcher.tsx | 40 ++++++++++++++++++ .../src/features/switch-language/ui/index.ts | 1 + packages/curve-common/tsconfig.json | 9 +++- .../entities/themes/lib/generate-themes.ts | 2 +- .../src/entities/themes/model/components.ts | 10 ++--- .../src/entities/themes/model/pallette.ts | 4 +- .../src/entities/themes/model/spacing.ts | 4 +- .../src/entities/themes/model/typography.ts | 8 ++-- .../resolve/resolved-categories.ts | 2 +- .../src/shared/lib/basic-theme/config.ts | 2 +- .../src/shared/ui/AddressLabel.tsx | 14 +++++++ packages/curve-ui-kit/src/shared/ui/Box.tsx | 2 + .../src/shared/ui/Button/Button.tsx | 9 +--- .../src/shared/ui/Button/muiButton.ts | 6 +-- .../src/shared/ui/FormControl.tsx | 2 + .../curve-ui-kit/src/shared/ui/InputLabel.tsx | 2 + .../curve-ui-kit/src/shared/ui/MenuItem.tsx | 2 + .../curve-ui-kit/src/shared/ui/Select.tsx | 2 + .../Typography/stories/Typography.stories.tsx | 2 +- .../Typography/variants/resolve-typography.ts | 5 +-- packages/curve-ui-kit/tsconfig.json | 4 +- .../FormErrorsDisplay/FormErrorsDisplay.tsx | 2 +- .../ui => }/skeleton/BlockSkeleton.tsx | 4 +- .../ui/src/{shared/ui => }/skeleton/index.ts | 0 .../src/{shared/ui => }/skeleton/styled.tsx | 0 .../src/{shared/ui => }/styled-containers.tsx | 0 46 files changed, 216 insertions(+), 53 deletions(-) create mode 100644 packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx create mode 100644 packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx create mode 100644 packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx create mode 100644 packages/curve-common/src/features/connect-wallet/ui/index.ts create mode 100644 packages/curve-common/src/features/switch-chain/index.ts create mode 100644 packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx create mode 100644 packages/curve-common/src/features/switch-chain/ui/index.ts create mode 100644 packages/curve-common/src/features/switch-language/index.ts create mode 100644 packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx create mode 100644 packages/curve-common/src/features/switch-language/ui/index.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/Box.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/FormControl.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/InputLabel.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/MenuItem.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/Select.tsx rename packages/ui/src/{shared/ui => }/skeleton/BlockSkeleton.tsx (77%) rename packages/ui/src/{shared/ui => }/skeleton/index.ts (100%) rename packages/ui/src/{shared/ui => }/skeleton/styled.tsx (100%) rename packages/ui/src/{shared/ui => }/styled-containers.tsx (100%) diff --git a/.vercel/storybook-branch-filtering.sh b/.vercel/storybook-branch-filtering.sh index 7af20624b..9552b3ca2 100644 --- a/.vercel/storybook-branch-filtering.sh +++ b/.vercel/storybook-branch-filtering.sh @@ -2,7 +2,7 @@ echo "VERCEL_GIT_COMMIT_REF: $VERCEL_GIT_COMMIT_REF" -if [[ "$VERCEL_GIT_COMMIT_REF" == "develop" || "$VERCEL_GIT_COMMIT_REF" == "task/new-design-system" ]] ; then +if [[ "$VERCEL_GIT_COMMIT_REF" == "develop" || "$VERCEL_GIT_COMMIT_REF" == "feat/develop/connect-wallet" ]] ; then # Proceed with the build echo "✅ - Build can proceed" exit 1; @@ -11,4 +11,4 @@ else # Don't build echo "🛑 - Build cancelled" exit 0; -fi \ No newline at end of file +fi diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index c36baa168..a418e44cd 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -11,7 +11,7 @@ import { DEFAULT_LOCALES } from '@/lib/i18n' import { getNetworkFromUrl, getParamsFromUrl, getRestFullPathname, getRestPartialPathname } from '@/utils/utilsRouter' import { getWalletSignerAddress } from '@/store/createWalletSlice' import { _parseRouteAndIsActive, FORMAT_OPTIONS, formatNumber, isLoading } from '@/ui/utils' -import { useConnectWallet } from '@/common/features/connect-wallet' +import { ConnectWallet, useConnectWallet } from '@/common/features/connect-wallet' import { useHeightResizeObserver } from '@/ui/hooks' import networks, { visibleNetworksList } from '@/networks' import useStore from '@/store/useStore' @@ -27,7 +27,6 @@ import { } from '@/ui/AppNav' import { CommunitySection, ResourcesSection } from '@/layout/Footer' import AppNavPages from '@/ui/AppNav/AppNavPages' -import ConnectWallet from '@/ui/Button/ConnectWallet' import HeaderSecondary from '@/layout/HeaderSecondary' import { useTvl } from '@/entities/chain' @@ -179,7 +178,11 @@ const Header = () => { {SelectNetworkComp} - + ) : ( diff --git a/apps/lend/tsconfig.json b/apps/lend/tsconfig.json index 34c4a7f79..2ef54dbc7 100644 --- a/apps/lend/tsconfig.json +++ b/apps/lend/tsconfig.json @@ -5,6 +5,7 @@ "paths": { "@/*": ["*"], "@/ui": ["../../../packages/ui/src/index.ts"], + "@/shared/ui/*": ["../../../packages/ui/src/shared/ui/*"], "@/ui/*": ["../../../packages/ui/src/*"], "@/images": ["../../../packages/ui/src/images/index.ts"], "@/images/*": ["../../../packages/ui/src/images/*"], @@ -17,6 +18,6 @@ "@/shared/external-rewards": ["../../../packages/external-rewards/src/index.ts"] } }, - "exclude": ["node_modules"], + "exclude": ["node_modules", "cypress"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] } diff --git a/apps/loan/tsconfig.json b/apps/loan/tsconfig.json index f63a93849..2ef54dbc7 100644 --- a/apps/loan/tsconfig.json +++ b/apps/loan/tsconfig.json @@ -5,6 +5,7 @@ "paths": { "@/*": ["*"], "@/ui": ["../../../packages/ui/src/index.ts"], + "@/shared/ui/*": ["../../../packages/ui/src/shared/ui/*"], "@/ui/*": ["../../../packages/ui/src/*"], "@/images": ["../../../packages/ui/src/images/index.ts"], "@/images/*": ["../../../packages/ui/src/images/*"], @@ -13,9 +14,10 @@ "@/shared/api/*": ["../../../packages/curve-lib/src/shared/api/*"], "@/shared/lib/*": ["../../../packages/curve-lib/src/shared/lib/*"], "@/shared/model/*": ["../../../packages/curve-lib/src/shared/model/*"], - "@/shared/types/*": ["../../../packages/curve-lib/src/shared/types/*"] - }, + "@/shared/types/*": ["../../../packages/curve-lib/src/shared/types/*"], + "@/shared/external-rewards": ["../../../packages/external-rewards/src/index.ts"] + } }, - "exclude": ["node_modules"], + "exclude": ["node_modules", "cypress"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] } diff --git a/apps/main/src/components/PagePool/index.tsx b/apps/main/src/components/PagePool/index.tsx index f7999ef26..f47febc68 100644 --- a/apps/main/src/components/PagePool/index.tsx +++ b/apps/main/src/components/PagePool/index.tsx @@ -51,7 +51,7 @@ import CampaignRewardsBanner from '@/components/PagePool/components/CampaignRewa import PoolInfoData from '@/components/PagePool/PoolDetails/ChartOhlcWrapper' import PoolParameters from '@/components/PagePool/PoolDetails/PoolParameters' import { useGaugeManager } from '@/entities/gauge' -import { BlockSkeleton } from '@/shared/ui/skeleton' +import { BlockSkeleton } from '../../../../../packages/ui/src/skeleton' import { ManageGauge } from '@/widgets/manage-gauge' import { isAddressEqual, type Address } from 'viem' diff --git a/apps/main/src/features/add-gauge-reward-token/ui/AddRewardToken.tsx b/apps/main/src/features/add-gauge-reward-token/ui/AddRewardToken.tsx index 7dd8c9002..f38b99679 100644 --- a/apps/main/src/features/add-gauge-reward-token/ui/AddRewardToken.tsx +++ b/apps/main/src/features/add-gauge-reward-token/ui/AddRewardToken.tsx @@ -15,7 +15,7 @@ import { import { useSignerAddress } from '@/entities/signer' import { formDefaultOptions } from '@/shared/model/form' -import { FlexContainer, FormContainer, FormFieldsContainer } from '@/shared/ui/styled-containers' +import { FlexContainer, FormContainer, FormFieldsContainer } from '@/ui/styled-containers' import AlertFormError from '@/components/AlertFormError' import networks from '@/networks' import { FormErrorsDisplay } from '@/ui/FormErrorsDisplay' diff --git a/apps/main/src/features/deposit-gauge-reward/ui/AmountTokenInput.tsx b/apps/main/src/features/deposit-gauge-reward/ui/AmountTokenInput.tsx index 1ef3c864b..c8615c129 100644 --- a/apps/main/src/features/deposit-gauge-reward/ui/AmountTokenInput.tsx +++ b/apps/main/src/features/deposit-gauge-reward/ui/AmountTokenInput.tsx @@ -23,7 +23,7 @@ import { } from '@/entities/gauge' import { useIsSignerConnected, useSignerAddress, useTokensBalances } from '@/entities/signer' import { useTokens } from '@/entities/token' -import { FlexContainer } from '@/shared/ui/styled-containers' +import { FlexContainer } from '@/ui/styled-containers' export const AmountTokenInput: React.FC<{ chainId: ChainId diff --git a/apps/main/src/features/deposit-gauge-reward/ui/DepositReward.tsx b/apps/main/src/features/deposit-gauge-reward/ui/DepositReward.tsx index 5d41cbeee..9bf7565bf 100644 --- a/apps/main/src/features/deposit-gauge-reward/ui/DepositReward.tsx +++ b/apps/main/src/features/deposit-gauge-reward/ui/DepositReward.tsx @@ -11,8 +11,8 @@ import { } from '@/features/deposit-gauge-reward/ui' import { useGaugeRewardsDistributors } from '@/entities/gauge' import { formDefaultOptions } from '@/shared/model/form' -import { BlockSkeleton } from '@/shared/ui/skeleton' -import { FormContainer, FormFieldsContainer, GroupedFieldsContainer } from '@/shared/ui/styled-containers' +import { BlockSkeleton } from '../../../../../../packages/ui/src/skeleton' +import { FormContainer, FormFieldsContainer, GroupedFieldsContainer } from '@/ui/styled-containers' import AlertFormError from '@/components/AlertFormError' import { FormErrorsDisplay } from '@/ui/FormErrorsDisplay' diff --git a/apps/main/src/features/deposit-gauge-reward/ui/EpochInput.tsx b/apps/main/src/features/deposit-gauge-reward/ui/EpochInput.tsx index 034119c23..ca9555c90 100644 --- a/apps/main/src/features/deposit-gauge-reward/ui/EpochInput.tsx +++ b/apps/main/src/features/deposit-gauge-reward/ui/EpochInput.tsx @@ -5,7 +5,7 @@ import { TIME_FRAMES } from '@/constants' import type { DepositRewardFormValues } from '@/features/deposit-gauge-reward/types' import { EpochInputWrapper, EpochLabel, StyledInputProvider } from '@/features/deposit-gauge-reward/ui' import { useDepositRewardApproveIsMutating, useDepositRewardIsMutating } from '@/entities/gauge' -import { FlexContainer } from '@/shared/ui/styled-containers' +import { FlexContainer } from '@/ui/styled-containers' export const EpochInput: React.FC<{ chainId: ChainId; poolId: string }> = ({ chainId, poolId }) => { const { setValue, formState, watch } = useFormContext() diff --git a/apps/main/src/features/deposit-gauge-reward/ui/GasEstimation.tsx b/apps/main/src/features/deposit-gauge-reward/ui/GasEstimation.tsx index de56a9501..7b4cbac6b 100644 --- a/apps/main/src/features/deposit-gauge-reward/ui/GasEstimation.tsx +++ b/apps/main/src/features/deposit-gauge-reward/ui/GasEstimation.tsx @@ -3,7 +3,7 @@ import { useFormContext } from 'react-hook-form' import DetailInfoEstGas from '@/components/DetailInfoEstGas' import { DepositRewardStep, type DepositRewardFormValues } from '@/features/deposit-gauge-reward/types' import { useEstimateGasDepositReward, useEstimateGasDepositRewardApprove } from '@/entities/gauge' -import { FlexContainer } from '@/shared/ui/styled-containers' +import { FlexContainer } from '@/ui/styled-containers' export const GasEstimation: React.FC<{ chainId: ChainId diff --git a/apps/main/src/features/deposit-gauge-reward/ui/HelperFields.tsx b/apps/main/src/features/deposit-gauge-reward/ui/HelperFields.tsx index 9f1d08dcb..b87be7fe1 100644 --- a/apps/main/src/features/deposit-gauge-reward/ui/HelperFields.tsx +++ b/apps/main/src/features/deposit-gauge-reward/ui/HelperFields.tsx @@ -2,7 +2,7 @@ import { useFormContext } from 'react-hook-form' import FieldHelperUsdRate from '@/components/FieldHelperUsdRate' import { type DepositRewardFormValues } from '@/features/deposit-gauge-reward/types' import { useTokensUSDRates } from '@/entities/token' -import { FlexContainer } from '@/shared/ui/styled-containers' +import { FlexContainer } from '@/ui/styled-containers' export const HelperFields: React.FC<{ chainId: ChainId; poolId: string }> = ({ chainId, poolId }) => { const { watch } = useFormContext() diff --git a/packages/curve-common/src/features/connect-wallet/index.ts b/packages/curve-common/src/features/connect-wallet/index.ts index 99b409687..9fe0f33ba 100644 --- a/packages/curve-common/src/features/connect-wallet/index.ts +++ b/packages/curve-common/src/features/connect-wallet/index.ts @@ -1 +1,2 @@ export * from './lib' +export * from './ui' diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx new file mode 100644 index 000000000..7f1a05f48 --- /dev/null +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx @@ -0,0 +1,16 @@ +import React, { FunctionComponent } from 'react' +import { ConnectWalletButton } from './ConnectWalletButton' +import { ConnectedWalletLabel } from './ConnectedWalletLabel' + +export type ConnectWalletProps = { + walletAddress?: string + onConnectWallet: () => void + onDisconnectWallet: () => void +} + +export const ConnectWallet: FunctionComponent = ({ walletAddress, onConnectWallet, onDisconnectWallet }) => + walletAddress ? ( + + ) : ( + + ) diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx new file mode 100644 index 000000000..8c27ba44b --- /dev/null +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx @@ -0,0 +1,9 @@ +import { Button } from '../../../../../curve-ui-kit/src/shared/ui/Button' +import { t } from '@lingui/macro' + +interface ConnectWalletButtonProps { + onConnectWallet?: () => void +} + +export const ConnectWalletButton = ({ onConnectWallet }: ConnectWalletButtonProps) => + diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx new file mode 100644 index 000000000..c45bf95d6 --- /dev/null +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx @@ -0,0 +1,17 @@ +import { FunctionComponent } from 'react' +import { Button } from 'curve-ui-kit/src/shared/ui/Button' +import { AddressLabel } from 'curve-ui-kit/src/shared/ui/AddressLabel' + +interface ConnectedWalletLabelProps { + walletAddress: string, + onDisconnectWallet: () => void +} + +export const ConnectedWalletLabel: FunctionComponent = ({ + walletAddress, + onDisconnectWallet +}) => ( + +) diff --git a/packages/curve-common/src/features/connect-wallet/ui/index.ts b/packages/curve-common/src/features/connect-wallet/ui/index.ts new file mode 100644 index 000000000..b6a7342a9 --- /dev/null +++ b/packages/curve-common/src/features/connect-wallet/ui/index.ts @@ -0,0 +1,3 @@ +export * from './ConnectWalletButton' +export * from './ConnectWallet' +export * from './ConnectedWalletLabel' diff --git a/packages/curve-common/src/features/switch-chain/index.ts b/packages/curve-common/src/features/switch-chain/index.ts new file mode 100644 index 000000000..ed584959d --- /dev/null +++ b/packages/curve-common/src/features/switch-chain/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx b/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx new file mode 100644 index 000000000..6768a62a8 --- /dev/null +++ b/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx @@ -0,0 +1,42 @@ +import { InputLabel } from '@/common/shared/ui/InputLabel' +import { Select } from '@/common/shared/ui/Select' +import { FormControl } from '@/common/shared/ui/FormControl' +import { MenuItem } from '@/common/shared/ui/MenuItem' +import { useCallback } from 'react' +import { SelectChangeEvent } from '@mui/material/Select/SelectInput' + +export type ChainOption = { + id: TChainId + name: string + icon: string +} + +export type ChainSwitcherProps = { + chainId: TChainId; + chainOptions: ChainOption[] + onChange: (chainId: TChainId) => void +} + +export const ChainSwitcher = ({ chainOptions, chainId, onChange }: ChainSwitcherProps) => + ( + + Chain + + labelId="chain-switcher-label" + id="chain-switcher" + value={chainId} + label="Chain" + onChange={useCallback((v: SelectChangeEvent) => onChange(v.target.value as TChainId), [onChange])} + variant="standard" + > + { + chainOptions.map((chainOption) => ( + + {chainOption.icon} + {chainOption.name} + + )) + } + + + ) diff --git a/packages/curve-common/src/features/switch-chain/ui/index.ts b/packages/curve-common/src/features/switch-chain/ui/index.ts new file mode 100644 index 000000000..6f609ed32 --- /dev/null +++ b/packages/curve-common/src/features/switch-chain/ui/index.ts @@ -0,0 +1 @@ +export * from './ChainSwitcher' \ No newline at end of file diff --git a/packages/curve-common/src/features/switch-language/index.ts b/packages/curve-common/src/features/switch-language/index.ts new file mode 100644 index 000000000..ed584959d --- /dev/null +++ b/packages/curve-common/src/features/switch-language/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx new file mode 100644 index 000000000..f142318e1 --- /dev/null +++ b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx @@ -0,0 +1,40 @@ +import { InputLabel } from '@/common/shared/ui/InputLabel' +import { Select } from '@/common/shared/ui/Select' +import { FormControl } from '@/common/shared/ui/FormControl' +import { MenuItem } from '@/common/shared/ui/MenuItem' +import { useCallback } from 'react' +import { SelectChangeEvent } from '@mui/material/Select/SelectInput' + +export type LanguageOption = { + code: string + name: string +} + +export type LanguageSwitcherProps = { + languageCode: string + languageOptions: LanguageOption[] + onChange: (languageCode: string) => void +} + +export const LanguageSwitcher = ({ languageOptions, languageCode, onChange }: LanguageSwitcherProps) => + ( + + Language + + + ) diff --git a/packages/curve-common/src/features/switch-language/ui/index.ts b/packages/curve-common/src/features/switch-language/ui/index.ts new file mode 100644 index 000000000..6fe295259 --- /dev/null +++ b/packages/curve-common/src/features/switch-language/ui/index.ts @@ -0,0 +1 @@ +export * from './LanguageSwitcher' \ No newline at end of file diff --git a/packages/curve-common/tsconfig.json b/packages/curve-common/tsconfig.json index 0f2e5a742..ca8a2a1a9 100644 --- a/packages/curve-common/tsconfig.json +++ b/packages/curve-common/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "jsx": "react-jsx", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, @@ -7,8 +8,12 @@ "preserveWatchOutput": true, "skipLibCheck": true, "noEmit": true, - "strict": true + "strict": true, + "paths": { + "@/*": ["*"], + "@/shared/ui/*": ["../../../packages/curve-common/src/shared/ui/*"] + } }, - "include": ["src", "global.d.ts"], + "include": ["src", "global.d.ts", "../curve-ui-kit/**/*.d.ts"], "exclude": ["node_modules"] } diff --git a/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts b/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts index 76fb9e829..6906a05b5 100644 --- a/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts +++ b/packages/curve-ui-kit/src/entities/themes/lib/generate-themes.ts @@ -1,5 +1,5 @@ import { createTheme as createMuiTheme, type Theme } from '@mui/material/styles' -import { basicMuiTheme, type ThemeKey } from '@/shared/lib/basic-theme' +import { basicMuiTheme, type ThemeKey } from '../../../shared/lib/basic-theme' import { createComponents, createPalette, createSpacing, createTypography } from '../model' const generateTheme = (mode: ThemeKey): Theme => diff --git a/packages/curve-ui-kit/src/entities/themes/model/components.ts b/packages/curve-ui-kit/src/entities/themes/model/components.ts index 50758d6cc..41dc64d46 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/components.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/components.ts @@ -1,9 +1,9 @@ import { type ThemeOptions } from '@mui/material/styles' -import { figmaTokens } from '@/shared/api/figma-tokens' -import type { ThemeKey } from '@/shared/lib/basic-theme' -import { defineMuiButton } from '@/shared/ui/Button' -import { defineMuiCssBaseline } from '@/shared/ui/CssBaseline' -import { defineMuiTypography } from '@/shared/ui/Typography' +import { figmaTokens } from '../../../shared/api/figma-tokens' +import type { ThemeKey } from '../../../shared/lib/basic-theme' +import { defineMuiButton } from '../../../shared/ui/Button' +import { defineMuiCssBaseline } from '../../../shared/ui/CssBaseline' +import { defineMuiTypography } from '../../../shared/ui/Typography' export const createComponents = (mode: ThemeKey): ThemeOptions['components'] => ({ MuiTypography: defineMuiTypography(), diff --git a/packages/curve-ui-kit/src/entities/themes/model/pallette.ts b/packages/curve-ui-kit/src/entities/themes/model/pallette.ts index aeef287a1..4200b201c 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/pallette.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/pallette.ts @@ -1,6 +1,6 @@ import type { ThemeOptions } from '@mui/material' -import { extractPairs, figmaTokens } from '@/shared/api/figma-tokens' -import type { ThemeKey } from '@/shared/lib/basic-theme' +import { extractPairs, figmaTokens } from '../../../shared/api/figma-tokens' +import type { ThemeKey } from '../../../shared/lib/basic-theme' export const createPalette = (mode: ThemeKey): ThemeOptions['palette'] => { const theme = figmaTokens.themes.desktop[mode] diff --git a/packages/curve-ui-kit/src/entities/themes/model/spacing.ts b/packages/curve-ui-kit/src/entities/themes/model/spacing.ts index 1dd1c253c..a29ed6872 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/spacing.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/spacing.ts @@ -1,7 +1,7 @@ import { type ThemeOptions } from '@mui/material/styles' -import { figmaTokens, extractNumber } from '@/shared/api/figma-tokens' -import { type ThemeKey } from '@/shared/lib/basic-theme' +import { figmaTokens, extractNumber } from '../../../shared/api/figma-tokens' +import { type ThemeKey } from '../../../shared/lib/basic-theme' export const createSpacing = (mode: ThemeKey): ThemeOptions => { const { xxs, xs, sm, md, lg, xl, xxl } = figmaTokens.mappedSizesAndSpaces.desktop.spacing diff --git a/packages/curve-ui-kit/src/entities/themes/model/typography.ts b/packages/curve-ui-kit/src/entities/themes/model/typography.ts index f5d237ed9..1d7c78932 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/typography.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/typography.ts @@ -1,8 +1,8 @@ import { type TypographyOptions } from '@mui/material/styles/createTypography' -import { figmaTokens } from '@/shared/api/figma-tokens' -import { basicMuiTheme, ThemeFontFamily, type ThemeKey } from '@/shared/lib/basic-theme' -import { omitProperty } from '@/shared/lib/object-properties' -import { disabledTypographyKeys } from '@/shared/ui/Typography' +import { figmaTokens } from '../../../shared/api/figma-tokens' +import { basicMuiTheme, ThemeFontFamily, type ThemeKey } from '../../../shared/lib/basic-theme' +import { omitProperty } from '../../../shared/lib/object-properties' +import { disabledTypographyKeys } from '../../../shared/ui/Typography' export const createTypography = (mode: ThemeKey): TypographyOptions => { const typographyVariants = Object.entries(figmaTokens.typography).reduce((acc, [key, value]) => { diff --git a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts index 847fcbe5a..4c5a32ca1 100644 --- a/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts +++ b/packages/curve-ui-kit/src/shared/api/figma-tokens/resolve/resolved-categories.ts @@ -2,7 +2,7 @@ import { resolveTableTypographyVariants, resolveTypographyVariants, type ResolvedTypography, -} from '@/shared/ui/Typography' +} from '../../../ui/Typography' import { curveFigmaDesignTokens, type CurveFigmaDesignTokens, type ScreenType } from '../tokens' import { resolveFigmaTokens, type ResolvedValue } from './resolver' diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts index d72039807..0dfdc82fa 100644 --- a/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts @@ -1,4 +1,4 @@ -import { FontFamilyBasic, FontFamilyChad } from '@/shared/ui/Typography' +import { FontFamilyBasic, FontFamilyChad } from '../../ui/Typography/variants/config' import type { ThemeKey } from './theme.types' export const ThemeFontFamily: Record = { diff --git a/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx b/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx new file mode 100644 index 000000000..5271fb2b6 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx @@ -0,0 +1,14 @@ +import { FunctionComponent } from 'react' +import { Box } from './Box' + +type Address = `0x${string}` + +export type AddressLabelProps = { + value: Address; +} + +export const AddressLabel: FunctionComponent = ({value}) => ( + + {value.substring(0, 7)}...{value.substring(38)} + +) diff --git a/packages/curve-ui-kit/src/shared/ui/Box.tsx b/packages/curve-ui-kit/src/shared/ui/Box.tsx new file mode 100644 index 000000000..54ae5f438 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Box.tsx @@ -0,0 +1,2 @@ +export type * from '@mui/material/Box'; +export { default as Box } from '@mui/material/Box'; diff --git a/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx b/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx index 69c0774cd..760dfa442 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx +++ b/packages/curve-ui-kit/src/shared/ui/Button/Button.tsx @@ -1,7 +1,2 @@ -import { Button as MuiButton, ButtonProps as MuiButtonProps } from '@mui/material' - -export interface ButtonProps extends MuiButtonProps {} - -export const Button = ({ children, ...props }: ButtonProps) => { - return {children} -} +export * from '@mui/material/Button' +export { default as Button } from '@mui/material/Button' diff --git a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts index 2b4f45396..87f04c164 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts @@ -1,7 +1,7 @@ import type { Components, CSSObject } from '@mui/material/styles' -import { type FigmaTokens, extractNumber } from '@/shared/api/figma-tokens' -import { basicMuiTheme, type ThemeKey } from '@/shared/lib/basic-theme' -import { omitProperty } from '@/shared/lib/object-properties' +import { type FigmaTokens, extractNumber } from '../../api/figma-tokens' +import { basicMuiTheme, type ThemeKey } from '../../lib/basic-theme' +import { omitProperty } from '../../lib/object-properties' export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey): Components['MuiButton'] => { const buttonDesktop = figmaTokens.themes.desktop[mode].button diff --git a/packages/curve-ui-kit/src/shared/ui/FormControl.tsx b/packages/curve-ui-kit/src/shared/ui/FormControl.tsx new file mode 100644 index 000000000..1e5040e2c --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/FormControl.tsx @@ -0,0 +1,2 @@ +export type * from '@mui/material/FormControl'; +export { default as FormControl } from '@mui/material/FormControl'; diff --git a/packages/curve-ui-kit/src/shared/ui/InputLabel.tsx b/packages/curve-ui-kit/src/shared/ui/InputLabel.tsx new file mode 100644 index 000000000..b229970dd --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/InputLabel.tsx @@ -0,0 +1,2 @@ +export type * from '@mui/material/InputLabel'; +export { default as InputLabel } from '@mui/material/InputLabel'; diff --git a/packages/curve-ui-kit/src/shared/ui/MenuItem.tsx b/packages/curve-ui-kit/src/shared/ui/MenuItem.tsx new file mode 100644 index 000000000..0588c7219 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/MenuItem.tsx @@ -0,0 +1,2 @@ +export type * from '@mui/material/MenuItem'; +export { default as MenuItem } from '@mui/material/MenuItem'; diff --git a/packages/curve-ui-kit/src/shared/ui/Select.tsx b/packages/curve-ui-kit/src/shared/ui/Select.tsx new file mode 100644 index 000000000..b3197ce8c --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Select.tsx @@ -0,0 +1,2 @@ +export { default as Select } from '@mui/material/Select' +export type * from '@mui/material/Select' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx b/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx index 5b349ab4c..f544c53a2 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx +++ b/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx @@ -1,6 +1,6 @@ import { Divider, Stack } from '@mui/material' import type { Meta, StoryObj } from '@storybook/react' -import { figmaTokens } from '@/shared/api/figma-tokens' +import { figmaTokens } from '../../../api/figma-tokens' import { Typography } from '../Typography' import { typographyVariantsKeys, TypographyVariantKey } from '../variants' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts index 00e57ee46..6208c558c 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts @@ -1,6 +1,5 @@ -import type { FigmaTypography, FigmaTypographyToken } from '@/shared/api/figma-tokens' -import { ThemeFontFamily, type ThemeKey } from '@/shared/lib/basic-theme' -import { capitalizeFirstLetter, capitalizeSpecificWords } from '@/shared/lib/capitalize' +import type { FigmaTypography, FigmaTypographyToken } from '../../../api/figma-tokens' +import { capitalizeFirstLetter, capitalizeSpecificWords } from '../../../lib/capitalize' import type { NonTableTypographyVariantKey, TableTypographyVariantKey, TypographyVariantKey } from './config' /** diff --git a/packages/curve-ui-kit/tsconfig.json b/packages/curve-ui-kit/tsconfig.json index 985713485..b174fd659 100644 --- a/packages/curve-ui-kit/tsconfig.json +++ b/packages/curve-ui-kit/tsconfig.json @@ -4,12 +4,14 @@ "strict": true, "noImplicitAny": true, "noImplicitThis": true, + "esModuleInterop": true, "strictNullChecks": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, "baseUrl": "./src", "paths": { - "@/*": ["*"] + "@/*": ["*"], + "@/common/*": ["../../../packages/curve-common/src/*"] } }, "exclude": ["node_modules"], diff --git a/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx b/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx index 1ff50be93..fbd5bc00b 100644 --- a/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx +++ b/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx @@ -1,4 +1,4 @@ -import { ErrorContainer } from '@/shared/ui/styled-containers' +import { ErrorContainer } from '@/styled-containers' import { ErrorMessage } from '@hookform/error-message' import { FunctionComponent, useCallback, useMemo } from 'react' import { useFormContext } from 'react-hook-form' diff --git a/packages/ui/src/shared/ui/skeleton/BlockSkeleton.tsx b/packages/ui/src/skeleton/BlockSkeleton.tsx similarity index 77% rename from packages/ui/src/shared/ui/skeleton/BlockSkeleton.tsx rename to packages/ui/src/skeleton/BlockSkeleton.tsx index 8cba3cf89..543ce2a41 100644 --- a/packages/ui/src/shared/ui/skeleton/BlockSkeleton.tsx +++ b/packages/ui/src/skeleton/BlockSkeleton.tsx @@ -1,6 +1,6 @@ import React from 'react' -import { LoaderWrapper } from '@/shared/ui/skeleton/styled' -import Loader from 'ui/src/Loader' +import { LoaderWrapper } from '@/skeleton/styled' +import Loader from '@/Loader' export const BlockSkeleton: React.FC<{ height?: number diff --git a/packages/ui/src/shared/ui/skeleton/index.ts b/packages/ui/src/skeleton/index.ts similarity index 100% rename from packages/ui/src/shared/ui/skeleton/index.ts rename to packages/ui/src/skeleton/index.ts diff --git a/packages/ui/src/shared/ui/skeleton/styled.tsx b/packages/ui/src/skeleton/styled.tsx similarity index 100% rename from packages/ui/src/shared/ui/skeleton/styled.tsx rename to packages/ui/src/skeleton/styled.tsx diff --git a/packages/ui/src/shared/ui/styled-containers.tsx b/packages/ui/src/styled-containers.tsx similarity index 100% rename from packages/ui/src/shared/ui/styled-containers.tsx rename to packages/ui/src/styled-containers.tsx From 63decf998891b56d370e81ecc93997831999509f Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 29 Oct 2024 10:43:54 +0100 Subject: [PATCH 044/137] fix: import, lint and build issues --- .eslintrc.js | 2 +- apps/lend/package.json | 2 +- apps/lend/src/hooks/usePageOnMount.ts | 11 +++-- apps/lend/src/layout/Header.tsx | 5 +-- apps/lend/src/layout/index.tsx | 3 +- apps/lend/src/store/createWalletSlice.ts | 34 +++----------- apps/lend/tsconfig.json | 2 +- apps/loan/src/hooks/usePageOnMount.ts | 4 +- apps/loan/src/layout/Header.tsx | 3 +- apps/loan/src/store/createWalletSlice.ts | 5 --- apps/loan/tsconfig.json | 2 +- apps/main/package.json | 2 +- apps/main/src/hooks/usePageOnMount.ts | 6 +-- apps/main/src/layout/default/Header.tsx | 11 +++-- apps/main/src/store/createWalletSlice.ts | 5 --- apps/main/tsconfig.json | 2 +- packages/curve-common/package.json | 3 +- .../src/features/connect-wallet/lib/index.ts | 1 + .../lib/utils/wallet-helpers.ts | 14 ++++++ ...tWallet.tsx => ConnectWalletIndicator.tsx} | 7 +-- .../ui/ConnectedWalletLabel.tsx | 4 +- .../src/features/connect-wallet/ui/index.ts | 2 +- packages/curve-common/tsconfig.json | 3 +- packages/curve-lib/tsconfig.json | 2 +- packages/curve-ui-kit/src/shared/api/index.ts | 1 + .../src/shared/lib/basic-theme/config.ts | 2 +- packages/curve-ui-kit/src/shared/lib/index.ts | 3 ++ .../src/shared/ui/AddressLabel.tsx | 2 +- .../src/shared/ui/Button/muiButton.ts | 5 +-- .../Typography/stories/Typography.stories.tsx | 2 +- .../Typography/variants/resolve-typography.ts | 2 +- packages/ui/src/AppNav/types.ts | 3 +- packages/ui/src/Button/ConnectWallet.tsx | 3 +- .../FormErrorsDisplay/FormErrorsDisplay.tsx | 2 +- packages/ui/src/skeleton/BlockSkeleton.tsx | 4 +- tests/package.json | 2 +- yarn.lock | 45 +++++++++---------- 37 files changed, 99 insertions(+), 112 deletions(-) create mode 100644 packages/curve-common/src/features/connect-wallet/lib/utils/wallet-helpers.ts rename packages/curve-common/src/features/connect-wallet/ui/{ConnectWallet.tsx => ConnectWalletIndicator.tsx} (60%) create mode 100644 packages/curve-ui-kit/src/shared/api/index.ts create mode 100644 packages/curve-ui-kit/src/shared/lib/index.ts diff --git a/.eslintrc.js b/.eslintrc.js index bb8b08c51..2b2c70798 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,7 +13,6 @@ module.exports = { files: [ 'apps/loan/src/{app,widgets,features,entities,shared}/**/*.{ts,tsx}', 'packages/curve-lib/src/shared/**/*.ts', - 'packages/curve-ui-kit/src/**/*.{ts,tsx}', ], rules: { 'import/order': 'error', // feature-sliced/import-order @@ -26,6 +25,7 @@ module.exports = { files: [ 'apps/{main,lend}/src/{app,pages,widgets,features,entities,shared}/**/*.{ts,tsx}', 'apps/loan/src/pages/**/*.{ts,tsx}', + 'packages/curve-ui-kit/src/**/*.{ts,tsx}', ], rules: { 'import/order': 'warn', // feature-sliced/import-order diff --git a/apps/lend/package.json b/apps/lend/package.json index 436c37825..b7c83aae8 100644 --- a/apps/lend/package.json +++ b/apps/lend/package.json @@ -33,7 +33,7 @@ "curve-common": "*", "curve-lib": "*", "dayjs": "^1.11.7", - "ethers": "^6.10.0", + "ethers": "^6.11.0", "external-rewards": "*", "focus-visible": "5.2.0", "fuse.js": "^6.6.2", diff --git a/apps/lend/src/hooks/usePageOnMount.ts b/apps/lend/src/hooks/usePageOnMount.ts index 7f66dda70..e0d09edc8 100644 --- a/apps/lend/src/hooks/usePageOnMount.ts +++ b/apps/lend/src/hooks/usePageOnMount.ts @@ -1,17 +1,22 @@ import type { Location, NavigateFunction, Params } from 'react-router' import type { ConnectState } from '@/ui/utils' +import { isFailure, isLoading, isSuccess } from '@/ui/utils' import type { INetworkName } from '@curvefi/lending-api/lib/interfaces' import { ethers } from 'ethers' import { useCallback, useEffect } from 'react' -import { useConnectWallet, useSetChain, useSetLocale } from '@/common/features/connect-wallet' +import { + getWalletChainId, + getWalletSignerAddress, + useConnectWallet, + useSetChain, + useSetLocale +} from '@/common/features/connect-wallet' import { CONNECT_STAGE, REFRESH_INTERVAL, ROUTE } from '@/constants' import { dynamicActivate, updateAppLocale } from '@/lib/i18n' import { getStorageValue, setStorageValue } from '@/utils/utilsStorage' import { getNetworkFromUrl, parseParams } from '@/utils/utilsRouter' -import { getWalletChainId, getWalletSignerAddress } from '@/store/createWalletSlice' -import { isFailure, isLoading, isSuccess } from '@/ui/utils' import { helpers } from '@/lib/apiLending' import networks, { networksIdMapper } from '@/networks' import useStore from '@/store/useStore' diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index a418e44cd..ac605dae8 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -9,9 +9,8 @@ import { useNavigate, useParams } from 'react-router-dom' import { CONNECT_STAGE, ROUTE } from '@/constants' import { DEFAULT_LOCALES } from '@/lib/i18n' import { getNetworkFromUrl, getParamsFromUrl, getRestFullPathname, getRestPartialPathname } from '@/utils/utilsRouter' -import { getWalletSignerAddress } from '@/store/createWalletSlice' import { _parseRouteAndIsActive, FORMAT_OPTIONS, formatNumber, isLoading } from '@/ui/utils' -import { ConnectWallet, useConnectWallet } from '@/common/features/connect-wallet' +import { ConnectWalletIndicator, getWalletSignerAddress, useConnectWallet } from '@/common/features/connect-wallet' import { useHeightResizeObserver } from '@/ui/hooks' import networks, { visibleNetworksList } from '@/networks' import useStore from '@/store/useStore' @@ -178,7 +177,7 @@ const Header = () => { {SelectNetworkComp} - , get: GetState): WalletSl updateProvider: async (wallet) => { try { const storedProvider = get().wallet.provider - const newProvider = wallet ? _getProvider(wallet) : null + const newProvider = wallet ? getWalletProvider(wallet) : null if (storedProvider) await storedProvider.removeAllListeners() get().wallet.setStateByKey('provider', newProvider) } catch (error) { @@ -97,34 +98,11 @@ const createWalletSlice = (set: SetState, get: GetState): WalletSl }, // slice helpers - setStateByActiveKey: (key: StateKey, activeKey: string, value: T) => { - get().setAppStateByActiveKey(sliceKey, key, activeKey, value) - }, - setStateByKey: (key: StateKey, value: T) => { - get().setAppStateByKey(sliceKey, key, value) - }, - setStateByKeys: (sliceState: Partial) => { - get().setAppStateByKeys(sliceKey, sliceState) - }, - resetState: () => { - get().resetAppState(sliceKey, cloneDeep(DEFAULT_STATE)) - }, + setStateByActiveKey: (key: StateKey, activeKey: string, value: T) => get().setAppStateByActiveKey(sliceKey, key, activeKey, value), + setStateByKey: (key: StateKey, value: T) => get().setAppStateByKey(sliceKey, key, value), + setStateByKeys: (sliceState: Partial) => get().setAppStateByKeys(sliceKey, sliceState), + resetState: () => get().resetAppState(sliceKey, cloneDeep(DEFAULT_STATE)), }, }) export default createWalletSlice - -export function _getProvider(wallet: Wallet) { - return new ethers.BrowserProvider(wallet.provider) -} - -export function getWalletChainId(wallet: Wallet | undefined | null) { - if (!wallet) return null - const chainId = wallet.chains[0].id - return Number(BigInt(chainId).toString()) -} - -export function getWalletSignerAddress(wallet: Wallet | undefined | null) { - if (!wallet) return '' - return wallet.accounts[0]?.address -} diff --git a/apps/lend/tsconfig.json b/apps/lend/tsconfig.json index 2ef54dbc7..97614edd7 100644 --- a/apps/lend/tsconfig.json +++ b/apps/lend/tsconfig.json @@ -19,5 +19,5 @@ } }, "exclude": ["node_modules", "cypress"], - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../../packages/curve-ui-kit/**/*.d.ts"] } diff --git a/apps/loan/src/hooks/usePageOnMount.ts b/apps/loan/src/hooks/usePageOnMount.ts index 836b7cf2d..a98a1ffce 100644 --- a/apps/loan/src/hooks/usePageOnMount.ts +++ b/apps/loan/src/hooks/usePageOnMount.ts @@ -4,13 +4,13 @@ import type { INetworkName } from '@curvefi/stablecoin-api/lib/interfaces' import { ethers } from 'ethers' import { useCallback, useEffect } from 'react' -import { useConnectWallet, useSetChain, useSetLocale } from '@/common/features/connect-wallet' +import { useConnectWallet, useSetChain, useSetLocale, getWalletSignerAddress } from '@/common/features/connect-wallet' import { CONNECT_STAGE, REFRESH_INTERVAL, ROUTE } from '@/constants' import { dynamicActivate, updateAppLocale } from '@/lib/i18n' import { getStorageValue, setStorageValue } from '@/utils/storage' import { getNetworkFromUrl, parseParams } from '@/utils/utilsRouter' -import { getWalletChainId, getWalletSignerAddress } from '@/store/createWalletSlice' +import { getWalletChainId } from '@/store/createWalletSlice' import { initCurveJs } from '@/utils/utilsCurvejs' import { isFailure, isLoading, isSuccess } from '@/ui/utils' import networks, { networksIdMapper } from '@/networks' diff --git a/apps/loan/src/layout/Header.tsx b/apps/loan/src/layout/Header.tsx index 9ffeb67ff..50d439c6f 100644 --- a/apps/loan/src/layout/Header.tsx +++ b/apps/loan/src/layout/Header.tsx @@ -8,9 +8,8 @@ import { useNavigate, useParams } from 'react-router-dom' import { CONNECT_STAGE, CRVUSD_ADDRESS, ROUTE } from '@/constants' import { DEFAULT_LOCALES } from '@/lib/i18n' import { getLocaleFromUrl, getNetworkFromUrl, getPath, getRestFullPathname } from '@/utils/utilsRouter' -import { getWalletSignerAddress } from '@/store/createWalletSlice' import { _parseRouteAndIsActive, formatNumber, isLoading } from '@/ui/utils' -import { useConnectWallet } from '@/common/features/connect-wallet' +import { getWalletSignerAddress, useConnectWallet } from '@/common/features/connect-wallet' import { visibleNetworksList } from '@/networks' import useLayoutHeight from '@/hooks/useLayoutHeight' import useStore from '@/store/useStore' diff --git a/apps/loan/src/store/createWalletSlice.ts b/apps/loan/src/store/createWalletSlice.ts index 9b50d3148..14b783c05 100644 --- a/apps/loan/src/store/createWalletSlice.ts +++ b/apps/loan/src/store/createWalletSlice.ts @@ -124,8 +124,3 @@ export function getWalletChainId(wallet: Wallet | undefined | null) { const chainId = (wallet as Wallet).chains[0].id return ethers.BigNumber.from(chainId).toNumber() } - -export function getWalletSignerAddress(wallet: Wallet | undefined | null) { - if (!wallet) return '' - return wallet.accounts[0]?.address -} diff --git a/apps/loan/tsconfig.json b/apps/loan/tsconfig.json index 2ef54dbc7..97614edd7 100644 --- a/apps/loan/tsconfig.json +++ b/apps/loan/tsconfig.json @@ -19,5 +19,5 @@ } }, "exclude": ["node_modules", "cypress"], - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../../packages/curve-ui-kit/**/*.d.ts"] } diff --git a/apps/main/package.json b/apps/main/package.json index c74f49778..bf5c4c647 100644 --- a/apps/main/package.json +++ b/apps/main/package.json @@ -34,7 +34,7 @@ "curve-common": "*", "curve-lib": "*", "dayjs": "^1.11.7", - "ethers": "^6.9.0", + "ethers": "^6.11.0", "external-rewards": "*", "focus-visible": "5.2.0", "fuse.js": "^6.6.2", diff --git a/apps/main/src/hooks/usePageOnMount.ts b/apps/main/src/hooks/usePageOnMount.ts index b477d1d3b..32f27cbdb 100644 --- a/apps/main/src/hooks/usePageOnMount.ts +++ b/apps/main/src/hooks/usePageOnMount.ts @@ -4,13 +4,13 @@ import type { INetworkName } from '@curvefi/api/lib/interfaces' import { ethers } from 'ethers' import { useCallback, useEffect } from 'react' -import { useConnectWallet, useSetChain, useSetLocale } from '@/common/features/connect-wallet' +import { useConnectWallet, useSetChain, useSetLocale, getWalletSignerAddress } from '@/common/features/connect-wallet' import { CONNECT_STAGE, REFRESH_INTERVAL, ROUTE } from '@/constants' import { dynamicActivate, updateAppLocale } from '@/lib/i18n' import { getStorageValue, setStorageValue } from '@/utils/storage' import { getNetworkFromUrl, parseParams } from '@/utils/utilsRouter' -import { getWalletChainId, getWalletSignerAddress } from '@/store/createWalletSlice' +import { getWalletChainId } from '@/store/createWalletSlice' import { initCurveJs } from '@/utils/utilsCurvejs' import { isFailure, isLoading, isSuccess } from '@/ui/utils' import networks, { networksIdMapper } from '@/networks' @@ -59,7 +59,7 @@ function usePageOnMount(params: Params, location: Location, navigate: NavigateFu async (options: ConnectState['options']) => { if (options) { const [walletName] = options - let walletState: Wallet | null = null + let walletState: Wallet | null if (walletName) { // If found label in localstorage, after 30s if not connected, reconnect with modal diff --git a/apps/main/src/layout/default/Header.tsx b/apps/main/src/layout/default/Header.tsx index 95f8a5dc1..eb7f175d9 100644 --- a/apps/main/src/layout/default/Header.tsx +++ b/apps/main/src/layout/default/Header.tsx @@ -10,20 +10,19 @@ import { CONNECT_STAGE, ROUTE } from '@/constants' import { DEFAULT_LOCALES } from '@/lib/i18n' import { _parseRouteAndIsActive, FORMAT_OPTIONS, formatNumber, isLoading } from '@/ui/utils' import { getNetworkFromUrl, getParamsFromUrl, getRestFullPathname, getRestPartialPathname } from '@/utils/utilsRouter' -import { getWalletSignerAddress } from '@/store/createWalletSlice' -import { useConnectWallet } from '@/common/features/connect-wallet' +import { getWalletSignerAddress, useConnectWallet } from '@/common/features/connect-wallet' import networks, { visibleNetworksList } from '@/networks' import useLayoutHeight from '@/hooks/useLayoutHeight' import useStore from '@/store/useStore' import { APP_LINK, - APPS_LINKS, - AppNavMobile, - AppNavBarContent, AppNavBar, + AppNavBarContent, AppNavMenuSection, - AppSelectNetwork, + AppNavMobile, + APPS_LINKS, + AppSelectNetwork } from '@/ui/AppNav' import { CommunitySection, ResourcesSection } from '@/layout/default/Footer' import AppLogo from '@/ui/Brand' diff --git a/apps/main/src/store/createWalletSlice.ts b/apps/main/src/store/createWalletSlice.ts index 768b8129c..281e13a64 100644 --- a/apps/main/src/store/createWalletSlice.ts +++ b/apps/main/src/store/createWalletSlice.ts @@ -122,8 +122,3 @@ export function getWalletChainId(wallet: Wallet | undefined | null) { const chainId = wallet.chains[0].id return Number(BigInt(chainId).toString()) } - -export function getWalletSignerAddress(wallet: Wallet | undefined | null) { - if (!wallet) return '' - return wallet.accounts[0]?.address -} diff --git a/apps/main/tsconfig.json b/apps/main/tsconfig.json index 2ef54dbc7..97614edd7 100644 --- a/apps/main/tsconfig.json +++ b/apps/main/tsconfig.json @@ -19,5 +19,5 @@ } }, "exclude": ["node_modules", "cypress"], - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../../packages/curve-ui-kit/**/*.d.ts"] } diff --git a/packages/curve-common/package.json b/packages/curve-common/package.json index 8c448104f..b1e2e73fe 100644 --- a/packages/curve-common/package.json +++ b/packages/curve-common/package.json @@ -22,7 +22,8 @@ "@web3-onboard/torus": "^2.3.1", "@web3-onboard/trezor": "^2.4.6", "@web3-onboard/trust": "^2.1.2", - "@web3-onboard/walletconnect": "^2.6.1" + "@web3-onboard/walletconnect": "^2.6.1", + "ethers": "^6.11.0" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/packages/curve-common/src/features/connect-wallet/lib/index.ts b/packages/curve-common/src/features/connect-wallet/lib/index.ts index 84fb55433..e78e9691c 100644 --- a/packages/curve-common/src/features/connect-wallet/lib/index.ts +++ b/packages/curve-common/src/features/connect-wallet/lib/index.ts @@ -5,3 +5,4 @@ export { useSetLocale } from '@web3-onboard/react' export { initOnboard } from './init' +export { getWalletSignerAddress, getWalletChainId, getWalletProvider } from './utils/wallet-helpers' diff --git a/packages/curve-common/src/features/connect-wallet/lib/utils/wallet-helpers.ts b/packages/curve-common/src/features/connect-wallet/lib/utils/wallet-helpers.ts new file mode 100644 index 000000000..609b6c3f8 --- /dev/null +++ b/packages/curve-common/src/features/connect-wallet/lib/utils/wallet-helpers.ts @@ -0,0 +1,14 @@ +import type { WalletState as Wallet } from '@web3-onboard/core/dist/types' +import { BrowserProvider } from 'ethers' +import { Address } from 'curve-ui-kit/src/shared/ui/AddressLabel' + +export const getWalletProvider = (wallet: Wallet) => new BrowserProvider(wallet.provider) + +export function getWalletChainId(wallet: Wallet | undefined | null) { + if (!wallet) return null + const chainId = wallet.chains[0].id + return Number(BigInt(chainId).toString()) +} + +export const getWalletSignerAddress = (wallet: Wallet | undefined | null): Address | undefined => + wallet?.accounts[0]?.address diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx similarity index 60% rename from packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx rename to packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx index 7f1a05f48..f9fe6c80a 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectWallet.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx @@ -1,14 +1,15 @@ import React, { FunctionComponent } from 'react' import { ConnectWalletButton } from './ConnectWalletButton' import { ConnectedWalletLabel } from './ConnectedWalletLabel' +import { Address } from 'curve-ui-kit/src/shared/ui/AddressLabel' -export type ConnectWalletProps = { - walletAddress?: string +export type ConnectWalletIndicatorProps = { + walletAddress?: Address onConnectWallet: () => void onDisconnectWallet: () => void } -export const ConnectWallet: FunctionComponent = ({ walletAddress, onConnectWallet, onDisconnectWallet }) => +export const ConnectWalletIndicator: FunctionComponent = ({ walletAddress, onConnectWallet, onDisconnectWallet }) => walletAddress ? ( ) : ( diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx index c45bf95d6..0e84522f3 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx @@ -1,9 +1,9 @@ import { FunctionComponent } from 'react' import { Button } from 'curve-ui-kit/src/shared/ui/Button' -import { AddressLabel } from 'curve-ui-kit/src/shared/ui/AddressLabel' +import { Address, AddressLabel } from 'curve-ui-kit/src/shared/ui/AddressLabel' interface ConnectedWalletLabelProps { - walletAddress: string, + walletAddress: Address, onDisconnectWallet: () => void } diff --git a/packages/curve-common/src/features/connect-wallet/ui/index.ts b/packages/curve-common/src/features/connect-wallet/ui/index.ts index b6a7342a9..792f92325 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/index.ts +++ b/packages/curve-common/src/features/connect-wallet/ui/index.ts @@ -1,3 +1,3 @@ export * from './ConnectWalletButton' -export * from './ConnectWallet' +export * from './ConnectWalletIndicator' export * from './ConnectedWalletLabel' diff --git a/packages/curve-common/tsconfig.json b/packages/curve-common/tsconfig.json index ca8a2a1a9..516fc63ec 100644 --- a/packages/curve-common/tsconfig.json +++ b/packages/curve-common/tsconfig.json @@ -11,7 +11,8 @@ "strict": true, "paths": { "@/*": ["*"], - "@/shared/ui/*": ["../../../packages/curve-common/src/shared/ui/*"] + "@/shared/ui/*": ["../../../packages/curve-common/src/shared/ui/*"], + "@/common/*": ["../../../packages/curve-common/src/*"] } }, "include": ["src", "global.d.ts", "../curve-ui-kit/**/*.d.ts"], diff --git a/packages/curve-lib/tsconfig.json b/packages/curve-lib/tsconfig.json index 4acfe98b9..9d47a0d42 100644 --- a/packages/curve-lib/tsconfig.json +++ b/packages/curve-lib/tsconfig.json @@ -6,6 +6,6 @@ "@/*": ["*"] } }, - "include": ["src"], + "include": ["src", "../curve-ui-kit/**/*.d.ts"], "exclude": ["dist", "build", "node_modules"] } diff --git a/packages/curve-ui-kit/src/shared/api/index.ts b/packages/curve-ui-kit/src/shared/api/index.ts new file mode 100644 index 000000000..b19bf5571 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/api/index.ts @@ -0,0 +1 @@ +export * from './figma-tokens' \ No newline at end of file diff --git a/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts b/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts index 0dfdc82fa..564168d8f 100644 --- a/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts +++ b/packages/curve-ui-kit/src/shared/lib/basic-theme/config.ts @@ -1,4 +1,4 @@ -import { FontFamilyBasic, FontFamilyChad } from '../../ui/Typography/variants/config' +import { FontFamilyBasic, FontFamilyChad } from '../../ui/Typography' import type { ThemeKey } from './theme.types' export const ThemeFontFamily: Record = { diff --git a/packages/curve-ui-kit/src/shared/lib/index.ts b/packages/curve-ui-kit/src/shared/lib/index.ts new file mode 100644 index 000000000..3f784dc94 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/lib/index.ts @@ -0,0 +1,3 @@ +export * from './capitalize' +export * from './object-properties' +export * from './basic-theme' diff --git a/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx b/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx index 5271fb2b6..abefa79ff 100644 --- a/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx +++ b/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx @@ -1,7 +1,7 @@ import { FunctionComponent } from 'react' import { Box } from './Box' -type Address = `0x${string}` +export type Address = `0x${string}` export type AddressLabelProps = { value: Address; diff --git a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts index 87f04c164..9c7c176e8 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts @@ -1,7 +1,6 @@ import type { Components, CSSObject } from '@mui/material/styles' -import { type FigmaTokens, extractNumber } from '../../api/figma-tokens' -import { basicMuiTheme, type ThemeKey } from '../../lib/basic-theme' -import { omitProperty } from '../../lib/object-properties' +import { extractNumber, type FigmaTokens } from '../../api' +import { basicMuiTheme, omitProperty, type ThemeKey } from '../../lib' export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey): Components['MuiButton'] => { const buttonDesktop = figmaTokens.themes.desktop[mode].button diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx b/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx index f544c53a2..396d4c50b 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx +++ b/packages/curve-ui-kit/src/shared/ui/Typography/stories/Typography.stories.tsx @@ -1,6 +1,6 @@ import { Divider, Stack } from '@mui/material' import type { Meta, StoryObj } from '@storybook/react' -import { figmaTokens } from '../../../api/figma-tokens' +import { figmaTokens } from '../../../api' import { Typography } from '../Typography' import { typographyVariantsKeys, TypographyVariantKey } from '../variants' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts index 6208c558c..09797f75f 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts @@ -1,4 +1,4 @@ -import type { FigmaTypography, FigmaTypographyToken } from '../../../api/figma-tokens' +import type { FigmaTypography, FigmaTypographyToken } from '../../../api' import { capitalizeFirstLetter, capitalizeSpecificWords } from '../../../lib/capitalize' import type { NonTableTypographyVariantKey, TableTypographyVariantKey, TypographyVariantKey } from './config' diff --git a/packages/ui/src/AppNav/types.ts b/packages/ui/src/AppNav/types.ts index 031152e55..eac77fbb9 100644 --- a/packages/ui/src/AppNav/types.ts +++ b/packages/ui/src/AppNav/types.ts @@ -3,6 +3,7 @@ import type { ConnectState } from 'ui/src/utils' import type { ThemeType } from 'ui/src/Select/SelectThemes' import React from 'react' +import { Address } from 'curve-ui-kit/src/shared/ui/AddressLabel' export type PageWidth = | 'page-wide' @@ -22,7 +23,7 @@ export type AppNavAdvancedMode = { export type AppNavConnect = { connectState: ConnectState - walletSignerAddress: string + walletSignerAddress: Address | undefined handleClick: () => void } diff --git a/packages/ui/src/Button/ConnectWallet.tsx b/packages/ui/src/Button/ConnectWallet.tsx index ac135952f..472d5d9db 100644 --- a/packages/ui/src/Button/ConnectWallet.tsx +++ b/packages/ui/src/Button/ConnectWallet.tsx @@ -7,6 +7,7 @@ import * as React from 'react' import { isLoading, isSuccess, shortenAccount } from 'ui/src/utils' import Button from 'ui/src/Button/index' +import { Address } from 'curve-ui-kit/src/shared/ui/AddressLabel' type Status = 'success' | 'loading' | '' @@ -21,7 +22,7 @@ function ConnectWallet({ className?: string testId?: string connectState: ConnectState - walletSignerAddress: string + walletSignerAddress: Address | undefined handleClick: () => void }) { const loading = diff --git a/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx b/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx index fbd5bc00b..ebc722553 100644 --- a/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx +++ b/packages/ui/src/FormErrorsDisplay/FormErrorsDisplay.tsx @@ -1,4 +1,4 @@ -import { ErrorContainer } from '@/styled-containers' +import { ErrorContainer } from '../styled-containers' import { ErrorMessage } from '@hookform/error-message' import { FunctionComponent, useCallback, useMemo } from 'react' import { useFormContext } from 'react-hook-form' diff --git a/packages/ui/src/skeleton/BlockSkeleton.tsx b/packages/ui/src/skeleton/BlockSkeleton.tsx index 543ce2a41..8d1f5d090 100644 --- a/packages/ui/src/skeleton/BlockSkeleton.tsx +++ b/packages/ui/src/skeleton/BlockSkeleton.tsx @@ -1,6 +1,6 @@ import React from 'react' -import { LoaderWrapper } from '@/skeleton/styled' -import Loader from '@/Loader' +import { LoaderWrapper } from './styled' +import Loader from '../Loader' export const BlockSkeleton: React.FC<{ height?: number diff --git a/tests/package.json b/tests/package.json index e95d24182..9c6fddc69 100644 --- a/tests/package.json +++ b/tests/package.json @@ -23,7 +23,7 @@ "chai-bigint": "^0.2.0", "cypress": "^13.9.0", "dotenv-flow": "^4.1.0", - "ethers": "^6.12.1", + "ethers": "^6.11.0", "hardhat": "^2.22.10", "tsconfig": "*", "wait-on": "^7.2.0" diff --git a/yarn.lock b/yarn.lock index 55fcaf403..f95124a86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10580,6 +10580,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:22.7.5": + version: 22.7.5 + resolution: "@types/node@npm:22.7.5" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10c0/cf11f74f1a26053ec58066616e3a8685b6bcd7259bc569738b8f752009f9f0f7f85a1b2d24908e5b0f752482d1e8b6babdf1fbb25758711ec7bb9500bfcd6e60 + languageName: node + linkType: hard + "@types/node@npm:^12.12.54": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -15054,6 +15063,7 @@ __metadata: "@web3-onboard/trezor": "npm:^2.4.6" "@web3-onboard/trust": "npm:^2.1.2" "@web3-onboard/walletconnect": "npm:^2.6.1" + ethers: "npm:^6.11.0" peerDependencies: react: "*" react-dom: "*" @@ -17503,33 +17513,18 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^6.12.1": - version: 6.12.1 - resolution: "ethers@npm:6.12.1" - dependencies: - "@adraffy/ens-normalize": "npm:1.10.1" - "@noble/curves": "npm:1.2.0" - "@noble/hashes": "npm:1.3.2" - "@types/node": "npm:18.15.13" - aes-js: "npm:4.0.0-beta.5" - tslib: "npm:2.4.0" - ws: "npm:8.5.0" - checksum: 10c0/7686e1efdb0a831578f35d69188783c225de5a6fbb1b422327bc45cee04d49a2707e73c9342a6a5eb2870ce35668c71372737439ec3993d31d83f4a0e2446cc7 - languageName: node - linkType: hard - "ethers@npm:^6.9.0": - version: 6.9.0 - resolution: "ethers@npm:6.9.0" + version: 6.13.4 + resolution: "ethers@npm:6.13.4" dependencies: - "@adraffy/ens-normalize": "npm:1.10.0" + "@adraffy/ens-normalize": "npm:1.10.1" "@noble/curves": "npm:1.2.0" "@noble/hashes": "npm:1.3.2" - "@types/node": "npm:18.15.13" + "@types/node": "npm:22.7.5" aes-js: "npm:4.0.0-beta.5" - tslib: "npm:2.4.0" - ws: "npm:8.5.0" - checksum: 10c0/d5ff036b3749549b8d5470d9c972c4713a7ad399eeb65ac6aa59d060f2429407dd80621913550314dcbb25e8a05cf1ce76186d24058ffc8d18ac034093539e81 + tslib: "npm:2.7.0" + ws: "npm:8.17.1" + checksum: 10c0/efcf9f39f841e38af68ec23cdbd745432c239c256aac4929842d1af04e55d7be0ff65e462f1cf3e93586f43f7bdcc0098fd56f2f7234f36d73e466521a5766ce languageName: node linkType: hard @@ -20608,7 +20603,7 @@ __metadata: curve-lib: "npm:*" dayjs: "npm:^1.11.7" eslint-config-custom: "npm:*" - ethers: "npm:^6.10.0" + ethers: "npm:^6.11.0" external-rewards: "npm:*" focus-visible: "npm:5.2.0" fuse.js: "npm:^6.6.2" @@ -26310,7 +26305,7 @@ __metadata: chai-bigint: "npm:^0.2.0" cypress: "npm:^13.9.0" dotenv-flow: "npm:^4.1.0" - ethers: "npm:^6.12.1" + ethers: "npm:^6.11.0" hardhat: "npm:^2.22.10" tsconfig: "npm:*" wait-on: "npm:^7.2.0" @@ -26588,7 +26583,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1": +"tslib@npm:2.7.0, tslib@npm:^2.0.0, tslib@npm:^2.0.1": version: 2.7.0 resolution: "tslib@npm:2.7.0" checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 From eaeb67b5604b8223622f5eec89fc7d6049070b25 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 29 Oct 2024 15:19:55 +0100 Subject: [PATCH 045/137] fix: fonts --- apps/lend/src/pages/_app.tsx | 27 ++++++++++--------- .../connect-wallet/ui/ConnectWalletButton.tsx | 2 +- .../ui/ConnectedWalletLabel.tsx | 2 +- packages/curve-common/tsconfig.json | 1 - .../curve-ui-kit/.storybook/preview-head.html | 17 ------------ packages/curve-ui-kit/.storybook/preview.tsx | 26 +++++++++++++++++- .../src/entities/themes/model/components.ts | 2 -- .../src/shared/ui/AddressLabel.tsx | 2 +- .../src/shared/ui/CssBaseline/index.ts | 1 - .../shared/ui/CssBaseline/muiCssBaseline.ts | 24 ----------------- .../src/shared/ui/ThemeProvider.tsx | 21 +++++++++++++++ .../shared/ui/Typography/variants/config.ts | 5 ++-- .../shared/ui/Typography/variants/fonts.ts | 11 ++++++++ .../shared/ui/Typography/variants/index.ts | 1 + .../Typography/variants/resolve-typography.ts | 10 +++++-- 15 files changed, 87 insertions(+), 65 deletions(-) delete mode 100644 packages/curve-ui-kit/.storybook/preview-head.html delete mode 100644 packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts delete mode 100644 packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts create mode 100644 packages/curve-ui-kit/src/shared/ui/ThemeProvider.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/Typography/variants/fonts.ts diff --git a/apps/lend/src/pages/_app.tsx b/apps/lend/src/pages/_app.tsx index 64e926c53..63dbba1d6 100644 --- a/apps/lend/src/pages/_app.tsx +++ b/apps/lend/src/pages/_app.tsx @@ -21,6 +21,7 @@ import { QueryProvider } from '@/ui/QueryProvider' import { isMobile, removeExtraSpaces } from '@/utils/helpers' import { getLocaleFromUrl } from '@/utils/utilsRouter' import { getStorageValue } from '@/utils/utilsStorage' +import { ThemeProvider } from 'curve-ui-kit/src/shared/ui/ThemeProvider' i18n.load({ en: messagesEn }) i18n.activate('en') @@ -102,18 +103,20 @@ function CurveApp({ Component }: AppProps) { return (
{typeof window === 'undefined' || !appLoaded ? null : ( - - - - - - - - - - - - + + + + + + + + + + + + + + )}
) diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx index 8c27ba44b..e4dff5fb6 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx @@ -6,4 +6,4 @@ interface ConnectWalletButtonProps { } export const ConnectWalletButton = ({ onConnectWallet }: ConnectWalletButtonProps) => - + diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx index 0e84522f3..310b5cfda 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx @@ -11,7 +11,7 @@ export const ConnectedWalletLabel: FunctionComponent walletAddress, onDisconnectWallet }) => ( - ) diff --git a/packages/curve-common/tsconfig.json b/packages/curve-common/tsconfig.json index 516fc63ec..b1f97d6a1 100644 --- a/packages/curve-common/tsconfig.json +++ b/packages/curve-common/tsconfig.json @@ -11,7 +11,6 @@ "strict": true, "paths": { "@/*": ["*"], - "@/shared/ui/*": ["../../../packages/curve-common/src/shared/ui/*"], "@/common/*": ["../../../packages/curve-common/src/*"] } }, diff --git a/packages/curve-ui-kit/.storybook/preview-head.html b/packages/curve-ui-kit/.storybook/preview-head.html deleted file mode 100644 index 8361eea70..000000000 --- a/packages/curve-ui-kit/.storybook/preview-head.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/packages/curve-ui-kit/.storybook/preview.tsx b/packages/curve-ui-kit/.storybook/preview.tsx index b4f80970b..49a6aa486 100644 --- a/packages/curve-ui-kit/.storybook/preview.tsx +++ b/packages/curve-ui-kit/.storybook/preview.tsx @@ -1,8 +1,8 @@ import { CssBaseline, ThemeProvider } from '@mui/material' import { withThemeFromJSXProvider } from '@storybook/addon-themes' import type { Decorator, Preview, ReactRenderer } from '@storybook/react' - import { chadTheme, darkTheme, lightTheme } from '../src/entities/themes' +import { hubotSans, monaSans } from '../src/shared/ui/Typography' export const decorators: Decorator[] = [ withThemeFromJSXProvider({ @@ -15,6 +15,30 @@ export const decorators: Decorator[] = [ Provider: ThemeProvider, GlobalStyles: CssBaseline, }), + (Story) => ( + <> + + + + ) ] const preview: Preview = { diff --git a/packages/curve-ui-kit/src/entities/themes/model/components.ts b/packages/curve-ui-kit/src/entities/themes/model/components.ts index 41dc64d46..2dab7a6c7 100644 --- a/packages/curve-ui-kit/src/entities/themes/model/components.ts +++ b/packages/curve-ui-kit/src/entities/themes/model/components.ts @@ -2,11 +2,9 @@ import { type ThemeOptions } from '@mui/material/styles' import { figmaTokens } from '../../../shared/api/figma-tokens' import type { ThemeKey } from '../../../shared/lib/basic-theme' import { defineMuiButton } from '../../../shared/ui/Button' -import { defineMuiCssBaseline } from '../../../shared/ui/CssBaseline' import { defineMuiTypography } from '../../../shared/ui/Typography' export const createComponents = (mode: ThemeKey): ThemeOptions['components'] => ({ MuiTypography: defineMuiTypography(), - MuiCssBaseline: defineMuiCssBaseline(), MuiButton: defineMuiButton(figmaTokens, mode), }) diff --git a/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx b/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx index abefa79ff..527bf14a6 100644 --- a/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx +++ b/packages/curve-ui-kit/src/shared/ui/AddressLabel.tsx @@ -9,6 +9,6 @@ export type AddressLabelProps = { export const AddressLabel: FunctionComponent = ({value}) => ( - {value.substring(0, 7)}...{value.substring(38)} + {value.substring(0, 6)}...{value.substring(38)} ) diff --git a/packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts b/packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts deleted file mode 100644 index 6ba52d3f1..000000000 --- a/packages/curve-ui-kit/src/shared/ui/CssBaseline/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { defineMuiCssBaseline } from './muiCssBaseline' diff --git a/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts b/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts deleted file mode 100644 index dc27aefec..000000000 --- a/packages/curve-ui-kit/src/shared/ui/CssBaseline/muiCssBaseline.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Components } from '@mui/material/styles' - -export const defineMuiCssBaseline = (): Components['MuiCssBaseline'] => { - return { - styleOverrides: ` - @font-face { - font-family: 'Mona Sans'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: local('Mona Sans'), local('MonaSans-Regular'), url('fonts/Mona-Sans.woff2') format('woff2'); - unicodeRange: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF; - } - @font-face { - font-family: 'Hubot Sans'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: local('Hubot Sans'), local('HubotSans-Regular'), url('fonts/Hubot-Sans.woff2') format('woff2'); - unicodeRange: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF; - } - `, - } -} diff --git a/packages/curve-ui-kit/src/shared/ui/ThemeProvider.tsx b/packages/curve-ui-kit/src/shared/ui/ThemeProvider.tsx new file mode 100644 index 000000000..e159f3fc5 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/ThemeProvider.tsx @@ -0,0 +1,21 @@ +export type * from '@mui/system/ThemeProvider'; +import MuiThemeProvider from '@mui/system/ThemeProvider' +import { FunctionComponent, ReactNode } from 'react' +import { chadTheme, darkTheme, lightTheme } from '../../entities/themes' + +const themes = { + light: lightTheme, + dark: darkTheme, + chad: chadTheme, +} + +type ThemeProviderProps = { + theme: keyof typeof themes + children: ReactNode +} + +export const ThemeProvider: FunctionComponent = ({theme, children}) => ( + + {children} + +) diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts index 3719dd5bc..838c7f8c6 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/config.ts @@ -1,4 +1,5 @@ import type { TypographyOptions } from '@mui/material/styles/createTypography' +import { hubotSans, monaSans } from './fonts' const headingVariantKeys = [ 'headingXxl', @@ -82,9 +83,9 @@ export type TableTypographyVariantKey = Extract -export const FontFamilyBasic = ['"Mona Sans"', '"Helvetica Neue"', 'sans-serif'].join(',') +export const FontFamilyBasic = [monaSans.style.fontFamily, '"Helvetica Neue"', 'sans-serif'].join(',') export const FontFamilyChad = [ - '"Hubot Sans"', + hubotSans.style.fontFamily, '"Helvetica Neue"', 'sans-serif', 'Minecraft', diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/fonts.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/fonts.ts new file mode 100644 index 000000000..d5b6c84af --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/fonts.ts @@ -0,0 +1,11 @@ +import localFont from 'next/font/local' + +export const monaSans = localFont({ + src: '../../../../../public/fonts/Mona-Sans.woff2', + // variable: '--font-mona-sans' +}) + +export const hubotSans = localFont({ + src: '../../../../../public/fonts/Hubot-Sans.woff2', + variable: '--font-hubot-sans' +}) diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts index 93842781b..781712023 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/index.ts @@ -1,2 +1,3 @@ export * from './resolve-typography' export * from './config' +export { monaSans, hubotSans } from './fonts' diff --git a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts index 09797f75f..11f45fc50 100644 --- a/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts +++ b/packages/curve-ui-kit/src/shared/ui/Typography/variants/resolve-typography.ts @@ -1,6 +1,11 @@ import type { FigmaTypography, FigmaTypographyToken } from '../../../api' import { capitalizeFirstLetter, capitalizeSpecificWords } from '../../../lib/capitalize' -import type { NonTableTypographyVariantKey, TableTypographyVariantKey, TypographyVariantKey } from './config' +import { + NonTableTypographyVariantKey, + TableTypographyVariantKey, + TypographyVariantKey +} from './config' +import { hubotSans, monaSans } from './fonts' /** * List of words that should be capitalized in typography variant keys. @@ -30,6 +35,7 @@ function transformTypographyToken(token: FigmaTypographyToken): React.CSSPropert description, } = token + const fontFamily1 = { 'Mona Sans': monaSans, 'Hubot Sans': hubotSans}[fontFamily]!.style.fontFamily return { description, fontSize: `${fontSize}px`, @@ -39,7 +45,7 @@ function transformTypographyToken(token: FigmaTypographyToken): React.CSSPropert letterSpacing: `${letterSpacing}px`, lineHeight: `${lineHeight}px`, textDecoration, - fontFamily, + fontFamily: `${fontFamily1}`, textIndent: paragraphIndent, textTransform: textCase, // We're not using paragraphSpacing here, as it's not a valid CSS property. From 27fcc1f4edad9655d25892d3f8849ef2ebd0d779 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 29 Oct 2024 15:21:43 +0100 Subject: [PATCH 046/137] fix: Update lock file --- yarn.lock | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/yarn.lock b/yarn.lock index f95124a86..7fea1f0dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10580,15 +10580,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.7.5": - version: 22.7.5 - resolution: "@types/node@npm:22.7.5" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/cf11f74f1a26053ec58066616e3a8685b6bcd7259bc569738b8f752009f9f0f7f85a1b2d24908e5b0f752482d1e8b6babdf1fbb25758711ec7bb9500bfcd6e60 - languageName: node - linkType: hard - "@types/node@npm:^12.12.54": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -17513,21 +17504,6 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^6.9.0": - version: 6.13.4 - resolution: "ethers@npm:6.13.4" - dependencies: - "@adraffy/ens-normalize": "npm:1.10.1" - "@noble/curves": "npm:1.2.0" - "@noble/hashes": "npm:1.3.2" - "@types/node": "npm:22.7.5" - aes-js: "npm:4.0.0-beta.5" - tslib: "npm:2.7.0" - ws: "npm:8.17.1" - checksum: 10c0/efcf9f39f841e38af68ec23cdbd745432c239c256aac4929842d1af04e55d7be0ff65e462f1cf3e93586f43f7bdcc0098fd56f2f7234f36d73e466521a5766ce - languageName: node - linkType: hard - "ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.6": version: 0.1.6 resolution: "ethjs-util@npm:0.1.6" @@ -21307,7 +21283,7 @@ __metadata: curve-lib: "npm:*" dayjs: "npm:^1.11.7" eslint-config-custom: "npm:*" - ethers: "npm:^6.9.0" + ethers: "npm:^6.11.0" external-rewards: "npm:*" focus-visible: "npm:5.2.0" fuse.js: "npm:^6.6.2" @@ -26583,7 +26559,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.7.0, tslib@npm:^2.0.0, tslib@npm:^2.0.1": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1": version: 2.7.0 resolution: "tslib@npm:2.7.0" checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 From 05c51436edd41b595137c407f6f87fcb529befbe Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Tue, 29 Oct 2024 18:08:29 +0100 Subject: [PATCH 047/137] feat: chain/language selectors --- apps/lend/src/layout/Header.tsx | 44 ++++++-------- apps/lend/src/lib/i18n.ts | 31 +++++----- apps/lend/tsconfig.json | 1 + .../connect-wallet/ui/ConnectWalletButton.tsx | 7 ++- .../ui/ConnectWalletIndicator.tsx | 7 ++- .../ui/ConnectedWalletLabel.tsx | 8 ++- .../switch-chain/ui/ChainSwitcher.tsx | 58 +++++++++++-------- .../switch-language/ui/LanguageSwitcher.tsx | 52 ++++++++--------- packages/curve-common/tsconfig.json | 1 + packages/ui/src/AppNav/AppNavMobile.tsx | 12 ++-- 10 files changed, 115 insertions(+), 106 deletions(-) diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index ac605dae8..8a7732f1b 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -15,19 +15,14 @@ import { useHeightResizeObserver } from '@/ui/hooks' import networks, { visibleNetworksList } from '@/networks' import useStore from '@/store/useStore' -import { - APP_LINK, - AppNavBar, - AppNavBarContent, - AppNavMenuSection, - AppNavMobile, - APPS_LINKS, - AppSelectNetwork -} from '@/ui/AppNav' +import { APP_LINK, AppNavBar, AppNavBarContent, AppNavMenuSection, AppNavMobile, APPS_LINKS } from '@/ui/AppNav' import { CommunitySection, ResourcesSection } from '@/layout/Footer' import AppNavPages from '@/ui/AppNav/AppNavPages' import HeaderSecondary from '@/layout/HeaderSecondary' import { useTvl } from '@/entities/chain' +import { ChainSwitcher } from '@/common/features/switch-chain' +import { LanguageSwitcher } from '@/common/features/switch-language' +import { Box } from '@ui-kit/shared/ui/Box' const Header = () => { @@ -37,7 +32,7 @@ const Header = () => { const params = useParams() const elHeight = useHeightResizeObserver(mainNavRef) - const { rChainId, rNetworkIdx, rLocalePathname } = getParamsFromUrl() + const { rChainId, rLocalePathname } = getParamsFromUrl() const connectState = useStore((state) => state.connectState) const isAdvanceMode = useStore((state) => state.isAdvanceMode) @@ -86,7 +81,7 @@ const Header = () => { return `#${rLocalePathname}/${networkName}${route}` } - const handleNetworkChange = (selectedChainId: React.Key) => { + const handleNetworkChange = (selectedChainId: ChainId) => { if (rChainId !== selectedChainId) { const network = networks[selectedChainId as ChainId].id const [currPath] = window.location.hash.split('?') @@ -107,16 +102,12 @@ const Header = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [elHeight]) - const SelectNetworkComp = ( - ) @@ -138,7 +129,7 @@ const Header = () => { } const appNavLocale = - process.env.NODE_ENV === 'development' + DEFAULT_LOCALES.length > 1 ? { locale, locales: DEFAULT_LOCALES, @@ -162,7 +153,6 @@ const Header = () => { advancedMode={appNavAdvancedMode} appsLinks={APPS_LINKS} appStats={[{ label: 'TVL', value: tvl && formatNumber(tvl, { ...FORMAT_OPTIONS.USD, showDecimalIfSmallNumberOnly: true }) || '' }]} - locale={appNavLocale} theme={appNavTheme} /> )} @@ -176,11 +166,15 @@ const Header = () => {
- {SelectNetworkComp} + {appNavLocale && ( + + )} + {selectNetworkComp} @@ -206,7 +200,7 @@ const Header = () => { { id: 'community', title: t`Community`, comp: }, { id: 'resources', title: t`Resources`, comp: }, ]} - selectNetwork={SelectNetworkComp} + selectNetwork={selectNetworkComp} stats={[]} theme={appNavTheme} /> diff --git a/apps/lend/src/lib/i18n.ts b/apps/lend/src/lib/i18n.ts index dc505fd2e..7e22eb92c 100644 --- a/apps/lend/src/lib/i18n.ts +++ b/apps/lend/src/lib/i18n.ts @@ -10,15 +10,16 @@ export type Locale = { lang: string } -export const DEFAULT_LOCALES: Locale[] = [{ name: 'English', value: 'en', lang: 'en' }] - -if (process.env.NODE_ENV === 'development') { - ;[ - { name: '简体中文', value: 'zh-Hans' as const, lang: 'zh-Hans' }, - { name: '繁體中文', value: 'zh-Hant' as const, lang: 'zh-Hant' }, - { name: 'pseudo', value: 'pseudo' as const, lang: 'en' }, - ].map((l) => DEFAULT_LOCALES.push(l)) -} +export const DEFAULT_LOCALES: Locale[] = [ + { name: 'English', value: 'en', lang: 'en' }, + ...( + process.env.NODE_ENV === 'development' ? [ + { name: '简体中文', value: 'zh-Hans' as const, lang: 'zh-Hans' }, + { name: '繁體中文', value: 'zh-Hant' as const, lang: 'zh-Hant' }, + { name: 'pseudo', value: 'pseudo' as const, lang: 'en' }, + ] : [] + ) +] export function initTranslation(i18n: I18n, defaultLocale: string): void { i18n.loadLocaleData({ @@ -31,13 +32,11 @@ export function initTranslation(i18n: I18n, defaultLocale: string): void { i18n.activate(defaultLocale) } -export function findLocale(selectedLocale: string) { - return DEFAULT_LOCALES.find((l) => { - // backward compatibility for 'zh' - const parsedLocale = selectedLocale.toLowerCase() === 'zh' ? 'zh-hant' : selectedLocale.toLowerCase() - return l.value.toLowerCase() === parsedLocale - }) -} +export const findLocale = (selectedLocale: string) => DEFAULT_LOCALES.find((l) => { + // backward compatibility for 'zh' + const parsedLocale = selectedLocale.toLowerCase() === 'zh' ? 'zh-hant' : selectedLocale.toLowerCase() + return l.value.toLowerCase() === parsedLocale +}) export function parseLocale(locale?: string): { parsedLocale: Locale['value']; pathnameLocale: string } { if (!locale) return { parsedLocale: 'en', pathnameLocale: '' } diff --git a/apps/lend/tsconfig.json b/apps/lend/tsconfig.json index 97614edd7..e6510e7f9 100644 --- a/apps/lend/tsconfig.json +++ b/apps/lend/tsconfig.json @@ -4,6 +4,7 @@ "baseUrl": "./src", "paths": { "@/*": ["*"], + "@ui-kit/*": ["../../../packages/curve-ui-kit/src/*"], "@/ui": ["../../../packages/ui/src/index.ts"], "@/shared/ui/*": ["../../../packages/ui/src/shared/ui/*"], "@/ui/*": ["../../../packages/ui/src/*"], diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx index e4dff5fb6..d9001fb73 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletButton.tsx @@ -3,7 +3,10 @@ import { t } from '@lingui/macro' interface ConnectWalletButtonProps { onConnectWallet?: () => void + disabled?: boolean } -export const ConnectWalletButton = ({ onConnectWallet }: ConnectWalletButtonProps) => - +export const ConnectWalletButton = ({ onConnectWallet, disabled }: ConnectWalletButtonProps) => + diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx index f9fe6c80a..064d1050c 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx @@ -7,11 +7,12 @@ export type ConnectWalletIndicatorProps = { walletAddress?: Address onConnectWallet: () => void onDisconnectWallet: () => void + disabled?: boolean } -export const ConnectWalletIndicator: FunctionComponent = ({ walletAddress, onConnectWallet, onDisconnectWallet }) => +export const ConnectWalletIndicator: FunctionComponent = ({ walletAddress, onConnectWallet, onDisconnectWallet, disabled }) => walletAddress ? ( - + ) : ( - + ) diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx index 310b5cfda..9e45fc340 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx @@ -5,13 +5,15 @@ import { Address, AddressLabel } from 'curve-ui-kit/src/shared/ui/AddressLabel' interface ConnectedWalletLabelProps { walletAddress: Address, onDisconnectWallet: () => void + disabled?: boolean } export const ConnectedWalletLabel: FunctionComponent = ({ - walletAddress, - onDisconnectWallet + walletAddress, + onDisconnectWallet, + disabled }) => ( - ) diff --git a/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx b/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx index 6768a62a8..15233bbc2 100644 --- a/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx +++ b/packages/curve-common/src/features/switch-chain/ui/ChainSwitcher.tsx @@ -1,42 +1,54 @@ -import { InputLabel } from '@/common/shared/ui/InputLabel' -import { Select } from '@/common/shared/ui/Select' -import { FormControl } from '@/common/shared/ui/FormControl' -import { MenuItem } from '@/common/shared/ui/MenuItem' -import { useCallback } from 'react' +import { Select } from '@ui-kit/shared/ui/Select' +import { MenuItem } from '@ui-kit/shared/ui/MenuItem' +import { FunctionComponent, SVGProps, useCallback, useMemo } from 'react' import { SelectChangeEvent } from '@mui/material/Select/SelectInput' +import { Typography } from 'curve-ui-kit/src/shared/ui/Typography' + +export type IconType = FunctionComponent> export type ChainOption = { - id: TChainId - name: string - icon: string + chainId: TChainId + label: string + icon: IconType } export type ChainSwitcherProps = { chainId: TChainId; - chainOptions: ChainOption[] + options: ChainOption[] onChange: (chainId: TChainId) => void + disabled?: boolean } -export const ChainSwitcher = ({ chainOptions, chainId, onChange }: ChainSwitcherProps) => - ( - - Chain +export const ChainSwitcher = ({ options, chainId, onChange, disabled }: ChainSwitcherProps) => { + const networkIcons = useMemo(() => options.reduce((acc, option) => ({ ...acc, [option.chainId]: option.icon }), {} as Record), [options]) + + const renderChainIcon = useCallback((value: TChainId) => { + const Icon = networkIcons[value] + return + }, [networkIcons]) + + const onValueChange = useCallback((v: SelectChangeEvent) => onChange(v.target.value as TChainId), [onChange]) + + return ( - labelId="chain-switcher-label" - id="chain-switcher" - value={chainId} - label="Chain" - onChange={useCallback((v: SelectChangeEvent) => onChange(v.target.value as TChainId), [onChange])} + value={[-1, 0].includes(chainId) ? 1 : chainId} + onChange={onValueChange} variant="standard" + disabled={disabled} + renderValue={renderChainIcon} + size="small" + sx={{padding:0}} > { - chainOptions.map((chainOption) => ( - - {chainOption.icon} - {chainOption.name} + options.map(({ chainId: id, icon: Icon, label }) => ( + + + + {label} + )) } - ) +} diff --git a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx index f142318e1..15e23715e 100644 --- a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx +++ b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx @@ -1,12 +1,13 @@ -import { InputLabel } from '@/common/shared/ui/InputLabel' -import { Select } from '@/common/shared/ui/Select' -import { FormControl } from '@/common/shared/ui/FormControl' -import { MenuItem } from '@/common/shared/ui/MenuItem' +import { Select } from '@ui-kit/shared/ui/Select' +import { MenuItem } from '@ui-kit/shared/ui/MenuItem' + import { useCallback } from 'react' import { SelectChangeEvent } from '@mui/material/Select/SelectInput' +import { Typography } from 'curve-ui-kit/src/shared/ui/Typography' export type LanguageOption = { - code: string + value: string + lang: string name: string } @@ -16,25 +17,22 @@ export type LanguageSwitcherProps = { onChange: (languageCode: string) => void } -export const LanguageSwitcher = ({ languageOptions, languageCode, onChange }: LanguageSwitcherProps) => - ( - - Language - - - ) +export const LanguageSwitcher = ({ languageOptions, languageCode, onChange }: LanguageSwitcherProps) => ( + +) diff --git a/packages/curve-common/tsconfig.json b/packages/curve-common/tsconfig.json index b1f97d6a1..d8e607c0c 100644 --- a/packages/curve-common/tsconfig.json +++ b/packages/curve-common/tsconfig.json @@ -11,6 +11,7 @@ "strict": true, "paths": { "@/*": ["*"], + "@ui-kit/*": ["../../../packages/curve-ui-kit/src/*"], "@/common/*": ["../../../packages/curve-common/src/*"] } }, diff --git a/packages/ui/src/AppNav/AppNavMobile.tsx b/packages/ui/src/AppNav/AppNavMobile.tsx index 404291969..99074f1f2 100644 --- a/packages/ui/src/AppNav/AppNavMobile.tsx +++ b/packages/ui/src/AppNav/AppNavMobile.tsx @@ -24,6 +24,7 @@ import SelectLocale from 'ui/src/Select/SelectLocale' import SelectThemes from 'ui/src/Select/SelectThemes' import Spacer from 'ui/src/Spacer' import Switch from 'ui/src/Switch' +import { ConnectWalletIndicator } from 'curve-common/src/features/connect-wallet' const DEFAULT_MENUS_WIDTH = [0, 0] @@ -212,13 +213,10 @@ const AppNavMobile = ({ {/* MODAL FOOTER */} - { - connect.handleClick() - closeMenu([menuWidth, 0]) - }} + From dbf48ed0dff3330372fbcfeaa6a7a9dfecf327c9 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Wed, 30 Oct 2024 10:38:40 +0100 Subject: [PATCH 048/137] refactor: separate pages and apps --- apps/lend/src/layout/Header.tsx | 46 +++---- apps/loan/src/layout/Header.tsx | 60 ++++----- apps/main/src/layout/default/Header.tsx | 71 ++++++----- .../switch-language/ui/LanguageSwitcher.tsx | 2 - packages/ui/src/AppNav/AppNavMobile.tsx | 82 ++++++------ packages/ui/src/AppNav/AppNavPages.tsx | 119 +++++++++--------- packages/ui/src/AppNav/types.ts | 4 +- packages/ui/src/Brand/AppLogo.tsx | 20 +-- packages/ui/src/utils/utilsAppNavigation.tsx | 28 ++--- 9 files changed, 193 insertions(+), 239 deletions(-) diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index 8a7732f1b..abbbb7f04 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -1,4 +1,3 @@ -import type { AppLogoProps } from '@/ui/Brand/AppLogo' import AppLogo from '@/ui/Brand/AppLogo' import type { AppPage } from '@/ui/AppNav/types' @@ -22,7 +21,6 @@ import HeaderSecondary from '@/layout/HeaderSecondary' import { useTvl } from '@/entities/chain' import { ChainSwitcher } from '@/common/features/switch-chain' import { LanguageSwitcher } from '@/common/features/switch-language' -import { Box } from '@ui-kit/shared/ui/Box' const Header = () => { @@ -51,30 +49,20 @@ const Header = () => { const routerPathname = location?.pathname ?? '' const routerNetwork = routerParams?.network - const appLogoProps: AppLogoProps = { - showBeta: true, - appName: 'LlamaLend', - } - - const pages: AppPage[] = useMemo(() => { - const links = isLgUp - ? [ - { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, - { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'Others' }, - { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: 'risk' }, - { ...APP_LINK.main, isDivider: true }, - APP_LINK.crvusd, - ] - : [ - { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, - { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'More', minWidth: '10rem' }, - { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: 'More' }, - { ...APP_LINK.main, isDivider: true }, - APP_LINK.crvusd, - ] - - return _parseRouteAndIsActive(links, rLocalePathname, routerPathname, routerNetwork) - }, [isLgUp, rLocalePathname, routerNetwork, routerPathname]) + const pages: AppPage[] = useMemo(() => + _parseRouteAndIsActive([ + { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, + { + route: ROUTE.PAGE_INTEGRATIONS, + label: t`Integrations`, + groupedTitle: isLgUp ? 'Others' : 'More', ...!isLgUp && { minWidth: '10rem' } + }, + { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: isLgUp ? 'risk' : 'More' } + ], rLocalePathname, routerPathname, routerNetwork), [isLgUp, rLocalePathname, routerNetwork, routerPathname]) + + const apps: AppPage[] = useMemo(() => + _parseRouteAndIsActive([APP_LINK.main, APP_LINK.lend, APP_LINK.crvusd], + rLocalePathname, routerPathname, routerNetwork), [rLocalePathname, routerNetwork, routerPathname]) const getPath = (route: string) => { const networkName = networks[rChainId || '1'].id @@ -161,8 +149,8 @@ const Header = () => { {isMdUp ? ( <> - - + + @@ -180,13 +168,13 @@ const Header = () => { ) : ( { if (navigate && params) { diff --git a/apps/loan/src/layout/Header.tsx b/apps/loan/src/layout/Header.tsx index 50d439c6f..69470273c 100644 --- a/apps/loan/src/layout/Header.tsx +++ b/apps/loan/src/layout/Header.tsx @@ -16,12 +16,12 @@ import useStore from '@/store/useStore' import { APP_LINK, - APPS_LINKS, - AppNavMobile, AppNavBar, AppNavBarContent, AppNavMenuSection, - AppSelectNetwork, + AppNavMobile, + APPS_LINKS, + AppSelectNetwork } from '@/ui/AppNav' import { CommunitySection, ResourcesSection } from '@/layout/Footer' import AppLogo from '@/ui/Brand' @@ -36,7 +36,7 @@ const Header = () => { const params = useParams() useLayoutHeight(mainNavRef, 'mainNav') - const { rChainId, rNetwork, rNetworkIdx } = getNetworkFromUrl() + const { rChainId, rNetworkIdx } = getNetworkFromUrl() const connectState = useStore((state) => state.connectState) const collateralDatasMapper = useStore((state) => state.collaterals.collateralDatasMapper[rChainId]) @@ -61,30 +61,27 @@ const Header = () => { const routerNetwork = routerParams?.network ?? 'ethereum' const routerPathname = location?.pathname ?? '' - const appLogoProps: AppLogoProps = { - appName: 'Crvusd', - } + const appLogoProps: AppLogoProps = {} const pages: AppPage[] = useMemo(() => { const links = isLgUp ? [ - { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, - { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: 'risk' }, - { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'integrations' }, - { ...APP_LINK.main, isDivider: true }, - APP_LINK.lend, - ] + { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, + { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: 'risk' }, + { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'integrations' }, + ] : [ - { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, - { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'More', minWidth: '10rem' }, - { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: 'More' }, - { ...APP_LINK.main, isDivider: true }, - APP_LINK.lend, - ] + { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: 'markets' }, + { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'More', minWidth: '10rem' }, + { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: 'More' }, + ] return _parseRouteAndIsActive(links, rLocale.rLocalePathname, routerPathname, routerNetwork) }, [isLgUp, rLocale.rLocalePathname, routerNetwork, routerPathname]) + const apps: AppPage[] = useMemo(() => _parseRouteAndIsActive([APP_LINK.main, APP_LINK.lend], rLocale.rLocalePathname, routerPathname, routerNetwork), + [rLocale.rLocalePathname, routerNetwork, routerPathname]) + const formattedTvl = useMemo( () => _getTvl(collateralDatasMapper, loansDetailsMapper, usdRatesMapper), [collateralDatasMapper, loansDetailsMapper, usdRatesMapper] @@ -128,18 +125,15 @@ const Header = () => { }, } - const appNavLocale = - process.env.NODE_ENV === 'development' - ? { - locale, - locales: DEFAULT_LOCALES, - handleChange: (selectedLocale: React.Key) => { - const locale = selectedLocale !== 'en' ? `/${selectedLocale}` : '' - const { rNetwork } = getNetworkFromUrl() - navigate(`${locale}/${rNetwork}/${getRestFullPathname()}`) - }, - } - : undefined + const appNavLocale = { + locale, + locales: DEFAULT_LOCALES, + handleChange: (selectedLocale: React.Key) => { + const locale = selectedLocale !== 'en' ? `/${selectedLocale}` : '' + const { rNetwork } = getNetworkFromUrl() + navigate(`${locale}/${rNetwork}/${getRestFullPathname()}`) + }, + } const appNavTheme = { themeType, @@ -163,7 +157,7 @@ const Header = () => { <> - + @@ -173,13 +167,13 @@ const Header = () => { ) : ( getPath(params, route), handleClick: (route: string) => { if (navigate && params) { diff --git a/apps/main/src/layout/default/Header.tsx b/apps/main/src/layout/default/Header.tsx index eb7f175d9..097e3d078 100644 --- a/apps/main/src/layout/default/Header.tsx +++ b/apps/main/src/layout/default/Header.tsx @@ -1,4 +1,3 @@ -import type { AppLogoProps } from '@/ui/Brand/AppLogo' import type { AppPage } from '@/ui/AppNav/types' import type { ThemeType } from '@/ui/Select/SelectThemes' @@ -59,10 +58,6 @@ const Header = () => { const routerPathname = location?.pathname ?? '' const routerNetwork = routerParams?.network - const appLogoProps: AppLogoProps = { - appName: '', - } - // prettier-ignore const appStats = [ { label: t`Total Deposits`, value: formatNumber(tvlTotal, { currency: 'USD', showDecimalIfSmallNumberOnly: true }) }, @@ -73,21 +68,17 @@ const Header = () => { const pages: AppPage[] = useMemo(() => { const links = isLgUp ? [ - { route: ROUTE.PAGE_POOLS, label: t`Pools`, groupedTitle: 'Pools' }, - { route: ROUTE.PAGE_CREATE_POOL, label: t`Pool Creation`, groupedTitle: 'Pool Creation' }, - { route: ROUTE.PAGE_DASHBOARD, label: t`Dashboard`, groupedTitle: 'Dashboard' }, - { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'Integrations' }, - { ...APP_LINK.crvusd, isDivider: true }, - APP_LINK.lend, - ] + { route: ROUTE.PAGE_POOLS, label: t`Pools`, groupedTitle: 'Pools' }, + { route: ROUTE.PAGE_CREATE_POOL, label: t`Pool Creation`, groupedTitle: 'Pool Creation' }, + { route: ROUTE.PAGE_DASHBOARD, label: t`Dashboard`, groupedTitle: 'Dashboard' }, + { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'Integrations' }, + ] : [ - { route: ROUTE.PAGE_POOLS, label: t`Pools`, groupedTitle: 'Pools' }, - { route: ROUTE.PAGE_DASHBOARD, label: t`Dashboard`, groupedTitle: 'More' }, - { route: ROUTE.PAGE_CREATE_POOL, label: t`Pool Creation`, groupedTitle: 'More' }, - { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'More' }, - { ...APP_LINK.crvusd, isDivider: true }, - APP_LINK.lend, - ] + { route: ROUTE.PAGE_POOLS, label: t`Pools`, groupedTitle: 'Pools' }, + { route: ROUTE.PAGE_DASHBOARD, label: t`Dashboard`, groupedTitle: 'More' }, + { route: ROUTE.PAGE_CREATE_POOL, label: t`Pool Creation`, groupedTitle: 'More' }, + { route: ROUTE.PAGE_INTEGRATIONS, label: t`Integrations`, groupedTitle: 'More' }, + ] if (hasRouter && networks[rChainId].showRouterSwap) { const parsedSwapRoute = _parseSwapRoute(rChainId, ROUTE.PAGE_SWAP, routerCached) @@ -97,6 +88,12 @@ const Header = () => { return _parseRouteAndIsActive(links, rLocalePathname, routerPathname, routerNetwork) }, [hasRouter, isLgUp, rChainId, rLocalePathname, routerCached, routerNetwork, routerPathname]) + const apps: AppPage[] = useMemo(() => + _parseRouteAndIsActive([ + APP_LINK.crvusd, + APP_LINK.lend, + ], rLocalePathname, routerPathname, routerNetwork), [rLocalePathname, routerNetwork, routerPathname]) + const getPath = (route: string) => { const networkName = networks[rChainId || '1'].id return `#${rLocalePathname}/${networkName}${route}` @@ -136,16 +133,6 @@ const Header = () => { /> ) - const appNavLocale = { - locale, - locales: DEFAULT_LOCALES, - handleChange: (selectedLocale: React.Key) => { - const locale = selectedLocale !== 'en' ? `/${selectedLocale}` : '' - const { rNetwork } = getNetworkFromUrl() - navigate(`${locale}/${rNetwork}/${getRestFullPathname()}`) - }, - } - const appNavTheme = { themeType, handleClick: (selectedThemeType: ThemeType) => setThemeType(selectedThemeType), @@ -156,15 +143,23 @@ const Header = () => { return ( <> {isMdUp && ( - + { + const locale = selectedLocale !== 'en' ? `/${selectedLocale}` : '' + const { rNetwork } = getNetworkFromUrl() + navigate(`${locale}/${rNetwork}/${getRestFullPathname()}`) + }, + }} theme={appNavTheme} /> )} {isMdUp ? ( <> - - + + @@ -174,12 +169,20 @@ const Header = () => { ) : ( { + const locale = selectedLocale !== 'en' ? `/${selectedLocale}` : '' + const { rNetwork } = getNetworkFromUrl() + navigate(`${locale}/${rNetwork}/${getRestFullPathname()}`) + }, + }} pageWidth={pageWidth} pages={{ pages, + apps, getPath, handleClick: (route: string) => { if (navigate && params) { diff --git a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx index 15e23715e..0753ec69b 100644 --- a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx +++ b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx @@ -19,8 +19,6 @@ export type LanguageSwitcherProps = { export const LanguageSwitcher = ({ languageOptions, languageCode, onChange }: LanguageSwitcherProps) => ( + ) } diff --git a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx index 0753ec69b..72ad38c6b 100644 --- a/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx +++ b/packages/curve-common/src/features/switch-language/ui/LanguageSwitcher.tsx @@ -1,36 +1,26 @@ -import { Select } from '@ui-kit/shared/ui/Select' -import { MenuItem } from '@ui-kit/shared/ui/MenuItem' - -import { useCallback } from 'react' -import { SelectChangeEvent } from '@mui/material/Select/SelectInput' +import { MenuItem } from 'curve-ui-kit/src/shared/ui/MenuItem' import { Typography } from 'curve-ui-kit/src/shared/ui/Typography' +import { CompactDropDown } from 'curve-ui-kit/src/shared/ui/CompactDropDown' -export type LanguageOption = { - value: string - lang: string +export type LocaleValue = 'en' | 'zh-Hans' | 'zh-Hant' | 'pseudo' +export type LocaleOption = { name: string + value: LocaleValue + lang: string } export type LanguageSwitcherProps = { - languageCode: string - languageOptions: LanguageOption[] - onChange: (languageCode: string) => void + locale: LocaleValue + locales: LocaleOption[] + onChange: (value: LocaleValue) => void } -export const LanguageSwitcher = ({ languageOptions, languageCode, onChange }: LanguageSwitcherProps) => ( - +export const LanguageSwitcher = ({ locales, locale, onChange }: LanguageSwitcherProps) => ( + value={locale} onChange={onChange}> + {locales.map((languageOption) => ( + + {languageOption.name} + + ))} + ) diff --git a/packages/curve-ui-kit/src/shared/ui/Header/AppButtonLinks.tsx b/packages/curve-common/src/widgets/Header/AppButtonLinks.tsx similarity index 88% rename from packages/curve-ui-kit/src/shared/ui/Header/AppButtonLinks.tsx rename to packages/curve-common/src/widgets/Header/AppButtonLinks.tsx index b96f931c5..8bfa05bfe 100644 --- a/packages/curve-ui-kit/src/shared/ui/Header/AppButtonLinks.tsx +++ b/packages/curve-common/src/widgets/Header/AppButtonLinks.tsx @@ -1,8 +1,8 @@ import Box from '@mui/material/Box' import Button from '@mui/material/Button' +import Link from '@mui/material/Link' import { APP_LINK } from 'ui/src/AppNav/constants' import { AppName, AppNames } from 'ui/src/AppNav/types' -import { RouterLink } from '../RouterLink' export type AppNavAppsProps = { currentApp: AppName } @@ -11,12 +11,13 @@ export const AppButtonLinks = ({ currentApp }: AppNavAppsProps) => ( {AppNames.map((appName) => { const app = APP_LINK[appName] const isActive = currentApp === appName + console.log(app) return ( + ) +} \ No newline at end of file diff --git a/packages/curve-common/src/features/switch-theme/ThemeSwitcherIconButton.tsx b/packages/curve-common/src/features/switch-theme/ThemeSwitcherIconButton.tsx new file mode 100644 index 000000000..2d263969c --- /dev/null +++ b/packages/curve-common/src/features/switch-theme/ThemeSwitcherIconButton.tsx @@ -0,0 +1,14 @@ +import type { FunctionComponent } from 'react' +import type { Theme } from '@mui/system' +import IconButton from '@mui/material/IconButton' +import { ThemeSwitcherProps } from './types' +import { useThemeToggle } from './useThemeToggle' + +export const ThemeSwitcherIconButton: FunctionComponent = ({ theme, onChange }) => { + const [ component, onClick ] = useThemeToggle({ theme, onChange }) + return ( + t.palette.primary.main}}> + {component} + + ) +} diff --git a/packages/curve-common/src/features/switch-theme/index.ts b/packages/curve-common/src/features/switch-theme/index.ts new file mode 100644 index 000000000..555b85ea2 --- /dev/null +++ b/packages/curve-common/src/features/switch-theme/index.ts @@ -0,0 +1,3 @@ +export * from './types' +export * from './ThemeSwitcherButton' +export * from './ThemeSwitcherIconButton' diff --git a/packages/curve-common/src/features/switch-theme/types.tsx b/packages/curve-common/src/features/switch-theme/types.tsx new file mode 100644 index 000000000..6d3582f15 --- /dev/null +++ b/packages/curve-common/src/features/switch-theme/types.tsx @@ -0,0 +1,14 @@ +import { ChadImg, RCMoon, RCSun } from 'ui' +import Image from 'next/image' +import type { ThemeKey } from 'curve-ui-kit/src/shared/lib' + +export const themes = [ + { type: 'light', Component: }, + { type: 'dark', Component: }, + { type: 'chad', Component: Fun theme }, +] as const + +export type ThemeSwitcherProps = { + theme: ThemeKey + onChange(themeType: ThemeKey): void +} diff --git a/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx b/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx new file mode 100644 index 000000000..181e2446f --- /dev/null +++ b/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx @@ -0,0 +1,12 @@ +import { themes, ThemeSwitcherProps } from './types' +import { useCallback } from 'react' + +export function useThemeToggle({theme, onChange}: ThemeSwitcherProps) { + const i = themes.findIndex((t) => t.type === theme) + const themeIndex = i === -1 ? 0 : i + const onClick = useCallback(() => { + const nextIndex = (themeIndex + 1) % themes.length + onChange(themes[nextIndex].type) + }, [themeIndex, onChange]) + return [ themes[themeIndex]!.Component, onClick ] as const +} diff --git a/packages/curve-common/src/widgets/Header/DesktopHeader.tsx b/packages/curve-common/src/widgets/Header/DesktopHeader.tsx new file mode 100644 index 000000000..2ce0c09e6 --- /dev/null +++ b/packages/curve-common/src/widgets/Header/DesktopHeader.tsx @@ -0,0 +1,37 @@ +import { AppBar, Toolbar } from '@mui/material' +import Box from '@mui/material/Box' +import { ConnectWalletIndicator } from '../../features/connect-wallet' +import { LanguageSwitcher } from '../../features/switch-language' +import { ChainSwitcher } from '../../features/switch-chain' +import { AppButtonLinks } from './AppButtonLinks' +import { HeaderLogo } from './HeaderLogo' +import { HeaderStats } from './HeaderStats' +import { PageTabs } from './PageTabs' +import { Theme } from '@mui/system' +import { ThemeSwitcherIconButton } from '../../features/switch-theme' +import { AdvancedModeSwitcher } from '../../features/switch-advanced-mode' +import { BaseHeaderProps, toolbarColors } from './types' + +export const DesktopHeader = ({ currentApp, chains, languages, wallet, pages, appStats, themes: [theme, setTheme], sections, advancedMode: [isAdvancedMode, setAdvancedMode] }: BaseHeaderProps) => ( + + toolbarColors[t.palette.mode][0] }}> + + + + + + + + + + + + + + toolbarColors[t.palette.mode][1] }}> + + + + + +); diff --git a/packages/curve-common/src/widgets/Header/Header.tsx b/packages/curve-common/src/widgets/Header/Header.tsx index 391a55c17..894c0d08e 100644 --- a/packages/curve-common/src/widgets/Header/Header.tsx +++ b/packages/curve-common/src/widgets/Header/Header.tsx @@ -1,82 +1,6 @@ -import { AppBar, Toolbar } from '@mui/material' -import Box from '@mui/material/Box' -import type { AppName, AppNavSections, AppPage } from 'ui/src/AppNav/types' -import { ConnectWalletIndicator, ConnectWalletIndicatorProps } from '../../features/connect-wallet' -import { LanguageSwitcher, LanguageSwitcherProps } from '../../features/switch-language' -import { ChainSwitcher, ChainSwitcherProps } from '../../features/switch-chain' -import { AppButtonLinks } from './AppButtonLinks' -import { Dispatch } from 'react' -import { ThemeKey } from 'curve-ui-kit/src/shared/lib' -import { HeaderLogo } from './HeaderLogo' -import { HeaderStats } from './HeaderStats' -import { PageTabs } from './PageTabs' -import { Theme } from '@mui/system' -import { ThemeSwitcher } from '../../features/switch-theme/ThemeSwitcher' -import { AdvancedModeSwitcher } from '../../features/switch-advanced-mode/AdvancedModeSwitcher' +import { HeaderProps } from './types' +import { DesktopHeader } from './DesktopHeader' +import { MobileHeader } from './MobileHeader' -interface HeaderProps { - currentApp: AppName - languages: LanguageSwitcherProps - chains: ChainSwitcherProps - wallet: ConnectWalletIndicatorProps - pages: AppPage[] - themes: [ThemeKey, Dispatch] - appStats: {label: string, value: string}[] - sections: AppNavSections - advancedMode: [boolean, Dispatch] - isMdUp: boolean -} - -const APP_NAMES = { - main: "Curve", - lend: "Llamalend", - crvusd: "crvUSD", -} as const - -// TODO: Color should be in theme -const toolbarColors = { - light: ['#eeeceb', '#f4f3f0'], - dark: ['#1f1f1f', '#2f2f2f'], // todo -} as const - - -export const Header = ({ currentApp, chains, languages, wallet, pages, appStats, themes: [theme, setTheme], sections, advancedMode: [isAdvancedMode, setAdvancedMode], isMdUp }: HeaderProps) => { - return ( - - toolbarColors[t.palette.mode][0] }}> - {/*{*/} - {/* !isMdUp && (*/} - {/* */} - {/* */} - {/* */} - {/*}*/} - - {isMdUp && } - - - - - - - - - - - - toolbarColors[t.palette.mode][1] }}> - - - - - - ); -}; +export const Header = ({ isMdUp, ...props }: HeaderProps) => isMdUp ? + : ; diff --git a/packages/curve-common/src/widgets/Header/HeaderLogo.tsx b/packages/curve-common/src/widgets/Header/HeaderLogo.tsx index e9004b884..d46ffaf3f 100644 --- a/packages/curve-common/src/widgets/Header/HeaderLogo.tsx +++ b/packages/curve-common/src/widgets/Header/HeaderLogo.tsx @@ -4,6 +4,8 @@ import { Box } from 'curve-ui-kit/src/shared/ui/Box' import { LogoImg, RCLogoText } from 'ui/src/images' import { styled } from '@mui/material/styles' import { Typography } from 'curve-ui-kit/src/shared/ui/Typography' +import { APP_NAMES } from './types' +import { AppName } from 'ui/src/AppNav/types' const Image = styled('img')({ width: 30, @@ -13,7 +15,7 @@ const Image = styled('img')({ const LogoImageSrc = (LogoImg as unknown as { src: string }).src export type HeaderLogoProps = { - appName?: string + appName?: AppName } export const HeaderLogo = ({ appName }: HeaderLogoProps) => ( @@ -23,7 +25,7 @@ export const HeaderLogo = ({ appName }: HeaderLogoProps) => ( - {appName} + {APP_NAMES[appName]} powered by Curve diff --git a/packages/curve-common/src/widgets/Header/MobileHeader.tsx b/packages/curve-common/src/widgets/Header/MobileHeader.tsx new file mode 100644 index 000000000..eca5c9d2e --- /dev/null +++ b/packages/curve-common/src/widgets/Header/MobileHeader.tsx @@ -0,0 +1,105 @@ +import { AppBar, Toolbar } from '@mui/material' +import { HeaderLogo } from './HeaderLogo' +import { Theme } from '@mui/system' +import { BaseHeaderProps, toolbarColors } from './types' +import IconButton from '@mui/material/IconButton' +import React, { useCallback, useMemo, useState } from 'react' +import { MenuIcon } from 'curve-ui-kit/src/shared/ui/MenuIcon' +import Drawer from '@mui/material/Drawer' +import { SidebarSection } from './SidebarSection' +import groupBy from 'lodash/groupBy' +import { useLocation } from 'react-router' +import Box from '@mui/material/Box' +import { AdvancedModeSwitcher } from '../../features/switch-advanced-mode' +import { ThemeSwitcherButton } from '../../features/switch-theme' +import { LanguageSwitcher } from '../../features/switch-language' +import { ChainSwitcher } from '../../features/switch-chain' +import { ConnectWalletIndicator } from '../../features/connect-wallet' +import { APP_LINK } from 'ui' +import { AppName, AppNames } from 'ui/src/AppNav/types' +import { CloseIcon } from 'curve-ui-kit/src/shared/ui/CloseIcon' +import { t } from '@lingui/macro' +import { HeaderStats } from './HeaderStats' + +const HeaderLogoWithMenu = (props: { onClick: () => void, appName: AppName }) => ( + <> + + + + + +) + + +export const MobileHeader = ({ + currentApp, + chains, + languages, + wallet, + pages, + appStats, + themes: [theme, setTheme], + sections, + advancedMode: [isAdvancedMode, setAdvancedMode] + }: BaseHeaderProps) => { + const [isSidebarOpen, setSidebarOpen] = useState(false) + const groupedPages = useMemo(() => groupBy(pages, (p) => p.groupedTitle), [pages]) + const { pathname: currentPath } = useLocation() + + const openSidebar = useCallback(() => setSidebarOpen(true), []) + const closeSidebar = useCallback(() => setSidebarOpen(false), []) + return ( + + toolbarColors[t.palette.mode][0] }}> + + + toolbarColors[t.palette.mode][1], + width: '80%', + maxWidth: 400 + } + }} + variant="temporary" + > + toolbarColors[t.palette.mode][0] }}> + + + + + + + + + + + {Object.entries(groupedPages).map(([title, pages]) => ( + + ))} + + appName != currentApp).map((appName) => APP_LINK[appName])} + currentPath={currentPath} + /> + + {/* TODO: */} + + + + + + + + + + + + + + ) +} diff --git a/packages/curve-common/src/widgets/Header/SidebarItem.tsx b/packages/curve-common/src/widgets/Header/SidebarItem.tsx new file mode 100644 index 000000000..cdc40061c --- /dev/null +++ b/packages/curve-common/src/widgets/Header/SidebarItem.tsx @@ -0,0 +1,30 @@ +import type { FunctionComponent } from 'react' +import { ListItem } from '@mui/material' +import { Button } from 'curve-ui-kit/src/shared/ui/Button' +import { RouterLink } from 'curve-ui-kit/src/shared/ui/RouterLink' +import type { AppPage } from 'ui/src/AppNav/types' + +type SidebarItemProps = { + page: AppPage; + currentPath: string; + depth?: number +} + +export const SidebarItem: FunctionComponent = ({ page, currentPath, depth = 0 }) => { + console.log(page.label, depth) + return ( + + + + ) +} diff --git a/packages/curve-common/src/widgets/Header/SidebarSection.tsx b/packages/curve-common/src/widgets/Header/SidebarSection.tsx new file mode 100644 index 000000000..9ba815f58 --- /dev/null +++ b/packages/curve-common/src/widgets/Header/SidebarSection.tsx @@ -0,0 +1,27 @@ +import type { FunctionComponent, ReactNode } from 'react' +import { List, ListSubheader } from '@mui/material' +import { SidebarItem } from './SidebarItem' +import type { AppPage } from 'ui/src/AppNav/types' +import Divider from '@mui/material/Divider' + +interface SidebarSectionProps { + title: string + pages?: AppPage[] + currentPath: string + children?: ReactNode +} + +export const SidebarSection: FunctionComponent = ({ pages, title, currentPath, children }) => ( + + {title} + + + } + sx={{ marginTop: 2 }} + > + {pages?.map((page) => )} + {children} + +) diff --git a/packages/curve-common/src/widgets/Header/types.ts b/packages/curve-common/src/widgets/Header/types.ts new file mode 100644 index 000000000..ab31c6c6c --- /dev/null +++ b/packages/curve-common/src/widgets/Header/types.ts @@ -0,0 +1,35 @@ +import type { AppName, AppNavSections, AppPage } from 'ui/src/AppNav/types' +import { LanguageSwitcherProps } from '../../features/switch-language' +import { ChainSwitcherProps } from '../../features/switch-chain' +import { ConnectWalletIndicatorProps } from '../../features/connect-wallet' +import { ThemeKey } from 'curve-ui-kit/src/shared/lib' +import { Dispatch } from 'react' + +export type BaseHeaderProps = { + currentApp: AppName + languages: LanguageSwitcherProps + chains: ChainSwitcherProps + wallet: ConnectWalletIndicatorProps + pages: AppPage[] + themes: [ThemeKey, Dispatch] + appStats: { label: string, value: string }[] + sections: AppNavSections + advancedMode: [boolean, Dispatch] +} + +export type HeaderProps = BaseHeaderProps & { + isMdUp: boolean +} + +export const APP_NAMES = { + main: 'Curve', + lend: 'Llamalend', + crvusd: 'crvUSD' +} as const + + +// TODO: Color should be in theme +export const toolbarColors = { + light: ['#eeeceb', '#f4f3f0'], + dark: ['#1f1f1f', '#2f2f2f'] // todo +} as const diff --git a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts index 9c7c176e8..14cb4f02a 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/muiButton.ts @@ -2,13 +2,16 @@ import type { Components, CSSObject } from '@mui/material/styles' import { extractNumber, type FigmaTokens } from '../../api' import { basicMuiTheme, omitProperty, type ThemeKey } from '../../lib' +const COLORS = ['primary', 'secondary', 'success', 'alert'] as const +type Color = typeof COLORS[number] + export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey): Components['MuiButton'] => { const buttonDesktop = figmaTokens.themes.desktop[mode].button const buttonMobile = figmaTokens.themes.mobile[mode].button const spacingDesktop = figmaTokens.mappedSizesAndSpaces.desktop.spacing const spacingMobile = figmaTokens.mappedSizesAndSpaces.mobile.spacing - const getColorButtonStyle = (color: 'primary' | 'secondary' | 'success' | 'alert'): CSSObject => ({ + const getColorButtonStyle = (color: Color): CSSObject => ({ backgroundColor: buttonDesktop[color].default?.fill, color: buttonDesktop[color].default['label & icon'], '&:hover': { @@ -33,65 +36,28 @@ export const defineMuiButton = (figmaTokens: FigmaTokens, mode: ThemeKey): Compo }, }) - const getVariantButtonStyle = (variant: 'outlined'): CSSObject => ({ - backgroundColor: 'transparent', - borderColor: buttonDesktop[variant].default.outline, - color: buttonDesktop[variant].default['label & icon'], - '&:hover': { - borderColor: buttonDesktop[variant].hover.outline, - color: buttonDesktop[variant].hover['label & icon'], - }, - '&:disabled': { - borderColor: buttonDesktop[variant].disabled.outline, - color: buttonDesktop[variant].disabled['label & icon'], - }, + const getOutlinedButtonStyle = (color: Color): CSSObject => ({ + ...getGhostButtonStyle(color), + border: `1px solid ${buttonDesktop[color].default?.fill}`, }) - const getGhostButtonStyle = (): CSSObject => ({ + const getGhostButtonStyle = (color: Color): CSSObject => ({ + ...getColorButtonStyle(color), backgroundColor: 'transparent', - color: buttonDesktop.ghost.default['label & icon'], - '&:hover': { - backgroundColor: buttonDesktop.ghost.hover.fill, - color: buttonDesktop.ghost.hover['label & icon'], - }, - '&:disabled': { - backgroundColor: buttonDesktop.ghost.disabled.fill, - color: buttonDesktop.ghost.disabled['label & icon'], - }, + color: buttonDesktop[color].default?.fill }) return { styleOverrides: { root: { variants: [ - { - props: { color: 'primary' }, - style: getColorButtonStyle('primary'), - }, - { - props: { color: 'secondary' }, - style: getColorButtonStyle('secondary'), - }, - { - props: { color: 'success' }, - style: getColorButtonStyle('success'), - }, - { - props: { color: 'alert' }, - style: getColorButtonStyle('alert'), - }, + ...COLORS.map((color) => ({ props: { color }, style: getColorButtonStyle(color) })), + ...COLORS.map((color) => ({ props: { variant: 'ghost', color }, style: getGhostButtonStyle(color) })), + ...COLORS.map((color) => ({ props: { variant: 'outlined', color }, style: getOutlinedButtonStyle(color) })), { props: { color: 'navigation' }, style: getNavigationButtonStyle(), }, - { - props: { variant: 'outlined' }, - style: getVariantButtonStyle('outlined'), - }, - { - props: { variant: 'ghost' }, - style: getGhostButtonStyle(), - }, ], borderRadius: extractNumber(buttonDesktop.radius.md), }, diff --git a/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts b/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts index ebf6ed7cc..0dc540bfc 100644 --- a/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts +++ b/packages/curve-ui-kit/src/shared/ui/Button/stories/Button.stories.ts @@ -73,7 +73,7 @@ export const Outlined: Story = { export const Ghost: Story = { args: { variant: 'ghost', - color: undefined, + color: "alert", children: 'Ghost', }, } diff --git a/packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx b/packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx new file mode 100644 index 000000000..3d46efab8 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx @@ -0,0 +1,12 @@ +import { createSvgIcon } from '@mui/material/utils'; + +export const CloseIcon = createSvgIcon( + + + , + 'Close' +); diff --git a/packages/curve-ui-kit/src/shared/ui/MenuIcon.tsx b/packages/curve-ui-kit/src/shared/ui/MenuIcon.tsx new file mode 100644 index 000000000..53956f2a6 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/MenuIcon.tsx @@ -0,0 +1,12 @@ +import { createSvgIcon } from '@mui/material/utils'; + +export const MenuIcon = createSvgIcon( + + + , + 'Menu' +); diff --git a/packages/ui/src/Brand/AppLogo.tsx b/packages/ui/src/Brand/AppLogo.tsx index 10d65a8e8..3f37094a4 100644 --- a/packages/ui/src/Brand/AppLogo.tsx +++ b/packages/ui/src/Brand/AppLogo.tsx @@ -5,10 +5,11 @@ import styled from 'styled-components' import { breakpoints } from 'ui/src/utils/responsive' import { LogoImg, RCLogoText } from 'ui/src/images' +import { AppName } from '../AppNav/types' export type AppLogoProps = { className?: string - appName?: string + appName?: AppName } const AppLogo = ({ className = '', appName }: AppLogoProps) => { @@ -16,7 +17,7 @@ const AppLogo = ({ className = '', appName }: AppLogoProps) => { - {appName} + {appName} ) @@ -32,7 +33,7 @@ const Wrapper = styled.div` } ` -const AppName = styled.span` +const AppNameBox = styled.span` color: inherit; font-size: var(--font-size-1); font-weight: bold; From 900857c2ba49364a36c6d22ea97bbad49ff212c0 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 1 Nov 2024 13:34:29 +0100 Subject: [PATCH 055/137] feat: social buttons --- apps/lend/src/layout/Header.tsx | 2 +- .../src/widgets/Header/HeaderLogoWithMenu.tsx | 14 +++++++ .../src/widgets/Header/MobileHeader.tsx | 27 ++++++------- .../widgets/Header/SocialSidebarSection.tsx | 39 +++++++++++++++++++ .../curve-common/src/widgets/Header/index.ts | 1 + packages/curve-ui-kit/package.json | 1 + .../curve-ui-kit/src/shared/ui/CloseIcon.tsx | 12 ------ .../src/shared/ui/DiscordIcon.tsx | 9 +++++ yarn.lock | 26 +++++++++++++ 9 files changed, 103 insertions(+), 28 deletions(-) create mode 100644 packages/curve-common/src/widgets/Header/HeaderLogoWithMenu.tsx create mode 100644 packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx create mode 100644 packages/curve-common/src/widgets/Header/index.ts delete mode 100644 packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx create mode 100644 packages/curve-ui-kit/src/shared/ui/DiscordIcon.tsx diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index 70963ceca..80bacfba2 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -16,7 +16,7 @@ import useStore from '@/store/useStore' import { APPS_LINKS } from '@/ui/AppNav' import { CommunitySection, ResourcesSection } from '@/layout/Footer' import { useTvl } from '@/entities/chain' -import { Header as NewHeader } from '@/common/widgets/Header/Header' +import { Header as NewHeader } from '@/common/widgets/Header' import { ThemeKey } from '@ui-kit/shared/lib' diff --git a/packages/curve-common/src/widgets/Header/HeaderLogoWithMenu.tsx b/packages/curve-common/src/widgets/Header/HeaderLogoWithMenu.tsx new file mode 100644 index 000000000..9f6f417eb --- /dev/null +++ b/packages/curve-common/src/widgets/Header/HeaderLogoWithMenu.tsx @@ -0,0 +1,14 @@ +import { AppName } from 'ui/src/AppNav/types' +import IconButton from '@mui/material/IconButton' +import MenuIcon from '@mui/icons-material/Menu' +import { HeaderLogo } from './HeaderLogo' +import React from 'react' + +export const HeaderLogoWithMenu = (props: { onClick: () => void, appName: AppName }) => ( + <> + + + + + +) \ No newline at end of file diff --git a/packages/curve-common/src/widgets/Header/MobileHeader.tsx b/packages/curve-common/src/widgets/Header/MobileHeader.tsx index eca5c9d2e..118134020 100644 --- a/packages/curve-common/src/widgets/Header/MobileHeader.tsx +++ b/packages/curve-common/src/widgets/Header/MobileHeader.tsx @@ -1,10 +1,8 @@ import { AppBar, Toolbar } from '@mui/material' -import { HeaderLogo } from './HeaderLogo' import { Theme } from '@mui/system' import { BaseHeaderProps, toolbarColors } from './types' import IconButton from '@mui/material/IconButton' import React, { useCallback, useMemo, useState } from 'react' -import { MenuIcon } from 'curve-ui-kit/src/shared/ui/MenuIcon' import Drawer from '@mui/material/Drawer' import { SidebarSection } from './SidebarSection' import groupBy from 'lodash/groupBy' @@ -16,19 +14,12 @@ import { LanguageSwitcher } from '../../features/switch-language' import { ChainSwitcher } from '../../features/switch-chain' import { ConnectWalletIndicator } from '../../features/connect-wallet' import { APP_LINK } from 'ui' -import { AppName, AppNames } from 'ui/src/AppNav/types' -import { CloseIcon } from 'curve-ui-kit/src/shared/ui/CloseIcon' +import { AppNames } from 'ui/src/AppNav/types' +import CloseIcon from '@mui/icons-material/Close' import { t } from '@lingui/macro' import { HeaderStats } from './HeaderStats' - -const HeaderLogoWithMenu = (props: { onClick: () => void, appName: AppName }) => ( - <> - - - - - -) +import { HeaderLogoWithMenu } from './HeaderLogoWithMenu' +import { SocialSidebarSection } from './SocialSidebarSection' export const MobileHeader = ({ @@ -48,6 +39,12 @@ export const MobileHeader = ({ const openSidebar = useCallback(() => setSidebarOpen(true), []) const closeSidebar = useCallback(() => setSidebarOpen(false), []) + const onConnectWallet = wallet.onConnectWallet + const onConnect = useCallback(() => { + closeSidebar() + onConnectWallet() + }, [onConnectWallet, closeSidebar]) + return ( toolbarColors[t.palette.mode][0] }}> @@ -87,14 +84,14 @@ export const MobileHeader = ({ currentPath={currentPath} /> - {/* TODO: */} + - + diff --git a/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx b/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx new file mode 100644 index 000000000..d14a78fe3 --- /dev/null +++ b/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx @@ -0,0 +1,39 @@ +import { SidebarSection } from './SidebarSection' +import { t } from '@lingui/macro' +import IconButton from '@mui/material/IconButton' +import { ReactElement } from 'react' +import TelegramIcon from '@mui/icons-material/Telegram' +import TwitterIcon from '@mui/icons-material/Twitter' +import YouTubeIcon from '@mui/icons-material/YouTube' +import Tooltip from '@mui/material/Tooltip' +import Link from '@mui/material/Link' +import { DiscordIcon } from 'curve-ui-kit/src/shared/ui/DiscordIcon' +import { Box } from 'curve-ui-kit/src/shared/ui/Box' +import SvgIcon from '@mui/material/SvgIcon'; + +type SocialButtonProps = { + label: string, + href: string, + icon: typeof SvgIcon +} + +const SocialButton = ({ icon: Icon, href, label }: SocialButtonProps) => ( + + + + + +) + +type SocialSidebarSectionProps = { currentPath: string } + +export const SocialSidebarSection = (props: SocialSidebarSectionProps) => ( + + + + + + + + +) diff --git a/packages/curve-common/src/widgets/Header/index.ts b/packages/curve-common/src/widgets/Header/index.ts new file mode 100644 index 000000000..5e4d6a204 --- /dev/null +++ b/packages/curve-common/src/widgets/Header/index.ts @@ -0,0 +1 @@ +export {Header} from './Header'; diff --git a/packages/curve-ui-kit/package.json b/packages/curve-ui-kit/package.json index 295d29490..725f0a2ad 100644 --- a/packages/curve-ui-kit/package.json +++ b/packages/curve-ui-kit/package.json @@ -15,6 +15,7 @@ "dependencies": { "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^6.1.4", "@mui/material": "^6.1.4", "@mui/utils": "^6.1.4" }, diff --git a/packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx b/packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx deleted file mode 100644 index 3d46efab8..000000000 --- a/packages/curve-ui-kit/src/shared/ui/CloseIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { createSvgIcon } from '@mui/material/utils'; - -export const CloseIcon = createSvgIcon( - - - , - 'Close' -); diff --git a/packages/curve-ui-kit/src/shared/ui/DiscordIcon.tsx b/packages/curve-ui-kit/src/shared/ui/DiscordIcon.tsx new file mode 100644 index 000000000..48cddad71 --- /dev/null +++ b/packages/curve-ui-kit/src/shared/ui/DiscordIcon.tsx @@ -0,0 +1,9 @@ +import { createSvgIcon } from '@mui/material/utils' +import React from 'react' + +export const DiscordIcon = createSvgIcon( + + + , 'Discord' +) diff --git a/yarn.lock b/yarn.lock index 7fea1f0dd..2b43d229e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2882,6 +2882,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 + languageName: node + linkType: hard + "@babel/template@npm:^7.18.10": version: 7.18.10 resolution: "@babel/template@npm:7.18.10" @@ -6326,6 +6335,22 @@ __metadata: languageName: node linkType: hard +"@mui/icons-material@npm:^6.1.4": + version: 6.1.6 + resolution: "@mui/icons-material@npm:6.1.6" + dependencies: + "@babel/runtime": "npm:^7.26.0" + peerDependencies: + "@mui/material": ^6.1.6 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/a6eb10be3cc356fd404febf29a3b26fa63b6b09d3148736fb05279954905186e9804869ff18220840ae92dbdeddfd407c2d0c72b9e165e01fd6bbc620b6b39d7 + languageName: node + linkType: hard + "@mui/material@npm:^6.1.4": version: 6.1.4 resolution: "@mui/material@npm:6.1.4" @@ -15115,6 +15140,7 @@ __metadata: "@chromatic-com/storybook": "npm:^2.0.2" "@emotion/react": "npm:^11.13.3" "@emotion/styled": "npm:^11.13.0" + "@mui/icons-material": "npm:^6.1.4" "@mui/material": "npm:^6.1.4" "@mui/utils": "npm:^6.1.4" "@storybook/addon-a11y": "npm:^8.3.5" From 2949bcec0f21872ee51c08e56ba74ffb1ebc692a Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 1 Nov 2024 15:33:04 +0100 Subject: [PATCH 056/137] feat: new documentation/security sections --- apps/lend/src/layout/Header.tsx | 94 +++++++++++-------- apps/loan/src/layout/Header.tsx | 1 + apps/main/src/layout/default/Header.tsx | 1 + .../connect-wallet/ui/ConnectWalletButton.tsx | 14 +-- .../ui/ConnectWalletIndicator.tsx | 19 ++-- .../ui/ConnectedWalletLabel.tsx | 9 +- .../AdvancedModeSwitcher.tsx | 15 +-- .../switch-theme/ThemeSwitcherButton.tsx | 5 +- .../src/features/switch-theme/types.tsx | 1 + .../features/switch-theme/useThemeToggle.tsx | 2 +- .../src/widgets/Header/DesktopHeader.tsx | 18 +++- .../src/widgets/Header/MobileHeader.tsx | 49 ++++++---- .../src/widgets/Header/SidebarItem.tsx | 36 +++---- .../src/widgets/Header/SidebarSection.tsx | 4 +- .../widgets/Header/SocialSidebarSection.tsx | 6 +- .../curve-common/src/widgets/Header/types.ts | 16 +++- packages/ui/src/AppNav/AppNavMobile.tsx | 2 + packages/ui/src/AppNav/types.ts | 1 + 18 files changed, 176 insertions(+), 117 deletions(-) diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index 80bacfba2..25a4d860e 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -12,14 +12,34 @@ import { getWalletSignerAddress, useConnectWallet } from '@/common/features/conn import { useHeightResizeObserver } from '@/ui/hooks' import networks, { visibleNetworksList } from '@/networks' import useStore from '@/store/useStore' - -import { APPS_LINKS } from '@/ui/AppNav' -import { CommunitySection, ResourcesSection } from '@/layout/Footer' import { useTvl } from '@/entities/chain' import { Header as NewHeader } from '@/common/widgets/Header' import { ThemeKey } from '@ui-kit/shared/lib' +const getSections = (rChainId: ChainId) => [ + { + title: t`Documentation`, + links: [ + { route: 'https://news.curve.fi/', label: t`News` }, + { route: 'https://resources.curve.fi/lending/understanding-lending/', label: t`User Resources` }, + { route: 'https://docs.curve.fi', label: t`Developer Resources` }, + { route: 'https://docs.curve.fi/integration/overview/', label: t`Integrations` }, + { route: 'https://resources.curve.fi/glossary-branding/branding/', label: t`Branding` } + ] + }, + { + title: t`Security`, // audits, bug bounty, dune analytics, curve monitor & crvhub + links: [ + { route: 'https://docs.curve.fi/references/audits/', label: t`Audits` }, + { route: `${networks[rChainId ?? '1']?.orgUIPath}/bugbounty`, label: t`Bug Bounty` }, + { route: 'https://dune.com/mrblock_buidl/Curve.fi', label: t`Dune Analytics` }, + { route: 'https://curvemonitor.com', label: t`Curve Monitor` }, + { route: 'https://crvhub.com/', label: t`Crvhub` } + ] + } +] + const Header = () => { const [{ wallet }] = useConnectWallet() const mainNavRef = useRef(null) @@ -43,33 +63,6 @@ const Header = () => { const routerPathname = location?.pathname ?? '' const routerNetwork = routerParams?.network - const pages: AppPage[] = useMemo(() => - _parseRouteAndIsActive([ - { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: isMdUp ? 'Markets' : 'Llamalend' }, - { - route: ROUTE.PAGE_INTEGRATIONS, - label: t`Integrations`, - groupedTitle: isMdUp ? 'Others' : 'Llamalend', ...!isMdUp && { minWidth: '10rem' } - }, - { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: isMdUp ? 'risk' : 'Llamalend' } - ], rLocalePathname, routerPathname, routerNetwork), [isMdUp, rLocalePathname, routerNetwork, routerPathname]) - - const handleNetworkChange = useCallback((selectedChainId: ChainId) => { - if (rChainId !== selectedChainId) { - const network = networks[selectedChainId as ChainId].id - const [currPath] = window.location.hash.split('?') - - if (currPath.endsWith('markets')) { - // include search params when in market list page - navigate(`${rLocalePathname}/${network}/${getRestFullPathname()}`) - } else { - navigate(`${rLocalePathname}/${network}/${getRestPartialPathname()}`) - } - - updateConnectState('loading', CONNECT_STAGE.SWITCH_NETWORK, [rChainId, selectedChainId]) - } - }, [rChainId, rLocalePathname, updateConnectState, navigate]) - useEffect(() => { setLayoutHeight('mainNav', elHeight) // eslint-disable-next-line react-hooks/exhaustive-deps @@ -83,7 +76,16 @@ const Header = () => { useCallback((isAdvanced) => setAppCache('isAdvanceMode', isAdvanced), [setAppCache]), ]} currentApp="lend" - pages={pages} + pages={useMemo(() => + _parseRouteAndIsActive([ + { route: ROUTE.PAGE_MARKETS, label: t`Markets`, groupedTitle: isMdUp ? 'Markets' : 'Llamalend' }, + { + route: ROUTE.PAGE_INTEGRATIONS, + label: t`Integrations`, + groupedTitle: isMdUp ? 'Others' : 'Llamalend', ...!isMdUp && { minWidth: '10rem' } + }, + { route: ROUTE.PAGE_RISK_DISCLAIMER, label: t`Risk Disclaimer`, groupedTitle: isMdUp ? 'risk' : 'Llamalend' } + ], rLocalePathname, routerPathname, routerNetwork), [isMdUp, rLocalePathname, routerNetwork, routerPathname])} themes={[ themeType, useCallback((selectedThemeType: ThemeKey) => setAppCache('themeType', selectedThemeType), [setAppCache]), @@ -101,20 +103,38 @@ const Header = () => { options: visibleNetworksList, disabled: isLoading(connectState, CONNECT_STAGE.SWITCH_NETWORK), chainId: rChainId, - onChange: handleNetworkChange, + onChange: useCallback((selectedChainId: ChainId) => { + if (rChainId !== selectedChainId) { + const network = networks[selectedChainId as ChainId].id + const [currPath] = window.location.hash.split('?') + + if (currPath.endsWith('markets')) { + // include search params when in market list page + navigate(`${rLocalePathname}/${network}/${getRestFullPathname()}`) + } else { + navigate(`${rLocalePathname}/${network}/${getRestPartialPathname()}`) + } + + updateConnectState('loading', CONNECT_STAGE.SWITCH_NETWORK, [rChainId, selectedChainId]) + } + }, [rChainId, rLocalePathname, updateConnectState, navigate]), }} wallet={{ onConnectWallet: useCallback(() => updateConnectState('loading', CONNECT_STAGE.CONNECT_WALLET, ['']), [updateConnectState]), onDisconnectWallet: useCallback(() => updateConnectState('loading', CONNECT_STAGE.DISCONNECT_WALLET), [updateConnectState]), walletAddress: getWalletSignerAddress(wallet), disabled: isLoading(connectState, CONNECT_STAGE.SWITCH_NETWORK), + label: t`Connect Wallet`, }} appStats={[{ label: 'TVL', value: tvl && formatNumber(tvl, { ...FORMAT_OPTIONS.USD, showDecimalIfSmallNumberOnly: true }) || '' }]} - sections={[ - { id: 'apps', title: t`Apps`, links: APPS_LINKS }, - { id: 'community', title: t`Community`, comp: }, - { id: 'resources', title: t`Resources`, comp: }, - ]} + sections={useMemo(() => getSections(rChainId), [rChainId])} + translations={{ + advancedMode: t`Advanced`, + themeSwitcher: t`Mode`, + otherApps: t`Other Apps`, + options: t`Options`, + socialMedia: t`Community`, + }} /> ) } diff --git a/apps/loan/src/layout/Header.tsx b/apps/loan/src/layout/Header.tsx index 3d6bf4afd..77afdbdcb 100644 --- a/apps/loan/src/layout/Header.tsx +++ b/apps/loan/src/layout/Header.tsx @@ -157,6 +157,7 @@ const Header = () => { ) : ( { ) : ( void +export type ConnectWalletButtonProps = { + onConnectWallet: () => void + label: string disabled?: boolean + sx?: SxProps } -export const ConnectWalletButton = ({ onConnectWallet, disabled }: ConnectWalletButtonProps) => - diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx index 064d1050c..c75ef477a 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectWalletIndicator.tsx @@ -1,18 +1,13 @@ import React, { FunctionComponent } from 'react' -import { ConnectWalletButton } from './ConnectWalletButton' -import { ConnectedWalletLabel } from './ConnectedWalletLabel' -import { Address } from 'curve-ui-kit/src/shared/ui/AddressLabel' +import { ConnectWalletButton, ConnectWalletButtonProps } from './ConnectWalletButton' +import { ConnectedWalletLabel, ConnectedWalletLabelProps } from './ConnectedWalletLabel' +import type { SetOptional } from 'type-fest' -export type ConnectWalletIndicatorProps = { - walletAddress?: Address - onConnectWallet: () => void - onDisconnectWallet: () => void - disabled?: boolean -} +export type ConnectWalletIndicatorProps = ConnectWalletButtonProps & SetOptional -export const ConnectWalletIndicator: FunctionComponent = ({ walletAddress, onConnectWallet, onDisconnectWallet, disabled }) => +export const ConnectWalletIndicator: FunctionComponent = ({ walletAddress, label, onConnectWallet, onDisconnectWallet, ...props }) => walletAddress ? ( - + ) : ( - + ) diff --git a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx index 9e45fc340..a70f56292 100644 --- a/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx +++ b/packages/curve-common/src/features/connect-wallet/ui/ConnectedWalletLabel.tsx @@ -2,18 +2,21 @@ import { FunctionComponent } from 'react' import { Button } from 'curve-ui-kit/src/shared/ui/Button' import { Address, AddressLabel } from 'curve-ui-kit/src/shared/ui/AddressLabel' -interface ConnectedWalletLabelProps { +import type { SxProps, Theme } from '@mui/system' + +export type ConnectedWalletLabelProps = { walletAddress: Address, onDisconnectWallet: () => void disabled?: boolean + sx?: SxProps } export const ConnectedWalletLabel: FunctionComponent = ({ walletAddress, onDisconnectWallet, - disabled + ...props }) => ( - ) diff --git a/packages/curve-common/src/features/switch-advanced-mode/AdvancedModeSwitcher.tsx b/packages/curve-common/src/features/switch-advanced-mode/AdvancedModeSwitcher.tsx index b6a1a21b3..cdcf3fcb4 100644 --- a/packages/curve-common/src/features/switch-advanced-mode/AdvancedModeSwitcher.tsx +++ b/packages/curve-common/src/features/switch-advanced-mode/AdvancedModeSwitcher.tsx @@ -2,20 +2,23 @@ import { FunctionComponent } from 'react' import Switch from '@mui/material/Switch' import Box from '@mui/material/Box' import { Typography } from 'curve-ui-kit/src/shared/ui/Typography' -import { t } from '@lingui/macro' -type AdvancedModeSwitcherProps = { advancedMode: boolean, onChange: (value: boolean) => void } +type AdvancedModeSwitcherProps = { + label: string, + advancedMode: boolean, + onChange: (value: boolean) => void +} -export const AdvancedModeSwitcher: FunctionComponent = ({ advancedMode, onChange }) => ( +export const AdvancedModeSwitcher: FunctionComponent = ({ advancedMode, onChange, label }) => ( onChange(!advancedMode)} color="primary" - inputProps={{ 'aria-label': t`Advanced mode switch` }} + inputProps={{ 'aria-label': label }} /> - - {t`Advanced`} + + {label} ) \ No newline at end of file diff --git a/packages/curve-common/src/features/switch-theme/ThemeSwitcherButton.tsx b/packages/curve-common/src/features/switch-theme/ThemeSwitcherButton.tsx index c5a4873d0..07f6d69f0 100644 --- a/packages/curve-common/src/features/switch-theme/ThemeSwitcherButton.tsx +++ b/packages/curve-common/src/features/switch-theme/ThemeSwitcherButton.tsx @@ -3,10 +3,9 @@ import type { Theme } from '@mui/system' import { type ThemeSwitcherProps } from './types' import { Button } from 'curve-ui-kit/src/shared/ui/Button' import { Box } from 'curve-ui-kit/src/shared/ui/Box' -import { t } from '@lingui/macro' import { useThemeToggle } from './useThemeToggle' -export const ThemeSwitcherButton: FunctionComponent = ({ theme, onChange }) => { +export const ThemeSwitcherButton: FunctionComponent = ({ theme, onChange, label }) => { const [ component, onClick ] = useThemeToggle({ theme, onChange }) const Icon = ( @@ -24,7 +23,7 @@ export const ThemeSwitcherButton: FunctionComponent = ({ the '&:hover': {fill: (t: Theme) => t.palette.primary.contrastText}, }} > - {t`Mode`} + {label} ) } \ No newline at end of file diff --git a/packages/curve-common/src/features/switch-theme/types.tsx b/packages/curve-common/src/features/switch-theme/types.tsx index 6d3582f15..f61a8064b 100644 --- a/packages/curve-common/src/features/switch-theme/types.tsx +++ b/packages/curve-common/src/features/switch-theme/types.tsx @@ -11,4 +11,5 @@ export const themes = [ export type ThemeSwitcherProps = { theme: ThemeKey onChange(themeType: ThemeKey): void + label: string } diff --git a/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx b/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx index 181e2446f..16857c376 100644 --- a/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx +++ b/packages/curve-common/src/features/switch-theme/useThemeToggle.tsx @@ -1,7 +1,7 @@ import { themes, ThemeSwitcherProps } from './types' import { useCallback } from 'react' -export function useThemeToggle({theme, onChange}: ThemeSwitcherProps) { +export function useThemeToggle({theme, onChange}: Omit) { const i = themes.findIndex((t) => t.type === theme) const themeIndex = i === -1 ? 0 : i const onClick = useCallback(() => { diff --git a/packages/curve-common/src/widgets/Header/DesktopHeader.tsx b/packages/curve-common/src/widgets/Header/DesktopHeader.tsx index 2ce0c09e6..1b4156a13 100644 --- a/packages/curve-common/src/widgets/Header/DesktopHeader.tsx +++ b/packages/curve-common/src/widgets/Header/DesktopHeader.tsx @@ -12,7 +12,17 @@ import { ThemeSwitcherIconButton } from '../../features/switch-theme' import { AdvancedModeSwitcher } from '../../features/switch-advanced-mode' import { BaseHeaderProps, toolbarColors } from './types' -export const DesktopHeader = ({ currentApp, chains, languages, wallet, pages, appStats, themes: [theme, setTheme], sections, advancedMode: [isAdvancedMode, setAdvancedMode] }: BaseHeaderProps) => ( +export const DesktopHeader = ({ + currentApp, + chains, + languages, + wallet, + pages, + appStats, + themes: [theme, setTheme], + advancedMode: [isAdvancedMode, setAdvancedMode], + translations: t +}: BaseHeaderProps) => ( toolbarColors[t.palette.mode][0] }}> @@ -21,9 +31,9 @@ export const DesktopHeader = ({ currentApp, chains, lan - + - + @@ -34,4 +44,4 @@ export const DesktopHeader = ({ currentApp, chains, lan -); +) diff --git a/packages/curve-common/src/widgets/Header/MobileHeader.tsx b/packages/curve-common/src/widgets/Header/MobileHeader.tsx index 118134020..039e63938 100644 --- a/packages/curve-common/src/widgets/Header/MobileHeader.tsx +++ b/packages/curve-common/src/widgets/Header/MobileHeader.tsx @@ -16,23 +16,24 @@ import { ConnectWalletIndicator } from '../../features/connect-wallet' import { APP_LINK } from 'ui' import { AppNames } from 'ui/src/AppNav/types' import CloseIcon from '@mui/icons-material/Close' -import { t } from '@lingui/macro' import { HeaderStats } from './HeaderStats' import { HeaderLogoWithMenu } from './HeaderLogoWithMenu' import { SocialSidebarSection } from './SocialSidebarSection' +const width = {width: '80%', minWidth: 320, maxWidth: 400} as const export const MobileHeader = ({ - currentApp, - chains, - languages, - wallet, - pages, - appStats, - themes: [theme, setTheme], - sections, - advancedMode: [isAdvancedMode, setAdvancedMode] - }: BaseHeaderProps) => { + currentApp, + chains, + languages, + wallet, + pages, + appStats, + themes: [theme, setTheme], + sections, + advancedMode: [isAdvancedMode, setAdvancedMode], + translations: t, +}: BaseHeaderProps) => { const [isSidebarOpen, setSidebarOpen] = useState(false) const groupedPages = useMemo(() => groupBy(pages, (p) => p.groupedTitle), [pages]) const { pathname: currentPath } = useLocation() @@ -57,8 +58,10 @@ export const MobileHeader = ({ PaperProps={{ sx: { backgroundColor: (t: Theme) => toolbarColors[t.palette.mode][1], - width: '80%', - maxWidth: 400 + ...width, + '&::-webkit-scrollbar': { display: 'none' }, // chrome, safari, opera + msOverflowStyle: 'none', // IE and Edge + scrollbarWidth: 'none', // Firefox } }} variant="temporary" @@ -79,21 +82,27 @@ export const MobileHeader = ({ ))} appName != currentApp).map((appName) => APP_LINK[appName])} currentPath={currentPath} /> - + {sections.map(({ title, links }) => )} - - - + + + + + - - + + + + + + {/* To avoid the last item to be hidden by the connect indicator */} diff --git a/packages/curve-common/src/widgets/Header/SidebarItem.tsx b/packages/curve-common/src/widgets/Header/SidebarItem.tsx index cdc40061c..15eb8d8e2 100644 --- a/packages/curve-common/src/widgets/Header/SidebarItem.tsx +++ b/packages/curve-common/src/widgets/Header/SidebarItem.tsx @@ -3,28 +3,28 @@ import { ListItem } from '@mui/material' import { Button } from 'curve-ui-kit/src/shared/ui/Button' import { RouterLink } from 'curve-ui-kit/src/shared/ui/RouterLink' import type { AppPage } from 'ui/src/AppNav/types' +import Link from '@mui/material/Link' type SidebarItemProps = { page: AppPage; currentPath: string; - depth?: number + child?: boolean } -export const SidebarItem: FunctionComponent = ({ page, currentPath, depth = 0 }) => { - console.log(page.label, depth) - return ( - = ({ page, currentPath, child }) => ( + + - - ) -} + {page.label} + + +) diff --git a/packages/curve-common/src/widgets/Header/SidebarSection.tsx b/packages/curve-common/src/widgets/Header/SidebarSection.tsx index 9ba815f58..2298a6553 100644 --- a/packages/curve-common/src/widgets/Header/SidebarSection.tsx +++ b/packages/curve-common/src/widgets/Header/SidebarSection.tsx @@ -14,14 +14,14 @@ interface SidebarSectionProps { export const SidebarSection: FunctionComponent = ({ pages, title, currentPath, children }) => ( + {title} } sx={{ marginTop: 2 }} > - {pages?.map((page) => )} + {pages?.map((page) => )} {children} ) diff --git a/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx b/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx index d14a78fe3..2281cfb71 100644 --- a/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx +++ b/packages/curve-common/src/widgets/Header/SocialSidebarSection.tsx @@ -25,10 +25,10 @@ const SocialButton = ({ icon: Icon, href, label }: SocialButtonProps) => ( ) -type SocialSidebarSectionProps = { currentPath: string } +type SocialSidebarSectionProps = { currentPath: string, title: string } -export const SocialSidebarSection = (props: SocialSidebarSectionProps) => ( - +export const SocialSidebarSection = ({ currentPath, title }: SocialSidebarSectionProps) => ( + diff --git a/packages/curve-common/src/widgets/Header/types.ts b/packages/curve-common/src/widgets/Header/types.ts index ab31c6c6c..d187de1fa 100644 --- a/packages/curve-common/src/widgets/Header/types.ts +++ b/packages/curve-common/src/widgets/Header/types.ts @@ -1,20 +1,32 @@ -import type { AppName, AppNavSections, AppPage } from 'ui/src/AppNav/types' +import type { AppName, AppPage } from 'ui/src/AppNav/types' import { LanguageSwitcherProps } from '../../features/switch-language' import { ChainSwitcherProps } from '../../features/switch-chain' import { ConnectWalletIndicatorProps } from '../../features/connect-wallet' import { ThemeKey } from 'curve-ui-kit/src/shared/lib' import { Dispatch } from 'react' +export type NavigationSection = { + title: string + links: AppPage[] +} + export type BaseHeaderProps = { currentApp: AppName languages: LanguageSwitcherProps chains: ChainSwitcherProps wallet: ConnectWalletIndicatorProps pages: AppPage[] + sections: NavigationSection[] themes: [ThemeKey, Dispatch] appStats: { label: string, value: string }[] - sections: AppNavSections advancedMode: [boolean, Dispatch] + translations: { + advancedMode: string + themeSwitcher: string + otherApps: string + options: string + socialMedia: string + } } export type HeaderProps = BaseHeaderProps & { diff --git a/packages/ui/src/AppNav/AppNavMobile.tsx b/packages/ui/src/AppNav/AppNavMobile.tsx index 44cf6c40a..4f911f674 100644 --- a/packages/ui/src/AppNav/AppNavMobile.tsx +++ b/packages/ui/src/AppNav/AppNavMobile.tsx @@ -61,6 +61,7 @@ const AppNavMobile = ({ selectNetwork: SelectNetwork, stats, theme, + connectWalletLabel, }: AppNavMobileProps) => { const leftMenuRef = useRef(null) const leftButtonRef = useRef(null) @@ -213,6 +214,7 @@ const AppNavMobile = ({ onConnectWallet={connect.handleClick} onDisconnectWallet={connect.handleClick} walletAddress={connect.walletSignerAddress} + label={connectWalletLabel} /> diff --git a/packages/ui/src/AppNav/types.ts b/packages/ui/src/AppNav/types.ts index 564c8a9c4..f66637aaf 100644 --- a/packages/ui/src/AppNav/types.ts +++ b/packages/ui/src/AppNav/types.ts @@ -75,6 +75,7 @@ export type AppNavMobileProps = { selectNetwork: React.ReactNode stats: AppNavStats theme: AppNavTheme + connectWalletLabel: string } export type AppNavSecondaryProps = { From e0b807d67119e19f8972ce72393ce8d6377a0c25 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 1 Nov 2024 16:43:45 +0100 Subject: [PATCH 057/137] feat: Chinese sites --- apps/lend/src/layout/Footer.tsx | 177 +++--------------- apps/lend/src/layout/Header.tsx | 56 ++---- apps/lend/src/layout/index.tsx | 46 +++-- .../src/widgets/Header/MobileHeader.tsx | 6 +- .../widgets/Header/SocialSidebarSection.tsx | 17 +- .../curve-common/src/widgets/Header/types.ts | 3 +- .../curve-ui-kit/src/shared/ui/DodoIcon.tsx | 10 + 7 files changed, 101 insertions(+), 214 deletions(-) create mode 100644 packages/curve-ui-kit/src/shared/ui/DodoIcon.tsx diff --git a/apps/lend/src/layout/Footer.tsx b/apps/lend/src/layout/Footer.tsx index c7418266c..32b6bf489 100644 --- a/apps/lend/src/layout/Footer.tsx +++ b/apps/lend/src/layout/Footer.tsx @@ -1,122 +1,20 @@ -import { t } from '@lingui/macro' import styled, { css } from 'styled-components' import Image from 'next/image' -import React, { useEffect, useRef } from 'react' +import React, { FunctionComponent, useEffect, useRef } from 'react' import { breakpoints } from '@/ui/utils/responsive' import { sizes } from '@/ui/utils' -import networks from '@/networks' import useStore from '@/store/useStore' import { RCDiscordLogo, RCGithubLogo, RCTelegramLogo, RCTwitterLogo } from '@/images' import Box from '@/ui/Box' -import { ExternalLink, InternalLink } from '@/ui/Link' +import { ExternalLink } from '@/ui/Link' import { useHeightResizeObserver } from '@/ui/hooks' -import { LocaleValue } from '@/common/features/switch-language' +import { NavigationSection } from '@/common/widgets/Header/types' -type InnerSectionProps = { - className?: string - columnCount?: number -} - -export const CommunitySection = ({ - className, - columnCount, - locale, -}: { locale: LocaleValue } & InnerSectionProps) => ( - - - {t`Twitter`} - - - {t`Telegram`} - {locale !== 'en' && ( - <> - {` EN | `} - {t`CN`} - - )} - - {(locale === 'zh-Hans' || locale === 'zh-Hant') && ( - - {t`Dodo`} - - )} - - {t`Discord`} - - - {t`YouTube`} - {locale !== 'en' && ( - <> - {` EN | `} - - {t`CN`} - - - )} - - {(locale === 'zh-Hans' || locale === 'zh-Hant') && ( - - {t`Wiki CN`} - - )} - - {t`Dune Analytics`} - - - {t`Curve Monitor`} - - - {t`Crvhub`} - - -) - -interface ResourcesSectionProps extends InnerSectionProps { - chainId: ChainId | null -} - -export const ResourcesSection = ({ className, columnCount, chainId }: ResourcesSectionProps) => { - const orgUIPath = networks[chainId ?? '1']?.orgUIPath +type FooterProps = { sections: NavigationSection[] } - return ( - - {/**/} - {/* {t`Whitepaper`}*/} - {/**/} - - {t`Resources`} - - - {t`Github`} - - - {t`Developer Docs`} - - - {t`Branding`} - - - {t`Integrations`} - - - {t`Audits`} - - - {t`Contracts`} - - - {t`Bug Bounty`} - - - {t`News`} - - - ) -} - -const Footer = ({ chainId }: { chainId: ChainId }) => { +const Footer: FunctionComponent = ({ sections }) => { const footerRef = useRef(null) const elHeight = useHeightResizeObserver(footerRef) @@ -127,8 +25,6 @@ const Footer = ({ chainId }: { chainId: ChainId }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [elHeight]) - const locale = useStore((state) => state.locale) - return ( @@ -154,52 +50,37 @@ const Footer = ({ chainId }: { chainId: ChainId }) => {
-
- -
-
- -
+ {sections.map((section) => ( +
+ {section.links.map(({ label, route }) => ( + + {label} + + ))} +
+ ))}
) } -interface SectionProps extends InnerSectionProps { +interface SectionProps { + className?: string + columnCount?: number title: React.ReactNode } -const Section = ({ className, title, children }: React.PropsWithChildren) => { - return ( - -
{title}
- {children} -
- ) -} - -const ResourcesWrapper = styled.ul<{ $columnCount?: number }>` - @media (min-width: ${breakpoints.md}rem) { - column-count: ${({ $columnCount }) => $columnCount || 3}; - } -` +const Section = ({ className, title, children }: React.PropsWithChildren) => ( + +
{title}
+ {children} +
+) -const CommunityWrapper = styled.ul<{ $columnCount?: number }>` - @media (min-width: ${breakpoints.md}rem) { - ${({ $columnCount }) => { - if ($columnCount) { - return ` - column-count: ${$columnCount}; - ` - } else { - return ` - min-width: 15rem; //240px - column-count: 2; - ` - } - }} - } +const SectionChildrenWrapper = styled.ul` + @media (min-width: ${breakpoints.md}rem) { column-count: 2 } + @media (min-width: ${breakpoints.lg}rem) { column-count: 3 } ` const FooterLogoWrapper = styled.div` @@ -286,12 +167,6 @@ const ExternalLinkButton = styled(ExternalLink)` ${linkStyles}; ` -const StyledInternalLink = styled(InternalLink)` - ${linkStyles}; - text-transform: inherit; - text-decoration: none; -` - const CurveLogo = styled(Image)` width: 160px; height: 41.59px; diff --git a/apps/lend/src/layout/Header.tsx b/apps/lend/src/layout/Header.tsx index 25a4d860e..0fa82b1b6 100644 --- a/apps/lend/src/layout/Header.tsx +++ b/apps/lend/src/layout/Header.tsx @@ -1,11 +1,9 @@ -import type { AppPage } from '@/ui/AppNav/types' - -import React, { useCallback, useEffect, useMemo, useRef } from 'react' +import React, { FunctionComponent, useCallback, useEffect, useMemo, useRef } from 'react' import { t } from '@lingui/macro' import { useNavigate } from 'react-router-dom' import { CONNECT_STAGE, ROUTE } from '@/constants' -import { DEFAULT_LOCALES } from '@/lib/i18n' +import { DEFAULT_LOCALES, updateAppLocale } from '@/lib/i18n' import { getNetworkFromUrl, getParamsFromUrl, getRestFullPathname, getRestPartialPathname } from '@/utils/utilsRouter' import { _parseRouteAndIsActive, FORMAT_OPTIONS, formatNumber, isLoading } from '@/ui/utils' import { getWalletSignerAddress, useConnectWallet } from '@/common/features/connect-wallet' @@ -15,49 +13,30 @@ import useStore from '@/store/useStore' import { useTvl } from '@/entities/chain' import { Header as NewHeader } from '@/common/widgets/Header' import { ThemeKey } from '@ui-kit/shared/lib' +import { NavigationSection } from '@/common/widgets/Header/types' +import { Locale } from '@/ui/AppNav/types' +type HeaderProps = { chainId: ChainId, sections: NavigationSection[] } -const getSections = (rChainId: ChainId) => [ - { - title: t`Documentation`, - links: [ - { route: 'https://news.curve.fi/', label: t`News` }, - { route: 'https://resources.curve.fi/lending/understanding-lending/', label: t`User Resources` }, - { route: 'https://docs.curve.fi', label: t`Developer Resources` }, - { route: 'https://docs.curve.fi/integration/overview/', label: t`Integrations` }, - { route: 'https://resources.curve.fi/glossary-branding/branding/', label: t`Branding` } - ] - }, - { - title: t`Security`, // audits, bug bounty, dune analytics, curve monitor & crvhub - links: [ - { route: 'https://docs.curve.fi/references/audits/', label: t`Audits` }, - { route: `${networks[rChainId ?? '1']?.orgUIPath}/bugbounty`, label: t`Bug Bounty` }, - { route: 'https://dune.com/mrblock_buidl/Curve.fi', label: t`Dune Analytics` }, - { route: 'https://curvemonitor.com', label: t`Curve Monitor` }, - { route: 'https://crvhub.com/', label: t`Crvhub` } - ] - } -] - -const Header = () => { +const Header: FunctionComponent = ({ chainId, sections }) => { const [{ wallet }] = useConnectWallet() const mainNavRef = useRef(null) const navigate = useNavigate() const elHeight = useHeightResizeObserver(mainNavRef) - const { rChainId, rLocalePathname } = getParamsFromUrl() + const { rLocalePathname } = getParamsFromUrl() const connectState = useStore((state) => state.connectState) const isAdvancedMode = useStore((state) => state.isAdvanceMode) const isMdUp = useStore((state) => state.layout.isMdUp) const locale = useStore((state) => state.locale) + const updateGlobalStoreByKey = useStore((state) => state.updateGlobalStoreByKey) const routerProps = useStore((state) => state.routerProps) const themeType = useStore((state) => state.themeType) const setLayoutHeight = useStore((state) => state.layout.setLayoutHeight) const setAppCache = useStore((state) => state.setAppCache) const updateConnectState = useStore((state) => state.updateConnectState) - const { data: tvl } = useTvl(rChainId); + const { data: tvl } = useTvl(chainId); const { params: routerParams, location } = routerProps ?? {} const routerPathname = location?.pathname ?? '' @@ -70,6 +49,7 @@ const Header = () => { return ( { locale, locales: DEFAULT_LOCALES, onChange: useCallback((selectedLocale: React.Key) => { - const locale = selectedLocale === 'en' ? '' : `/${selectedLocale}` const { rNetwork } = getNetworkFromUrl() - navigate(`${locale}/${rNetwork}/${getRestFullPathname()}`) - }, [navigate]), + updateAppLocale(selectedLocale as Locale, updateGlobalStoreByKey) + navigate(`${selectedLocale === 'en' ? '' : `/${selectedLocale}`}/${rNetwork}/${getRestFullPathname()}`) + }, [updateGlobalStoreByKey, navigate]), }} chains={{ options: visibleNetworksList, disabled: isLoading(connectState, CONNECT_STAGE.SWITCH_NETWORK), - chainId: rChainId, + chainId: chainId, onChange: useCallback((selectedChainId: ChainId) => { - if (rChainId !== selectedChainId) { + if (chainId !== selectedChainId) { const network = networks[selectedChainId as ChainId].id const [currPath] = window.location.hash.split('?') @@ -115,9 +95,9 @@ const Header = () => { navigate(`${rLocalePathname}/${network}/${getRestPartialPathname()}`) } - updateConnectState('loading', CONNECT_STAGE.SWITCH_NETWORK, [rChainId, selectedChainId]) + updateConnectState('loading', CONNECT_STAGE.SWITCH_NETWORK, [chainId, selectedChainId]) } - }, [rChainId, rLocalePathname, updateConnectState, navigate]), + }, [chainId, rLocalePathname, updateConnectState, navigate]), }} wallet={{ onConnectWallet: useCallback(() => updateConnectState('loading', CONNECT_STAGE.CONNECT_WALLET, ['']), [updateConnectState]), @@ -127,7 +107,7 @@ const Header = () => { label: t`Connect Wallet`, }} appStats={[{ label: 'TVL', value: tvl && formatNumber(tvl, { ...FORMAT_OPTIONS.USD, showDecimalIfSmallNumberOnly: true }) || '' }]} - sections={useMemo(() => getSections(rChainId), [rChainId])} + sections={sections} translations={{ advancedMode: t`Advanced`, themeSwitcher: t`Mode`, diff --git a/apps/lend/src/layout/index.tsx b/apps/lend/src/layout/index.tsx index 266eb5e63..55f246421 100644 --- a/apps/lend/src/layout/index.tsx +++ b/apps/lend/src/layout/index.tsx @@ -12,6 +12,9 @@ import Header from '@/layout/Header' import Footer from '@/layout/Footer' import GlobalBanner from '@/ui/Banner' import { useHeightResizeObserver } from '@/ui/hooks' +import { t } from '@lingui/macro' +import networks from '@/networks' +import { Locale } from '@/ui/AppNav/types' const BaseLayout = ({ children }: { children: React.ReactNode }) => { const [{ wallet }] = useConnectWallet() @@ -23,6 +26,7 @@ const BaseLayout = ({ children }: { children: React.ReactNode }) => { const layoutHeight = useStore((state) => state.layout.height) const setLayoutHeight = useStore((state) => state.layout.setLayoutHeight) const updateConnectState = useStore((state) => state.updateConnectState) + const locale = useStore((state) => state.locale) const [networkSwitch, setNetworkSwitch] = useState('') @@ -37,22 +41,14 @@ const BaseLayout = ({ children }: { children: React.ReactNode }) => { updateConnectState('loading', CONNECT_STAGE.SWITCH_NETWORK, [getWalletChainId(wallet), rChainId]) } - const minHeight = useMemo(() => { - let total = 0 - - for (const k of layoutHeightKeys) { - const height = layoutHeight[k] - total += height - } - - return total - }, [layoutHeight]) + const minHeight = useMemo(() => layoutHeightKeys.reduce((total, key) => total + layoutHeight[key], 0), [layoutHeight]) useEffect(() => { setLayoutHeight('globalAlert', elHeight) // eslint-disable-next-line react-hooks/exhaustive-deps }, [elHeight]) + const sections = useMemo(() => getSections(rChainId, locale), [rChainId, locale]) return ( <> { handleNetworkChange={handleNetworkChange} /> -
+
{children}
- {isMdUp &&