From 2c99375a43c005f6b6e7a87c50c5fca808bc506f Mon Sep 17 00:00:00 2001 From: Fabrizio Emanuele Piperno Date: Wed, 25 Sep 2024 18:21:12 +0200 Subject: [PATCH] Publish Stage (#3854) * Amplitude: prevent outlier value usd logs (#3825) * prevent outlier value usd logs * usd const * forgot one * format * Mattupham/fe 726 porfolio v3 alloyed convert button deposit withdraw dropdown (#3841) * Add convert button * Add convert button * Clean up * Handle feature via flag * Update icons * Clean up * Clean up * i18n * Extract functionality * Extract type * Clean up comments * Refactor icon * Clean up styles * Update types * fix: amino signing for withdraw position message (#3852) * add favorites to portfolio (#3853) * Update sprite * Clean up * Update to useUserWatchlist --------- Co-authored-by: Jon Ator Co-authored-by: Matt Upham <30577966+mattupham@users.noreply.github.com> Co-authored-by: PaddyMc --- .../concentratedliquidity/v1beta1/tx.ts | 7 +- .../stores/src/account/amino-converters.ts | 43 ++++ packages/stores/src/account/base.ts | 9 +- .../bridge/amount-and-review-screen.tsx | 18 +- packages/web/components/swap-tool/alt.tsx | 16 +- packages/web/components/swap-tool/index.tsx | 16 +- .../web/components/table/asset-balances.tsx | 223 ++++++++++++++---- packages/web/components/table/cells/asset.tsx | 3 +- packages/web/config/analytics-events.ts | 6 +- .../web/hooks/limit-orders/use-place-limit.ts | 25 +- packages/web/hooks/use-feature-flags.ts | 4 +- packages/web/localizations/de.json | 7 +- packages/web/localizations/en.json | 7 +- packages/web/localizations/es.json | 7 +- packages/web/localizations/fa.json | 7 +- packages/web/localizations/fr.json | 7 +- packages/web/localizations/gu.json | 7 +- packages/web/localizations/hi.json | 7 +- packages/web/localizations/ja.json | 7 +- packages/web/localizations/ko.json | 7 +- packages/web/localizations/pl.json | 7 +- packages/web/localizations/pt-br.json | 7 +- packages/web/localizations/ro.json | 7 +- packages/web/localizations/ru.json | 7 +- packages/web/localizations/tr.json | 7 +- packages/web/localizations/zh-cn.json | 7 +- packages/web/localizations/zh-hk.json | 7 +- packages/web/localizations/zh-tw.json | 7 +- packages/web/public/icons/sprite.svg | 9 +- 29 files changed, 402 insertions(+), 96 deletions(-) diff --git a/packages/proto-codecs/src/codegen/osmosis/concentratedliquidity/v1beta1/tx.ts b/packages/proto-codecs/src/codegen/osmosis/concentratedliquidity/v1beta1/tx.ts index 17c3323bfa..aae9510e02 100644 --- a/packages/proto-codecs/src/codegen/osmosis/concentratedliquidity/v1beta1/tx.ts +++ b/packages/proto-codecs/src/codegen/osmosis/concentratedliquidity/v1beta1/tx.ts @@ -1025,10 +1025,11 @@ export const MsgWithdrawPosition = { if (message.sender !== "") { writer.uint32(18).string(message.sender); } + // NOTE: Withdraw postion will break if we regenerate protos + // if you see this line being removed in a PR, flag it! + // TODO: Abstract to an override function. if (message.liquidityAmount !== "") { - writer - .uint32(26) - .string(Decimal.fromUserInput(message.liquidityAmount, 18).atomics); + writer.uint32(26).string(message.liquidityAmount.replace(".", "")); } return writer; }, diff --git a/packages/stores/src/account/amino-converters.ts b/packages/stores/src/account/amino-converters.ts index 202958398c..caaadc4e59 100644 --- a/packages/stores/src/account/amino-converters.ts +++ b/packages/stores/src/account/amino-converters.ts @@ -1,4 +1,8 @@ import type { AminoMsgTransfer } from "@cosmjs/stargate"; +import type { + MsgWithdrawPosition, + MsgWithdrawPositionAmino, +} from "@osmosis-labs/proto-codecs/build/codegen/osmosis/concentratedliquidity/v1beta1/tx"; import type { MsgTransfer } from "cosmjs-types/ibc/applications/transfer/v1/tx"; import Long from "long"; @@ -46,6 +50,45 @@ export async function getAminoConverters() { : undefined, }), }, + "/osmosis.concentratedliquidity.v1beta1.MsgWithdrawPosition": { + ...originalOsmosisAminoConverters[ + "/osmosis.concentratedliquidity.v1beta1.MsgWithdrawPosition" + ], + aminoType: "osmosis/cl-withdraw-position", + fromAmino(object: MsgWithdrawPositionAmino): MsgWithdrawPosition { + const message = { + positionId: BigInt(0), + sender: "", + liquidityAmount: "", + }; + if (object.position_id !== undefined && object.position_id !== null) { + message.positionId = BigInt(object.position_id); + } + if (object.sender !== undefined && object.sender !== null) { + message.sender = object.sender; + } + if ( + object.liquidity_amount !== undefined && + object.liquidity_amount !== null + ) { + message.liquidityAmount = object.liquidity_amount.replace(".", ""); + } + return message; + }, + toAmino(message: MsgWithdrawPosition): MsgWithdrawPositionAmino { + const obj: any = {}; + obj.position_id = + message.positionId !== BigInt(0) + ? message.positionId.toString() + : undefined; + obj.sender = message.sender === "" ? undefined : message.sender; + obj.liquidity_amount = + message.liquidityAmount === "" + ? undefined + : message.liquidityAmount.replace(".", ""); + return obj; + }, + }, }; const ibcAminoConverters: Record< diff --git a/packages/stores/src/account/base.ts b/packages/stores/src/account/base.ts index 30287d5281..7d24c26428 100644 --- a/packages/stores/src/account/base.ts +++ b/packages/stores/src/account/base.ts @@ -832,15 +832,12 @@ export class AccountStore[] = []> { return typeUrl; }; - // TODO - update proto codec + // @osmosis-labs/proto-codec has been updated for "/osmosis.concentratedliquidity.v1beta1.MsgWithdrawPosition" + // TODO: Copy what's been done there for this message below const doesTxNeedDirectSigning = messages.some( (message) => message.typeUrl === - getTypeUrl( - "/osmosis.concentratedliquidity.v1beta1.MsgWithdrawPosition" - ) || - message.typeUrl === - getTypeUrl("/osmosis.valsetpref.v1beta1.MsgSetValidatorSetPreference") + getTypeUrl("/osmosis.valsetpref.v1beta1.MsgSetValidatorSetPreference") ); const forceSignDirect = doesTxNeedDirectSigning; diff --git a/packages/web/components/bridge/amount-and-review-screen.tsx b/packages/web/components/bridge/amount-and-review-screen.tsx index 733fb02a08..909d335854 100644 --- a/packages/web/components/bridge/amount-and-review-screen.tsx +++ b/packages/web/components/bridge/amount-and-review-screen.tsx @@ -6,7 +6,7 @@ import { useMemo, useState } from "react"; import { getAddress } from "viem"; import { Screen, useScreenManager } from "~/components/screen-manager"; -import { EventName } from "~/config"; +import { EventName, OUTLIER_USD_VALUE_THRESHOLD } from "~/config"; import { useAmplitudeAnalytics } from "~/hooks"; import { BridgeScreen } from "~/hooks/bridge"; import { useEvmWalletAccount } from "~/hooks/evm-wallet"; @@ -342,6 +342,18 @@ export const AmountAndReviewScreen = observer( ? fromChain.chainName : toChain.chainName; + let valueUsd = Number( + q.input.fiatValue.toDec().toString() + ); + // Protect our data from outliers + // Perhaps from upstream issues with price data providers + if ( + isNaN(valueUsd) || + valueUsd > OUTLIER_USD_VALUE_THRESHOLD + ) { + valueUsd = 0; + } + logEvent([ EventName.DepositWithdraw.started, { @@ -352,9 +364,7 @@ export const AmountAndReviewScreen = observer( isRecommendedVariant, network: networkName, transferDirection: direction, - valueUsd: Number( - q.input.fiatValue.toDec().toString() - ), + valueUsd, walletName, }, ]); diff --git a/packages/web/components/swap-tool/alt.tsx b/packages/web/components/swap-tool/alt.tsx index f3107e3e45..ec88970f45 100644 --- a/packages/web/components/swap-tool/alt.tsx +++ b/packages/web/components/swap-tool/alt.tsx @@ -29,7 +29,7 @@ import { tError } from "~/components/localization"; import { TradeDetails } from "~/components/swap-tool/trade-details"; import { GenericDisclaimer } from "~/components/tooltip/generic-disclaimer"; import { Button } from "~/components/ui/button"; -import { EventName, EventPage } from "~/config"; +import { EventName, EventPage, OUTLIER_USD_VALUE_THRESHOLD } from "~/config"; import { useAmplitudeAnalytics, useDisclosure, @@ -214,6 +214,16 @@ export const AltSwapTool: FunctionComponent = observer( const sendSwapTx = () => { if (!swapState.inAmountInput.amount) return; + let valueUsd = Number( + swapState.inAmountInput.fiatValue?.toDec().toString() ?? "0" + ); + + // Protect our data from outliers + // Perhaps from upstream issues with price data providers + if (isNaN(valueUsd) || valueUsd > OUTLIER_USD_VALUE_THRESHOLD) { + valueUsd = 0; + } + const baseEvent = { fromToken: swapState.fromAsset?.coinDenom, tokenAmount: Number(swapState.inAmountInput.amount.toDec().toString()), @@ -223,9 +233,7 @@ export const AltSwapTool: FunctionComponent = observer( ({ pools }) => pools.length !== 1 ), isMultiRoute: (swapState.quote?.split.length ?? 0) > 1, - valueUsd: Number( - swapState.inAmountInput.fiatValue?.toDec().toString() ?? "0" - ), + valueUsd, feeValueUsd: Number(swapState.totalFee?.toString() ?? "0"), page, quoteTimeMilliseconds: swapState.quote?.timeMs, diff --git a/packages/web/components/swap-tool/index.tsx b/packages/web/components/swap-tool/index.tsx index f1c009d0a2..e72e5897ab 100644 --- a/packages/web/components/swap-tool/index.tsx +++ b/packages/web/components/swap-tool/index.tsx @@ -28,7 +28,7 @@ import { Popover } from "~/components/popover"; import { SplitRoute } from "~/components/swap-tool/split-route"; import { InfoTooltip, Tooltip } from "~/components/tooltip"; import { Button } from "~/components/ui/button"; -import { EventName, EventPage } from "~/config"; +import { EventName, EventPage, OUTLIER_USD_VALUE_THRESHOLD } from "~/config"; import { useAmplitudeAnalytics, useDisclosure, @@ -186,6 +186,16 @@ export const SwapTool: FunctionComponent = observer( if (!swapState.inAmountInput.amount) return; + let valueUsd = Number( + swapState.inAmountInput.fiatValue?.toDec().toString() ?? "0" + ); + + // Protect our data from outliers + // Perhaps from upstream issues with price data providers + if (isNaN(valueUsd) || valueUsd > OUTLIER_USD_VALUE_THRESHOLD) { + valueUsd = 0; + } + const baseEvent = { fromToken: swapState.fromAsset?.coinDenom, tokenAmount: Number(swapState.inAmountInput.amount.toDec().toString()), @@ -195,9 +205,7 @@ export const SwapTool: FunctionComponent = observer( ({ pools }) => pools.length !== 1 ), isMultiRoute: (swapState.quote?.split.length ?? 0) > 1, - valueUsd: Number( - swapState.inAmountInput.fiatValue?.toDec().toString() ?? "0" - ), + valueUsd, feeValueUsd: Number(swapState.totalFee?.toString() ?? "0"), page, quoteTimeMilliseconds: swapState.quote?.timeMs, diff --git a/packages/web/components/table/asset-balances.tsx b/packages/web/components/table/asset-balances.tsx index b645d0db4f..92d895596a 100644 --- a/packages/web/components/table/asset-balances.tsx +++ b/packages/web/components/table/asset-balances.tsx @@ -1,3 +1,4 @@ +import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react"; import { Dec } from "@keplr-wallet/unit"; import type { Search } from "@osmosis-labs/server"; import type { SortDirection } from "@osmosis-labs/utils"; @@ -12,7 +13,7 @@ import { useWindowVirtualizer } from "@tanstack/react-virtual"; import classNames from "classnames"; import { observer } from "mobx-react-lite"; import Link from "next/link"; -import { useRouter } from "next/router"; +import { NextRouter, useRouter } from "next/router"; import { FunctionComponent, useCallback, @@ -23,10 +24,13 @@ import { import { useLocalStorage } from "react-use"; import { AssetCell } from "~/components/table/cells/asset"; +import { SpriteIconId } from "~/config"; import { Breakpoint, + MultiLanguageT, useFeatureFlags, useTranslation, + useUserWatchlist, useWalletSelect, useWindowSize, } from "~/hooks"; @@ -56,6 +60,8 @@ type SortKey = NonNullable< RouterInputs["edge"]["assets"]["getUserBridgeAssets"]["sort"] >["keyPath"]; +type Action = "deposit" | "withdraw" | "trade" | "earn"; + const DUST_THRESHOLD = new Dec(0.01); export const AssetBalancesTable: FunctionComponent<{ @@ -70,8 +76,6 @@ export const AssetBalancesTable: FunctionComponent<{ const { t } = useTranslation(); const featureFlags = useFeatureFlags(); - // State - // search const [searchQuery, setSearchQuery] = useState(); const onSearchInput = useCallback((input: string) => { @@ -166,6 +170,8 @@ export const AssetBalancesTable: FunctionComponent<{ const noSearchResults = Boolean(searchQuery) && !filteredAssetsData.length; + const { watchListDenoms, toggleWatchAssetDenom } = useUserWatchlist(); + // Define columns const columns = useMemo(() => { const columnHelper = createColumnHelper(); @@ -177,6 +183,8 @@ export const AssetBalancesTable: FunctionComponent<{ toggleWatchAssetDenom(asset.coinDenom)} /> ), }), @@ -222,7 +230,15 @@ export const AssetBalancesTable: FunctionComponent<{ ), }), ]; - }, [sortKey, sortDirection, showUnverifiedAssets, setSortKey, t]); + }, [ + sortKey, + sortDirection, + showUnverifiedAssets, + setSortKey, + t, + watchListDenoms, + toggleWatchAssetDenom, + ]); /** Columns collapsed for screen size responsiveness. */ const collapsedColumns = useMemo(() => { @@ -490,6 +506,48 @@ const PriceCell: AssetCellComponent = ({ currentPrice, priceChange24h }) => ( ); +const getActionOptions = (t: MultiLanguageT, showConvertButton: boolean) => { + return [ + ...(showConvertButton + ? [ + { key: "deposit", label: t("portfolio.deposit"), icon: "deposit" }, + { key: "withdraw", label: t("portfolio.withdraw"), icon: "withdraw" }, + ] + : []), + { key: "trade", label: t("portfolio.trade"), icon: "arrows-swap" }, + { key: "earn", label: t("portfolio.earn"), icon: "chart-up" }, + ] as Array<{ key: Action; label: string; icon: SpriteIconId }>; +}; + +const handleSelectAction = ( + action: Action, + coinDenom: string, + router: NextRouter, + bridgeAsset: ({ + anyDenom, + direction, + }: { + anyDenom: string | undefined; + direction: "deposit" | "withdraw" | undefined; + }) => void +) => { + if (action === "trade") { + router.push(`/assets/${coinDenom}`); + } else if (action === "earn") { + router.push(`/earn?search=${coinDenom}`); + } else if (action === "deposit") { + bridgeAsset({ + anyDenom: coinDenom, + direction: "deposit", + }); + } else if (action === "withdraw") { + bridgeAsset({ + anyDenom: coinDenom, + direction: "withdraw", + }); + } +}; + export const AssetActionsCell: AssetCellComponent<{ showUnverifiedAssetsSetting?: boolean; confirmUnverifiedAsset: (asset: { @@ -499,69 +557,148 @@ export const AssetActionsCell: AssetCellComponent<{ }> = ({ coinDenom, coinImageUrl, - amount, isVerified, showUnverifiedAssetsSetting, confirmUnverifiedAsset, + coinMinimalDenom, + variantGroupKey, }) => { const { t } = useTranslation(); + const router = useRouter(); + const featureFlags = useFeatureFlags(); const bridgeAsset = useBridgeStore((state) => state.bridgeAsset); const needsActivation = !isVerified && !showUnverifiedAssetsSetting; + const needsConversion = coinMinimalDenom !== variantGroupKey; + const showConvertButton = featureFlags.alloyedAssets && needsConversion; + + const actionOptions = getActionOptions(t, showConvertButton); return (
{needsActivation && ( )} -
- {!needsActivation && ( - - )} - {!needsActivation && amount?.toDec().isPositive() && ( - - )} -
+ {!needsActivation && ( +
+ {showConvertButton ? ( + + ) : ( + <> + + + + )} + + handleSelectAction(action, coinDenom, router, bridgeAsset) + } + /> +
+ )}
); }; + +const AssetActionsDropdown: FunctionComponent<{ + actionOptions: { + key: Action; + label: string; + icon: SpriteIconId; + }[]; + onSelectAction: (key: Action) => void; +}> = ({ actionOptions, onSelectAction }) => { + return ( + + {() => ( + <> + + + + + + {({ close }) => ( +
+ {actionOptions.map(({ key, label, icon }) => ( + + ))} +
+ )} +
+ + )} +
+ ); +}; diff --git a/packages/web/components/table/cells/asset.tsx b/packages/web/components/table/cells/asset.tsx index e24134e94d..5fbc806eb4 100644 --- a/packages/web/components/table/cells/asset.tsx +++ b/packages/web/components/table/cells/asset.tsx @@ -34,14 +34,13 @@ export const AssetCell: FunctionComponent< onClick={(e) => { e.stopPropagation(); e.preventDefault(); - onClickWatchlist(); }} className={classNames( "cursor-pointer transition-colors duration-150 ease-out hover:text-wosmongton-300", isInUserWatchlist ? "text-wosmongton-400" : "text-osmoverse-600" )} - id="star" + id={isInUserWatchlist ? "star" : "star-outlined"} /> )} diff --git a/packages/web/config/analytics-events.ts b/packages/web/config/analytics-events.ts index ba6b1f92a1..28b5505fa4 100644 --- a/packages/web/config/analytics-events.ts +++ b/packages/web/config/analytics-events.ts @@ -1,11 +1,11 @@ /** # User Events Constants * Logged to Amplitude at https://analytics.amplitude.com/osmosis-zone/ */ - import { AllocationOptions } from "~/components/complex/portfolio/types"; -// Should be in sync with: https://docs.google.com/spreadsheets/d/18w8VwJmmRdb_E-XkE1UjkqhLxCyhqVVhWlzDgTtbRWo/edit?usp=sharing -// For maintainability - all event logs should be in high level component +/** Max value of USD event to check against to prevent + * outliers from corrupting dashboards. */ +export const OUTLIER_USD_VALUE_THRESHOLD = 1_500_000; export type AmountDefault = "half" | "max" | "input"; diff --git a/packages/web/hooks/limit-orders/use-place-limit.ts b/packages/web/hooks/limit-orders/use-place-limit.ts index 8d58e58991..7ddfcf1efd 100644 --- a/packages/web/hooks/limit-orders/use-place-limit.ts +++ b/packages/web/hooks/limit-orders/use-place-limit.ts @@ -6,7 +6,7 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { useAsync } from "react-use"; import { tError } from "~/components/localization"; -import { EventName, EventPage } from "~/config"; +import { EventName, EventPage, OUTLIER_USD_VALUE_THRESHOLD } from "~/config"; import { isValidNumericalRawInput, useAmountInput, @@ -283,6 +283,16 @@ export const usePlaceLimit = ({ } if (isMarket) { + let valueUsd = Number( + marketState.inAmountInput.fiatValue?.toDec().toString() ?? "0" + ); + + // Protect our data from outliers + // Perhaps from upstream issues with price data providers + if (isNaN(valueUsd) || valueUsd > OUTLIER_USD_VALUE_THRESHOLD) { + valueUsd = 0; + } + const baseEvent = { fromToken: marketState.fromAsset?.coinDenom, tokenAmount: Number( @@ -294,9 +304,7 @@ export const usePlaceLimit = ({ ({ pools }) => pools.length !== 1 ), isMultiRoute: (marketState.quote?.split.length ?? 0) > 1, - valueUsd: Number( - marketState.inAmountInput.fiatValue?.toDec().toString() ?? "0" - ), + valueUsd, feeValueUsd: Number(marketState.totalFee?.toString() ?? "0"), page, quoteTimeMilliseconds: marketState.quote?.timeMs, @@ -328,12 +336,19 @@ export const usePlaceLimit = ({ const paymentDenom = paymentTokenValue?.toCoin().denom ?? ""; + let valueUsd = Number(paymentFiatValue?.toDec().toString() ?? "0"); + // Protect our data from outliers + // Perhaps from upstream issues with price data providers + if (isNaN(valueUsd) || valueUsd > OUTLIER_USD_VALUE_THRESHOLD) { + valueUsd = 0; + } + const baseEvent = { type: orderDirection === "bid" ? "buy" : "sell", fromToken: paymentDenom, toToken: orderDirection === "bid" ? baseAsset?.coinDenom : quoteAsset?.coinDenom, - valueUsd: Number(paymentFiatValue?.toDec().toString() ?? "0"), + valueUsd, tokenAmount: Number(quantity), page, isOnHomePage: page === "Swap Page", diff --git a/packages/web/hooks/use-feature-flags.ts b/packages/web/hooks/use-feature-flags.ts index 93321039e8..17982c8846 100644 --- a/packages/web/hooks/use-feature-flags.ts +++ b/packages/web/hooks/use-feature-flags.ts @@ -31,7 +31,8 @@ export type AvailableFlags = | "cypherCard" | "newPortfolioPage" | "inGivenOut" - | "sqsActiveOrders"; + | "sqsActiveOrders" + | "alloyedAssets"; const defaultFlags: Record = { staking: true, @@ -58,6 +59,7 @@ const defaultFlags: Record = { newPortfolioPage: false, inGivenOut: false, sqsActiveOrders: false, + alloyedAssets: false, }; const LIMIT_ORDER_COUNTRY_CODES = diff --git a/packages/web/localizations/de.json b/packages/web/localizations/de.json index aa35255dcb..9d2c38ed83 100644 --- a/packages/web/localizations/de.json +++ b/packages/web/localizations/de.json @@ -286,7 +286,12 @@ "last7d": "Letzte 7 Tage", "last30d": "Letzte 30 Tage", "last1y": "Letztes 1 Jahr", - "allTime": "Alle Zeit" + "allTime": "Alle Zeit", + "trade": "Handel", + "earn": "Verdienen", + "deposit": "Kaution", + "withdraw": "Zurückziehen", + "convert": "Konvertieren" }, "buyTokens": "Kaufen Sie Token", "components": { diff --git a/packages/web/localizations/en.json b/packages/web/localizations/en.json index da145e1d51..3f02088b6a 100644 --- a/packages/web/localizations/en.json +++ b/packages/web/localizations/en.json @@ -286,7 +286,12 @@ "last7d": "Last 7d", "last30d": "Last 30d", "last1y": "Last 1y", - "allTime": "All time" + "allTime": "All time", + "trade": "Trade", + "earn": "Earn", + "deposit": "Deposit", + "withdraw": "Withdraw", + "convert": "Convert" }, "buyTokens": "Buy tokens", "components": { diff --git a/packages/web/localizations/es.json b/packages/web/localizations/es.json index 30ee2bc4bd..94c7aee4f8 100644 --- a/packages/web/localizations/es.json +++ b/packages/web/localizations/es.json @@ -286,7 +286,12 @@ "last7d": "Últimos 7 días", "last30d": "Últimos 30 días", "last1y": "Último 1 año", - "allTime": "Todo el tiempo" + "allTime": "Todo el tiempo", + "trade": "Comercio", + "earn": "Ganar", + "deposit": "Depósito", + "withdraw": "Retirar", + "convert": "Convertir" }, "buyTokens": "Comprar fichas", "components": { diff --git a/packages/web/localizations/fa.json b/packages/web/localizations/fa.json index 605ea2316b..799d0d212b 100644 --- a/packages/web/localizations/fa.json +++ b/packages/web/localizations/fa.json @@ -286,7 +286,12 @@ "last7d": "7 روز گذشته", "last30d": "30 روز گذشته", "last1y": "1 سال گذشته", - "allTime": "تمام زمان" + "allTime": "تمام زمان", + "trade": "تجارت", + "earn": "کسب درآمد", + "deposit": "سپرده گذاری", + "withdraw": "برداشت", + "convert": "تبدیل کنید" }, "buyTokens": "خرید توکن", "components": { diff --git a/packages/web/localizations/fr.json b/packages/web/localizations/fr.json index 373f07d62c..5e17adaf76 100644 --- a/packages/web/localizations/fr.json +++ b/packages/web/localizations/fr.json @@ -286,7 +286,12 @@ "last7d": "Derniers 7 jours", "last30d": "Les 30 derniers jours", "last1y": "Dernière année", - "allTime": "Tout le temps" + "allTime": "Tout le temps", + "trade": "Commerce", + "earn": "Gagner", + "deposit": "Dépôt", + "withdraw": "Retirer", + "convert": "Convertir" }, "buyTokens": "Acheter jetons", "components": { diff --git a/packages/web/localizations/gu.json b/packages/web/localizations/gu.json index 2d4e0cd0b8..66b868f96c 100644 --- a/packages/web/localizations/gu.json +++ b/packages/web/localizations/gu.json @@ -286,7 +286,12 @@ "last7d": "ગત તા", "last30d": "છેલ્લા 30 ડી", "last1y": "છેલ્લા 1 વર્ષ", - "allTime": "બધા સમય" + "allTime": "બધા સમય", + "trade": "વેપાર", + "earn": "કમાઓ", + "deposit": "જમા", + "withdraw": "ઉપાડો", + "convert": "કન્વર્ટ કરો" }, "buyTokens": "ટોકન્સ ખરીદો", "components": { diff --git a/packages/web/localizations/hi.json b/packages/web/localizations/hi.json index 917ad65f13..eb53d3938c 100644 --- a/packages/web/localizations/hi.json +++ b/packages/web/localizations/hi.json @@ -286,7 +286,12 @@ "last7d": "अंतिम 7 दिन", "last30d": "अंतिम 30 दिन", "last1y": "पिछले 1 वर्ष", - "allTime": "पूरे समय" + "allTime": "पूरे समय", + "trade": "व्यापार", + "earn": "कमाना", + "deposit": "जमा", + "withdraw": "निकालना", + "convert": "बदलना" }, "buyTokens": "टोकन खरीदें", "components": { diff --git a/packages/web/localizations/ja.json b/packages/web/localizations/ja.json index 2cf40ebc21..e66a7caf5d 100644 --- a/packages/web/localizations/ja.json +++ b/packages/web/localizations/ja.json @@ -286,7 +286,12 @@ "last7d": "過去7日間", "last30d": "過去30日間", "last1y": "過去1年間", - "allTime": "これまで" + "allTime": "これまで", + "trade": "貿易", + "earn": "得る", + "deposit": "デポジット", + "withdraw": "撤回する", + "convert": "変換する" }, "buyTokens": "トークンを購入する", "components": { diff --git a/packages/web/localizations/ko.json b/packages/web/localizations/ko.json index 38b5785dd2..a780d5df76 100644 --- a/packages/web/localizations/ko.json +++ b/packages/web/localizations/ko.json @@ -286,7 +286,12 @@ "last7d": "지난 7일", "last30d": "지난 30일", "last1y": "지난 1년", - "allTime": "모든 시간" + "allTime": "모든 시간", + "trade": "거래", + "earn": "벌다", + "deposit": "보증금", + "withdraw": "철회하다", + "convert": "전환하다" }, "buyTokens": "토큰 구매", "components": { diff --git a/packages/web/localizations/pl.json b/packages/web/localizations/pl.json index 2da0cfe4f1..01c2f2f46b 100644 --- a/packages/web/localizations/pl.json +++ b/packages/web/localizations/pl.json @@ -286,7 +286,12 @@ "last7d": "Ostatnie 7 dni", "last30d": "Ostatnie 30 dni", "last1y": "Ostatni 1 rok", - "allTime": "Cały czas" + "allTime": "Cały czas", + "trade": "Handel", + "earn": "Zarabiać", + "deposit": "Depozyt", + "withdraw": "Wycofać", + "convert": "Konwertować" }, "buyTokens": "Kup tokeny", "components": { diff --git a/packages/web/localizations/pt-br.json b/packages/web/localizations/pt-br.json index e312cde97e..4dfc632585 100644 --- a/packages/web/localizations/pt-br.json +++ b/packages/web/localizations/pt-br.json @@ -286,7 +286,12 @@ "last7d": "Últimos 7d", "last30d": "Últimos 30d", "last1y": "Último 1 ano", - "allTime": "Todos os tempos" + "allTime": "Todos os tempos", + "trade": "Troca", + "earn": "Ganhar", + "deposit": "Depósito", + "withdraw": "Retirar", + "convert": "Converter" }, "buyTokens": "Comprar tokens", "components": { diff --git a/packages/web/localizations/ro.json b/packages/web/localizations/ro.json index 51748fd19b..bfc5f65f41 100644 --- a/packages/web/localizations/ro.json +++ b/packages/web/localizations/ro.json @@ -286,7 +286,12 @@ "last7d": "Ultimele 7 zile", "last30d": "Ultimele 30 de zile", "last1y": "Ultimul 1 an", - "allTime": "Tot timpul" + "allTime": "Tot timpul", + "trade": "Comerț", + "earn": "Câştiga", + "deposit": "Depozit", + "withdraw": "Retrage", + "convert": "Convertit" }, "buyTokens": "Cumpărați jetoane", "components": { diff --git a/packages/web/localizations/ru.json b/packages/web/localizations/ru.json index 876168962c..86ceb573da 100644 --- a/packages/web/localizations/ru.json +++ b/packages/web/localizations/ru.json @@ -286,7 +286,12 @@ "last7d": "Последние 7дн.", "last30d": "Последние 30 дней", "last1y": "Последний 1 год", - "allTime": "Все время" + "allTime": "Все время", + "trade": "Торговля", + "earn": "Зарабатывать", + "deposit": "Депозит", + "withdraw": "Отзывать", + "convert": "Конвертировать" }, "buyTokens": "Купить токены", "components": { diff --git a/packages/web/localizations/tr.json b/packages/web/localizations/tr.json index 86c06b5b6b..fcce3c466a 100644 --- a/packages/web/localizations/tr.json +++ b/packages/web/localizations/tr.json @@ -286,7 +286,12 @@ "last7d": "Son 7 gün", "last30d": "Son 30 gün", "last1y": "Son 1y", - "allTime": "Tüm zamanlar" + "allTime": "Tüm zamanlar", + "trade": "Ticaret", + "earn": "Para kazanmak", + "deposit": "Depozito", + "withdraw": "Geri çekilmek", + "convert": "Dönüştürmek" }, "buyTokens": "jeton satın al", "components": { diff --git a/packages/web/localizations/zh-cn.json b/packages/web/localizations/zh-cn.json index 1d6b5bbd10..e1fbe4a930 100644 --- a/packages/web/localizations/zh-cn.json +++ b/packages/web/localizations/zh-cn.json @@ -286,7 +286,12 @@ "last7d": "过去 7 天", "last30d": "过去 30 天", "last1y": "过去 1 年", - "allTime": "所有时间" + "allTime": "所有时间", + "trade": "贸易", + "earn": "赚", + "deposit": "订金", + "withdraw": "提取", + "convert": "转变" }, "buyTokens": "购买代币", "components": { diff --git a/packages/web/localizations/zh-hk.json b/packages/web/localizations/zh-hk.json index cf33c2a51d..8e4538b722 100644 --- a/packages/web/localizations/zh-hk.json +++ b/packages/web/localizations/zh-hk.json @@ -286,7 +286,12 @@ "last7d": "過去 7 天", "last30d": "過去30天", "last1y": "過去 1 年", - "allTime": "所有時間" + "allTime": "所有時間", + "trade": "貿易", + "earn": "賺", + "deposit": "訂金", + "withdraw": "提取", + "convert": "轉變" }, "buyTokens": "購買代幣", "components": { diff --git a/packages/web/localizations/zh-tw.json b/packages/web/localizations/zh-tw.json index cfa348fc45..1b498c6a18 100644 --- a/packages/web/localizations/zh-tw.json +++ b/packages/web/localizations/zh-tw.json @@ -286,7 +286,12 @@ "last7d": "過去 7 天", "last30d": "過去30天", "last1y": "過去 1 年", - "allTime": "所有時間" + "allTime": "所有時間", + "trade": "貿易", + "earn": "賺", + "deposit": "訂金", + "withdraw": "提取", + "convert": "轉變" }, "buyTokens": "購買代幣", "components": { diff --git a/packages/web/public/icons/sprite.svg b/packages/web/public/icons/sprite.svg index 23ae925294..1758138b8d 100644 --- a/packages/web/public/icons/sprite.svg +++ b/packages/web/public/icons/sprite.svg @@ -877,11 +877,9 @@ /> - - + @@ -1598,5 +1596,8 @@ + + +