move routes loading to parent

This commit is contained in:
saml33 2022-07-18 20:02:43 +10:00
parent 40a9fd4c08
commit c4c8cb60f8
46 changed files with 223 additions and 1056 deletions

View File

@ -31,18 +31,27 @@ const Button: FunctionComponent<ButtonProps> = ({
)
}
export const IconButton: FunctionComponent<ButtonProps> = ({
interface IconButtonProps {
hideBg?: boolean
}
type IconButtonCombinedProps = ButtonProps & IconButtonProps
export const IconButton: FunctionComponent<IconButtonCombinedProps> = ({
children,
onClick,
disabled = false,
className,
hideBg,
...props
}) => {
return (
<button
onClick={onClick}
disabled={disabled}
className={`${className} flex h-7 w-7 items-center justify-center rounded-full bg-th-bkg-4 text-th-fgd-1 focus:outline-none disabled:cursor-not-allowed disabled:bg-th-bkg-4
className={`${className} flex h-7 w-7 items-center justify-center rounded-full ${
hideBg ? '' : 'bg-th-bkg-4'
} text-th-fgd-1 focus:outline-none disabled:cursor-not-allowed disabled:bg-th-bkg-4
disabled:text-th-fgd-4 md:hover:text-th-primary md:disabled:hover:text-th-fgd-4`}
{...props}
>

View File

@ -1,15 +1,16 @@
import { useEffect, useState } from 'react'
import { Dispatch, SetStateAction, useState } from 'react'
import { TransactionInstruction, PublicKey } from '@solana/web3.js'
import { toUiDecimals } from '@blockworks-foundation/mango-v4'
import { Jupiter, RouteInfo } from '@jup-ag/core'
import mangoStore, { CLUSTER } from '../../store/state'
import mangoStore from '../../store/state'
import RoutesModal from './RoutesModal'
import RouteFeeInfo from './RouteFeeInfo'
import { TokenInfo } from '../../types/jupiter'
import Button, { IconButton } from '../shared/Button'
import Loading from '../shared/Loading'
import { XIcon } from '@heroicons/react/solid'
import { ArrowRightIcon, XIcon } from '@heroicons/react/solid'
import { useTranslation } from 'next-i18next'
type JupiterRoutesProps = {
inputToken: string
@ -20,6 +21,11 @@ type JupiterRoutesProps = {
handleSwap: (x: TransactionInstruction[]) => void
setAmountOut: (x?: number) => void
onClose: () => void
jupiter: Jupiter | undefined
routes: RouteInfo[] | undefined
outputTokenInfo: TokenInfo | undefined
selectedRoute: RouteInfo | undefined
setSelectedRoute: Dispatch<SetStateAction<RouteInfo | undefined>>
}
const parseJupiterRoute = async (
@ -44,25 +50,20 @@ const parseJupiterRoute = async (
return instructions
}
const getBestRoute = (routesInfos: RouteInfo[]) => {
return routesInfos[0]
}
const JupiterRoutes = ({
inputToken,
outputToken,
amountIn,
slippage,
handleSwap,
submitting,
setAmountOut,
onClose,
jupiter,
routes,
outputTokenInfo,
selectedRoute,
setSelectedRoute,
}: JupiterRoutesProps) => {
const [jupiter, setJupiter] = useState<Jupiter>()
const [routes, setRoutes] = useState<RouteInfo[]>()
const [selectedRoute, setSelectedRoute] = useState<RouteInfo>()
const { t } = useTranslation('trade')
const [showRoutesModal, setShowRoutesModal] = useState(false)
const [outputTokenInfo, setOutputTokenInfo] = useState<TokenInfo>()
const mangoAccount = mangoStore((s) => s.mangoAccount)
const onSwap = async () => {
@ -75,72 +76,15 @@ const JupiterRoutes = ({
handleSwap(ixs)
}
useEffect(() => {
const connection = mangoStore.getState().connection
const loadJupiter = async () => {
const jupiter = await Jupiter.load({
connection,
cluster: CLUSTER,
// platformFeeAndAccounts: NO_PLATFORM_FEE,
routeCacheDuration: 5_000, // Will not refetch data on computeRoutes for up to 10 seconds
})
setJupiter(jupiter)
}
loadJupiter()
}, [])
useEffect(() => {
const group = mangoStore.getState().group
if (!group) return
const tokens = mangoStore.getState().jupiterTokens
const loadRoutes = async () => {
const inputBank = group!.banksMap.get(inputToken)
const outputBank = group!.banksMap.get(outputToken)
if (!inputBank || !outputBank) return
if (!amountIn) {
setAmountOut()
setSelectedRoute(undefined)
} else {
const computedRoutes = await jupiter?.computeRoutes({
inputMint: inputBank.mint, // Mint address of the input token
outputMint: outputBank.mint, // Mint address of the output token
inputAmount: amountIn * 10 ** inputBank.mintDecimals, // raw input amount of tokens
slippage, // The slippage in % terms
filterTopNResult: 10,
onlyDirectRoutes: true,
})
const tokenOut = tokens.find(
(t: any) => t.address === outputBank.mint.toString()
)
setOutputTokenInfo(tokenOut)
const routesInfosWithoutRaydium = computedRoutes?.routesInfos.filter(
(r) => {
if (r.marketInfos.length > 1) {
for (const mkt of r.marketInfos) {
if (mkt.amm.label === 'Raydium') return false
}
}
return true
}
)
if (routesInfosWithoutRaydium?.length) {
setRoutes(routesInfosWithoutRaydium)
const bestRoute = getBestRoute(computedRoutes!.routesInfos)
setSelectedRoute(bestRoute)
setAmountOut(toUiDecimals(bestRoute.outAmount, tokenOut?.decimals))
}
}
}
loadRoutes()
}, [inputToken, outputToken, jupiter, slippage, amountIn])
return routes?.length && selectedRoute && outputTokenInfo ? (
<div>
<>
<IconButton className="absolute top-2 left-2" onClick={onClose}>
<XIcon className="h-5 w-5" />
<IconButton
className="absolute top-2 right-2 text-th-fgd-3"
onClick={onClose}
hideBg
>
<ArrowRightIcon className="h-5 w-5" />
</IconButton>
<RouteFeeInfo
selectedRoute={selectedRoute}
@ -171,13 +115,11 @@ const JupiterRoutes = ({
className="flex w-full justify-center py-3 text-lg"
>
{submitting ? <Loading className="mr-2 h-5 w-5" /> : null}
Confirm Trade
{t('trade:confirm-trade')}
</Button>
</div>
</div>
) : (
<Loading />
)
) : null
}
export default JupiterRoutes

View File

@ -1,16 +1,11 @@
import {
ArrowSmRightIcon,
ChevronRightIcon,
CogIcon,
InformationCircleIcon,
RefreshIcon,
SwitchHorizontalIcon,
} from '@heroicons/react/solid'
import { SwitchHorizontalIcon } from '@heroicons/react/solid'
import { RouteInfo, TransactionFeeInfo } from '@jup-ag/core'
import { useTranslation } from 'next-i18next'
import { useEffect, useState } from 'react'
import mangoStore from '../../store/state'
import { TokenInfo } from '../../types/jupiter'
import { formatDecimal } from '../../utils/numbers'
import Button from '../shared/Button'
type RouteFeeInfoProps = {
selectedRoute: RouteInfo
@ -29,6 +24,7 @@ const RouteFeeInfo = ({
inputTokenSymbol,
showRoutesModal,
}: RouteFeeInfoProps) => {
const { t } = useTranslation(['common', 'trade'])
const tokens = mangoStore.getState().jupiterTokens
const connected = mangoStore((s) => s.connected)
@ -49,18 +45,18 @@ const RouteFeeInfo = ({
}, [selectedRoute, connected])
return (
<div className="space-y-2 px-1 text-xs text-th-fgd-4">
<div className="space-y-4 px-1">
<div className="mb-4 flex items-center justify-between">
<div className="text-sm font-bold text-th-fgd-1">Swap Details</div>
<h3>{t('trade:review-trade')}</h3>
</div>
<div className="flex items-center justify-between">
<span>Swap Route</span>
<div
className="flex items-center rounded border border-th-bkg-4 p-1 pl-2 hover:cursor-pointer hover:border-th-fgd-4"
role="button"
<p className="text-th-fgd-3">{t('liquidity')}</p>
<Button
className="pt-1 pb-1 pl-3 pr-3"
onClick={showRoutesModal}
secondary
>
<span className="overflow-ellipsis whitespace-nowrap text-th-fgd-1">
<p className="overflow-ellipsis whitespace-nowrap text-th-fgd-1">
{selectedRoute?.marketInfos.map((info, index) => {
let includeSeparator = false
if (
@ -70,21 +66,20 @@ const RouteFeeInfo = ({
includeSeparator = true
}
return (
<span key={index}>{`${info.amm.label} ${
<p key={index}>{`${info.amm.label} ${
includeSeparator ? 'x ' : ''
}`}</span>
}`}</p>
)
})}
</span>
<ChevronRightIcon className="ml-2 h-3 w-3" />
</div>
</p>
</Button>
</div>
{amountOut && amountIn ? (
<div className="flex justify-between">
<span>Rate</span>
<p className="text-th-fgd-3">{t('trade:rate')}</p>
<div>
<div className="flex items-center justify-end">
<div className="text-right text-th-fgd-1">
<p className="text-right font-bold text-th-fgd-1">
{swapRate ? (
<>
1 {inputTokenSymbol} {' '}
@ -97,7 +92,7 @@ const RouteFeeInfo = ({
{formatDecimal(amountIn / amountOut, 6)} {inputTokenSymbol}
</>
)}
</div>
</p>
<SwitchHorizontalIcon
className="default-transition ml-1 h-4 w-4 cursor-pointer text-th-fgd-3 hover:text-th-fgd-2"
onClick={() => setSwapRate(!swapRate)}
@ -140,33 +135,41 @@ const RouteFeeInfo = ({
</div>
) : null}
<div className="flex justify-between">
<span>Price Impact</span>
<div className="text-right text-th-fgd-1">
{selectedRoute?.priceImpactPct * 100 < 0.1
? '< 0.1%'
: `~ ${(selectedRoute?.priceImpactPct * 100).toFixed(4)}%`}
</div>
</div>
<div className="flex justify-between">
<span>Minimum Received</span>
<p className="text-th-fgd-3">{t('trade:minimum-received')}</p>
{outputTokenInfo?.decimals ? (
<div className="text-right text-th-fgd-1">
<p className="text-right font-bold text-th-fgd-1">
{formatDecimal(
selectedRoute?.outAmountWithSlippage /
10 ** outputTokenInfo.decimals || 1,
6
)}{' '}
{outputTokenInfo?.symbol}
</div>
</p>
) : null}
</div>
<div className="flex justify-between">
<p className="text-th-fgd-3">{t('trade:health-impact')}</p>
<p className="text-right font-bold text-th-fgd-1">0%</p>
</div>
<div className="flex justify-between">
<p className="text-th-fgd-3">{t('trade:est-liq-price')}</p>
<p className="text-right font-bold text-th-fgd-1">N/A</p>
</div>
<div className="flex justify-between">
<p className="text-th-fgd-3">{t('trade:slippage')}</p>
<p className="text-right font-bold text-th-fgd-1">
{selectedRoute?.priceImpactPct * 100 < 0.1
? '< 0.1%'
: `~ ${(selectedRoute?.priceImpactPct * 100).toFixed(4)}%`}
</p>
</div>
{typeof feeValue === 'number' ? (
<div className="flex justify-between">
<span>Swap fee</span>
<p className="text-th-fgd-3">{t('fee')}</p>
<div className="flex items-center">
<div className="text-right text-th-fgd-1">
<p className="text-right font-bold text-th-fgd-1">
${feeValue?.toFixed(2)}
</div>
</p>
</div>
</div>
) : (
@ -176,14 +179,18 @@ const RouteFeeInfo = ({
)
return (
<div className="flex justify-between" key={index}>
<span>Fees paid to {info?.amm?.label}</span>
<p className="text-th-fgd-3">
{t('trade:fees-paid-to', {
route: info?.amm?.label,
})}
</p>
{feeToken?.decimals && (
<div className="text-right text-th-fgd-1">
<p className="text-right font-bold text-th-fgd-1">
{(
info.lpFee?.amount / Math.pow(10, feeToken.decimals)
).toFixed(6)}{' '}
{feeToken?.symbol} ({info.lpFee?.pct * 100}%)
</div>
</p>
)}
</div>
)

View File

@ -134,7 +134,11 @@ const SelectToken = ({
return (
<>
<p className="mb-3">{type === 'input' ? t('sell') : t('buy')}</p>
<IconButton className="absolute top-2 right-2" onClick={() => onClose()}>
<IconButton
className="absolute top-2 right-2"
onClick={() => onClose()}
hideBg
>
<XIcon className="h-5 w-5" />
</IconButton>
<div className="flex items-center text-th-fgd-4">

View File

@ -1,7 +1,9 @@
import { useState, ChangeEvent, useCallback, Fragment, useEffect } from 'react'
import { TransactionInstruction } from '@solana/web3.js'
import { ArrowDownIcon, XIcon } from '@heroicons/react/solid'
import mangoStore from '../../store/state'
import mangoStore, { CLUSTER } from '../../store/state'
import { Jupiter, RouteInfo } from '@jup-ag/core'
import { TokenInfo } from '../../types/jupiter'
import ContentBox from '../shared/ContentBox'
import { notify } from '../../utils/notifications'
import JupiterRoutes from './JupiterRoutes'
@ -16,9 +18,19 @@ import { Transition } from '@headlessui/react'
import Switch from '../forms/Switch'
import Button, { IconButton, LinkButton } from '../shared/Button'
import ButtonGroup from '../forms/ButtonGroup'
import { toUiDecimals } from '@blockworks-foundation/mango-v4'
import Loading from '../shared/Loading'
const getBestRoute = (routesInfos: RouteInfo[]) => {
return routesInfos[0]
}
const Swap = () => {
const { t } = useTranslation('common')
const [jupiter, setJupiter] = useState<Jupiter>()
const [selectedRoute, setSelectedRoute] = useState<RouteInfo>()
const [outputTokenInfo, setOutputTokenInfo] = useState<TokenInfo>()
const [routes, setRoutes] = useState<RouteInfo[]>()
const [amountIn, setAmountIn] = useState('')
const [amountOut, setAmountOut] = useState<number>()
const [inputToken, setInputToken] = useState('SOL')
@ -35,6 +47,67 @@ const Swap = () => {
const tokens = mangoStore((s) => s.jupiterTokens)
const connected = mangoStore((s) => s.connected)
useEffect(() => {
const connection = mangoStore.getState().connection
const loadJupiter = async () => {
const jupiter = await Jupiter.load({
connection,
cluster: CLUSTER,
// platformFeeAndAccounts: NO_PLATFORM_FEE,
routeCacheDuration: 5_000, // Will not refetch data on computeRoutes for up to 10 seconds
})
setJupiter(jupiter)
}
loadJupiter()
}, [])
useEffect(() => {
const group = mangoStore.getState().group
if (!group) return
const tokens = mangoStore.getState().jupiterTokens
const loadRoutes = async () => {
const inputBank = group!.banksMap.get(inputToken)
const outputBank = group!.banksMap.get(outputToken)
if (!inputBank || !outputBank) return
if (!amountIn) {
setAmountOut(undefined)
setSelectedRoute(undefined)
} else {
const computedRoutes = await jupiter?.computeRoutes({
inputMint: inputBank.mint, // Mint address of the input token
outputMint: outputBank.mint, // Mint address of the output token
inputAmount: Number(amountIn) * 10 ** inputBank.mintDecimals, // raw input amount of tokens
slippage, // The slippage in % terms
filterTopNResult: 10,
onlyDirectRoutes: true,
})
const tokenOut = tokens.find(
(t: any) => t.address === outputBank.mint.toString()
)
setOutputTokenInfo(tokenOut)
const routesInfosWithoutRaydium = computedRoutes?.routesInfos.filter(
(r) => {
if (r.marketInfos.length > 1) {
for (const mkt of r.marketInfos) {
if (mkt.amm.label === 'Raydium') return false
}
}
return true
}
)
if (routesInfosWithoutRaydium?.length) {
setRoutes(routesInfosWithoutRaydium)
const bestRoute = getBestRoute(computedRoutes!.routesInfos)
setSelectedRoute(bestRoute)
setAmountOut(toUiDecimals(bestRoute.outAmount, tokenOut?.decimals))
}
}
}
loadRoutes()
}, [inputToken, outputToken, jupiter, slippage, amountIn])
const handleAmountInChange = useCallback(
(e: ChangeEvent<HTMLInputElement>) => {
setAmountIn(e.target.value)
@ -122,6 +195,11 @@ const Swap = () => {
}
}
const isLoadingTradeDetails =
amountIn &&
connected &&
(!routes?.length || !selectedRoute || !outputTokenInfo)
return (
<ContentBox showBackground className="relative overflow-hidden">
<Transition
@ -144,6 +222,11 @@ const Swap = () => {
handleSwap={handleSwap}
submitting={submitting}
setAmountOut={setAmountOut}
outputTokenInfo={outputTokenInfo}
jupiter={jupiter}
routes={routes}
selectedRoute={selectedRoute}
setSelectedRoute={setSelectedRoute}
/>
</Transition>
<Transition
@ -261,9 +344,19 @@ const Swap = () => {
<Button
onClick={() => setShowConfirm(true)}
className="mt-6 flex w-full justify-center py-3 text-lg"
disabled={!connected}
disabled={
!connected || !routes?.length || !selectedRoute || !outputTokenInfo
}
>
{connected ? 'Review Trade' : 'Connect wallet'}
{connected ? (
isLoadingTradeDetails ? (
<Loading />
) : (
t('trade:review-trade')
)
) : (
t('connect')
)}
</Button>
</ContentBox>
)

View File

@ -5,7 +5,7 @@ import TradeSimplePage from '../components/TradeSimplePage'
export async function getStaticProps({ locale }: { locale: string }) {
return {
props: {
...(await serverSideTranslations(locale, ['common'])),
...(await serverSideTranslations(locale, ['common', 'trade'])),
},
}
}

View File

@ -1,12 +0,0 @@
{
"all": "All",
"account-pnl": "Account PnL",
"account-value": "Account Value",
"funding-cumulative": "Cumulative Funding",
"interest-cumulative": "Cumulative Interest",
"mngo-rewards": "MNGO Rewards",
"perp-pnl": "Perp PnL",
"perp-pnl-ex-rewards": "Perp PnL (ex. rewards)",
"select-an-asset": "Select one or more assets to view their performance.",
"vs-time": "vs. Time"
}

View File

@ -1,13 +0,0 @@
{
"active-alerts": "Active Alerts",
"alert-health": "Alert when health is below",
"alert-health-required": "Alert health is required",
"alert-info": "Email when health <= {{health}}%",
"alerts-disclaimer": "Do not rely solely on alerts to protect your account. We can't guarantee they will be delivered.",
"alerts-max": "You've reached the maximum number of active alerts.",
"create-alert": "Create Alert",
"email-address-required": "An email address is required",
"new-alert": "New Alert",
"no-alerts": "No Active Alerts",
"no-alerts-desc": "Create an alert to be notified when your account health is low."
}

View File

@ -1,46 +0,0 @@
{
"anchor-slider": "Anchor slider",
"edit-all-prices": "Edit All Prices",
"great": "Great",
"in-testing-warning": "IN TESTING (Use at your own risk): Please report any bugs or comments in our #dev-ui discord channel.",
"init-weighted-assets": "Init. Weighted Assets Value",
"init-weighted-liabilities": "Init. Weighted Liabilities Value",
"initial-health": "Initial Health",
"joke-get-party-started": "Let's get this party started",
"joke-hit-em-with": "Hit 'em with everything you've got...",
"joke-insert-coin": "Insert coin to continue...",
"joke-liquidated": "Liquidated!",
"joke-liquidator-activity": "Liquidator activity is increasing",
"joke-liquidators-closing": "Liquidators are closing in",
"joke-liquidators-spotted-you": "Liquidators have spotted you",
"joke-live-a-little": "Come on, live a little",
"joke-looking-good": "Looking good",
"joke-mangoes-are-ripe": "The mangoes are ripe for the picking...",
"joke-rethink-positions": "It might be time to re-think your positions",
"joke-sun-shining": "The sun is shining and the mangoes are ripe...",
"joke-throw-some-money": "Throw some money at them to make them go away...",
"joke-zero-borrows-risk": "0 Borrows = 0 Risk",
"liq-price": "Liq. Price",
"maint-weighted-assets": "Maint. Weighted Assets Value",
"maint-weighted-liabilities": "Maint. Weighted Liabilities Value",
"maintenance-health": "Maintenance Health",
"new-positions-openable": "New Positions Can Be Opened",
"no": "No",
"ok": "OK",
"percent-move-liquidation": "Percent Move To Liquidation",
"perp-entry": "Perp Entry",
"poor": "Poor",
"rekt": "Rekt",
"risk-calculator": "Risk Calculator",
"scenario-balances": "Scenario Balances",
"scenario-details": "Scenario Details",
"scenario-maint-health": "Scenario Maintenance Health:",
"simulate-orders-cancelled": "Simulate orders cancelled",
"single-asset-liq": "Single asset liquidation price assuming all other asset prices remain constant",
"spot-val-perp-val": "Spot Value + Perp Balance",
"tooltip-anchor-slider": "Set current pricing to be the anchor point (0%) for slider",
"tooltip-init-health": "Initial health must be above 0% to open new positions.",
"tooltip-maint-health": "Maintenance health must be above 0% to avoid liquidation.",
"very-poor": "Very Poor",
"yes": "Yes"
}

View File

@ -1,17 +0,0 @@
{
"are-you-sure": "Are you sure?",
"before-you-continue": "Before you can continue",
"claim-x-mngo-rewards": "Claim {{amount}} MNGO rewards",
"close-account": "Close Account",
"close-all-borrows": "Close all borrows",
"close-open-orders": "Close all open orders",
"close-perp-positions": "Close and settle all futures positons",
"closing-account-will": "Closing your Mango Account will:",
"delete-your-account": "Delete your Mango Account",
"error-deleting-account": "Error deleting your Mango Account",
"goodbye": "Until next time 👋",
"recover-x-sol": "Recover {{amount}} SOL (rent for your account)",
"settle-balances": "Settle all balances",
"transaction-confirmed": "Transaction Confirmed",
"withdraw-assets-worth": "Withdraw assets worth {{value}}"
}

View File

@ -1,9 +0,0 @@
{
"set-delegate": "Set Delegate",
"delegate-your-account": "Delegate Your Account",
"delegated-account": "Delegated Account",
"info": "Grant control to another Solana account to use Mango on your behalf.",
"public-key": "Delegate Public Key",
"delegate-updated": "Delegate Updated",
"set-error": "Could not set Delegate"
}

View File

@ -1,41 +0,0 @@
{
"browse-profiles": "Browse",
"choose-profile": "Choose a Profile Pic",
"connect-view-profile": "Connect your wallet to view your profile",
"day-trader": "Day Trader",
"degen": "Degen",
"discretionary": "Discretionary",
"edit-profile": "Edit Profile",
"edit-profile-pic": "Edit Profile Pic",
"follow": "Follow",
"following": "Following",
"invalid-characters": "Only alphanumeric characters and single spaces allowed",
"length-error": "Names must be less than 10 characters",
"market-maker": "Market Maker",
"no-followers": "No Followers",
"no-followers-desc": "Trading in stealth mode 😎",
"no-following": "No Accounts Followed",
"no-following-desc": "The lone sheep is in danger of the wolf",
"no-nfts": "😞 No NFTs found...",
"no-profile-exists": "This profile doesn't exist...",
"profile": "Profile",
"profile-fetch-fail": "Failed to fetch profile details",
"profile-name": "Profile Name",
"profile-pic-failure": "Failed to set profile pic",
"profile-pic-success": "Successfully set profile pic",
"profile-pic-remove-failure": "Failed to remove profile pic",
"profile-pic-remove-success": "Successfully removed profile pic",
"profile-update-fail": "Failed to update profile",
"profile-update-success": "Profile updated",
"remove": "Remove",
"save-profile": "Save Profile",
"set-profile-pic": "Set Profile Pic",
"swing-trader": "Swing Trader",
"total-pnl": "Total Portfolio PnL",
"total-value": "Total Portfolio Value",
"trader": "Trader",
"trader-category": "Trader Category",
"unfollow": "Unfollow",
"yolo": "YOLO",
"your-profile": "Your Profile"
}

View File

@ -1,28 +0,0 @@
{
"10k-mngo": "You need 10,000 MNGO in your Mango Account",
"buy-mngo": "Buy MNGO",
"copy-link": "Copy Link",
"custom-links": "Custom Referral Links",
"custom-links-limit": "You can generate up to 5 custom referral links.",
"earn-16": "Earn 16% of the perp fees paid by anyone you refer. Plus, they get a 4% perp fee discount.",
"earnings-history": "Earnings History",
"enter-referral-id": "Enter a referral ID",
"fee-earned": "Fee Earned",
"generate-link": "Generate Link",
"link": "Link",
"link-created": "Custom referral link created",
"link-not-created": "Unable to create referral link",
"program-details": "Program Details",
"program-details-1": "Your referral code is automatically applied when a user creates a Mango Account using your link.",
"program-details-2": "When any of your referrals trade Mango Perps, you earn 16% of their trade fees.",
"program-details-3": "Plus, for using your link they get a 4% discount off their Mango Perp fees.",
"program-details-4": "You must have at least 10,000 MNGO in your Mango Account to qualify for generating referrals and earning referral rewards.",
"referee": "Referee",
"referral-id": "Referral ID",
"sow-seed": "Sow the Mango Seed",
"too-long-error": "Referral IDs must be less then 33 characters",
"total-earnings": "Total Earnings",
"total-referrals": "Total Referrals",
"your-links": "Your Links",
"your-referrals": "Your Referrals"
}

View File

@ -1,8 +0,0 @@
{
"copy-and-share": "Copy Image and Share",
"mark-price": "Mark Price",
"max-leverage": "Max Leverage",
"show-referral-qr": "Show Referral QR",
"show-size": "Show Size",
"tweet-position": "Tweet Position"
}

View File

@ -1,58 +0,0 @@
{
"24h-vol": "24h Vol",
"24h-volume": "24h Volume",
"ata-deposit": "Deposit",
"ata-deposit-details": "{{cost}} SOL for {{count}} ATA Account",
"ata-deposit-details_plural": "{{cost}} SOL for {{count}} ATA Accounts",
"ath": "All-Time High",
"atl": "All-Time Low",
"bal": "Bal:",
"best": "Best",
"best-swap": "Best Swap",
"change-percent": "Change %",
"chart-not-available": "Chart not available",
"cheaper": "cheaper than",
"fees-paid-to": "Fees paid to {{feeRecipient}}",
"from": "from",
"get-started": "Before you get started...",
"got-it": "Got It",
"heres-how": "Here's how",
"input-info-unavailable": "Input token information is not available.",
"insights-not-available": "Market insights are not available",
"jupiter-error": "Error in Jupiter Try changing your input",
"market-cap": "Market Cap",
"market-cap-rank": "Market Cap Rank",
"max-supply": "Max Supply",
"minimum-received": "Minimum Received",
"more-expensive": "more expensive than",
"need-ata-account": "You need to have an Associated Token Account.",
"no-tokens-found": "No tokens found...",
"other-routes": "{{numberOfRoutes}} other routes",
"output-info-unavailable": "Output token information is not available.",
"pay": "Pay",
"price-impact": "Price Impact",
"price-info": "Price Info",
"rate": "Rate",
"receive": "Receive",
"routes-found": "{{numberOfRoutes}} routes found",
"serum-details": "{{cost}} SOL for {{count}} Serum OpenOrders Account",
"serum-details_plural": "{{cost}} SOL for {{count}} Serum OpenOrders Accounts",
"serum-requires-openorders": "Serum requires an OpenOrders account for each token. You can close the account and recover the SOL later.",
"slippage": "Slippage",
"slippage-settings": "Slippage Settings",
"swap-between-hundreds": "Swap between 100s of tokens at the best rates.",
"swap-desc": "Swap interacts with your connected wallet (not your Mango Account).",
"swap-details": "Swap Details",
"swap-fee": "Swap Fee",
"swap-in-wallet": "Swaps interact directly with your connected wallet, not your Mango Account.",
"swap-successful": "Swap Successful",
"swapping": "Swapping...",
"to": "to",
"token-supply": "Token Supply",
"top-ten": "Top 10 Holders",
"transaction-fee": "Transaction Fee",
"unavailable": "Unavailable",
"worst": "Worst",
"you-pay": "You pay",
"you-receive": "You receive"
}

View File

@ -0,0 +1,10 @@
{
"confirm-trade": "Confirm Trade",
"est-liq-price": "Est. Liq Price",
"fees-paid-to": "Fees Paid to {{route}}",
"health-impact": "Health Impact",
"minimum-received": "Minimum Received",
"rate": "Rate",
"review-trade": "Review Trade",
"slippage": "Slippage"
}

View File

@ -1,12 +0,0 @@
{
"all": "All",
"account-pnl": "Account PnL",
"account-value": "Account Value",
"funding-cumulative": "Cumulative Funding",
"interest-cumulative": "Cumulative Interest",
"mngo-rewards": "MNGO Rewards",
"perp-pnl": "Perp PnL",
"perp-pnl-ex-rewards": "Perp PnL (ex. rewards)",
"select-an-asset": "Select one or more assets to view their performance.",
"vs-time": "vs. Time"
}

View File

@ -1,13 +0,0 @@
{
"active-alerts": "Alertas activas",
"alert-health": "Alerta cuando la salud de tu cuenta está baja",
"alert-health-required": "Alert health is required",
"alert-info": "Envía correo electrónico cuando la salud de tu cuenta es <= {{health}}%",
"alerts-disclaimer": "Has alcanzado el número máximo de alertas activas.",
"alerts-max": "You've reached the maximum number of active alerts.",
"create-alert": "Crear alerta",
"email-address-required": "An email address is required",
"new-alert": "Alerta nueva",
"no-alerts": "No hay alertas activas",
"no-alerts-desc": "Cree una alerta para recibir una notificación cuando el estado de su cuenta sea bajo."
}

View File

@ -1,46 +0,0 @@
{
"anchor-slider": "Anchor slider",
"edit-all-prices": "Edit All Prices",
"great": "Great",
"in-testing-warning": "IN TESTING (Use at your own risk): Please report any bugs or comments in our #dev-ui discord channel.",
"init-weighted-assets": "Init. Weighted Assets Value",
"init-weighted-liabilities": "Init. Weighted Liabilities Value",
"initial-health": "Initial Health",
"joke-get-party-started": "Let's get this party started",
"joke-hit-em-with": "Hit 'em with everything you've got...",
"joke-insert-coin": "Insert coin to continue...",
"joke-liquidated": "Liquidated!",
"joke-liquidator-activity": "Liquidator activity is increasing",
"joke-liquidators-closing": "Liquidators are closing in",
"joke-liquidators-spotted-you": "Liquidators have spotted you",
"joke-live-a-little": "Come on, live a little",
"joke-looking-good": "Looking good",
"joke-mangoes-are-ripe": "The mangoes are ripe for the picking...",
"joke-rethink-positions": "It might be time to re-think your positions",
"joke-sun-shining": "The sun is shining and the mangoes are ripe...",
"joke-throw-some-money": "Throw some money at them to make them go away...",
"joke-zero-borrows-risk": "0 Borrows = 0 Risk",
"liq-price": "Liq. Price",
"maint-weighted-assets": "Maint. Weighted Assets Value",
"maint-weighted-liabilities": "Maint. Weighted Liabilities Value",
"maintenance-health": "Maintenance Health",
"new-positions-openable": "New Positions Can Be Opened",
"no": "No",
"ok": "OK",
"percent-move-liquidation": "Percent Move To Liquidation",
"perp-entry": "Perp Entry",
"poor": "Poor",
"rekt": "Rekt",
"risk-calculator": "Risk Calculator",
"scenario-balances": "Scenario Balances",
"scenario-details": "Scenario Details",
"scenario-maint-health": "Scenario Maintenance Health:",
"simulate-orders-cancelled": "Simulate orders cancelled",
"single-asset-liq": "Single asset liquidation price assuming all other asset prices remain constant",
"spot-val-perp-val": "Spot Value + Perp Balance",
"tooltip-anchor-slider": "Set current pricing to be the anchor point (0%) for slider",
"tooltip-init-health": "Initial health must be above 0% to open new positions.",
"tooltip-maint-health": "Maintenance health must be above 0% to avoid liquidation.",
"very-poor": "Very Poor",
"yes": "Yes"
}

View File

@ -1,17 +0,0 @@
{
"are-you-sure": "Are you sure?",
"before-you-continue": "Before you can continue",
"claim-x-mngo-rewards": "Claim {{amount}} MNGO rewards",
"close-account": "Close Account",
"close-all-borrows": "Close all borrows",
"close-open-orders": "Close all open orders",
"close-perp-positions": "Close and settle all Perp positons",
"closing-account-will": "Closing your Mango Account will:",
"delete-your-account": "Delete your Mango account",
"error-deleting-account": "Error deleting account",
"goodbye": "Until next time 👋",
"recover-x-sol": "Recover {{amount}} SOL (rent for your account)",
"settle-balances": "Settle all balances",
"transaction-confirmed": "Transaction Confirmed",
"withdraw-assets-worth": "Withdraw assets worth {{value}}"
}

View File

@ -1,9 +0,0 @@
{
"set-delegate": "Set Delegate",
"delegate-your-account": "Delegate Your Account",
"delegated-account": "Delegated Account",
"info": "Grant control to another Solana account to use Mango on your behalf.",
"public-key": "Delegate Public Key",
"delegate-updated": "Delegate Updated",
"set-error": "Could not set Delegate"
}

View File

@ -1,41 +0,0 @@
{
"browse-profiles": "Browse",
"choose-profile": "Choose a Profile Pic",
"connect-view-profile": "Connect your wallet to view your profile",
"day-trader": "Day Trader",
"degen": "Degen",
"discretionary": "Discretionary",
"edit-profile": "Edit Profile",
"edit-profile-pic": "Edit Profile Pic",
"follow": "Follow",
"following": "Following",
"invalid-characters": "Only alphanumeric characters and single spaces allowed",
"length-error": "Names must be less than 10 characters",
"market-maker": "Market Maker",
"no-followers": "No Followers",
"no-followers-desc": "Trading in stealth mode 😎",
"no-following": "No Accounts Followed",
"no-following-desc": "The lone sheep is in danger of the wolf",
"no-nfts": "😞 No NFTs found...",
"profile": "Profile",
"no-profile-exists": "This profile doesn't exist...",
"profile-fetch-fail": "Failed to fetch profile details",
"profile-name": "Profile Name",
"profile-pic-failure": "Failed to set profile pic",
"profile-pic-success": "Successfully set profile pic",
"profile-pic-remove-failure": "Failed to remove profile pic",
"profile-pic-remove-success": "Successfully removed profile pic",
"profile-update-fail": "Failed to update profile",
"profile-update-success": "Profile updated",
"remove": "Remove",
"save-profile": "Save Profile",
"set-profile-pic": "Set Profile Pic",
"swing-trader": "Swing Trader",
"total-pnl": "Total Portfolio PnL",
"total-value": "Total Portfolio Value",
"trader": "Trader",
"trader-category": "Trader Category",
"unfollow": "Unfollow",
"yolo": "YOLO",
"your-profile": "Your Profile"
}

View File

@ -1,28 +0,0 @@
{
"10k-mngo": "You need 10,000 MNGO in your Mango Account",
"buy-mngo": "Buy MNGO",
"copy-link": "Copy Link",
"custom-links": "Custom Referral Links",
"custom-links-limit": "You can generate up to 5 custom referral links.",
"earn-16": "Earn 16% of the perp fees paid by anyone you refer. Plus, they get a 4% perp fee discount.",
"earnings-history": "Earnings History",
"enter-referral-id": "Enter a referral ID",
"fee-earned": "Fee Earned",
"generate-link": "Generate Link",
"link": "Link",
"link-created": "Custom referral link created",
"link-not-created": "Unable to create referral link",
"program-details": "Program Details",
"program-details-1": "Your referral code is automatically applied when a user creates a Mango Account using your link.",
"program-details-2": "When any of your referrals trade Mango Perps, you earn 16% of their trade fees.",
"program-details-3": "Plus, for using your link they get a 4% discount off their Mango Perp fees.",
"program-details-4": "You must have at least 10,000 MNGO in your Mango Account to qualify for generating referrals and earning referral rewards.",
"referee": "Referee",
"referral-id": "Referral ID",
"sow-seed": "Sow the Mango Seed",
"too-long-error": "Referral IDs must be less then 33 characters",
"total-earnings": "Total Earnings",
"total-referrals": "Total Referrals",
"your-links": "Your Links",
"your-referrals": "Your Referrals"
}

View File

@ -1,8 +0,0 @@
{
"copy-and-share": "Copy Image and Share",
"mark-price": "Mark Price",
"max-leverage": "Max Leverage",
"show-referral-qr": "Show Referral QR",
"show-size": "Show Size",
"tweet-position": "Tweet Position"
}

View File

@ -1,58 +0,0 @@
{
"24h-vol": "24h Vol",
"24h-volume": "24h Volume",
"ata-deposit": "Deposit",
"ata-deposit-details": "{{cost}} SOL for {{count}} ATA Account",
"ata-deposit-details_plural": "{{cost}} SOL for {{count}} ATA Accounts",
"ath": "All-Time High",
"atl": "All-Time Low",
"bal": "Bal:",
"best": "Best",
"best-swap": "Best Swap",
"change-percent": "Change %",
"chart-not-available": "Chart not available",
"cheaper": "cheaper than",
"fees-paid-to": "Fees paid to {{feeRecipient}}",
"from": "from",
"get-started": "Before you get started...",
"got-it": "Got It",
"heres-how": "Here's how",
"input-info-unavailable": "Input token information is not available.",
"insights-not-available": "Market insights are not available",
"jupiter-error": "Error in Jupiter try changing your input",
"market-cap": "Market Cap",
"market-cap-rank": "Market Cap Rank",
"max-supply": "Max Supply",
"minimum-received": "Minimum Received",
"more-expensive": "more expensive than",
"need-ata-account": "You need to have an Associated Token Account.",
"no-tokens-found": "No tokens found...",
"other-routes": "{{numberOfRoutes}} other routes",
"output-info-unavailable": "Output token information is not available.",
"pay": "Pay",
"price-impact": "Price Impact",
"price-info": "Price Info",
"rate": "Rate",
"receive": "Receive",
"routes-found": "{{numberOfRoutes}} routes found",
"serum-details": "{{cost}} SOL for {{count}} Serum OpenOrders Account",
"serum-details_plural": "{{cost}} SOL for {{count}} Serum OpenOrders Accounts",
"serum-requires-openorders": "Serum requires an OpenOrders account for each token. You can close the account and recover the SOL later.",
"slippage": "Slippage",
"slippage-settings": "Slippage Settings",
"swap-between-hundreds": "Swap between 100s of tokens at the best rates.",
"swap-desc": "Swap interacts with your connected wallet (not your Mango Account).",
"swap-details": "Swap Details",
"swap-fee": "Swap Fee",
"swap-in-wallet": "Swaps interact directly with your connected wallet, not your Mango Account.",
"swap-successful": "Swap Successful",
"swapping": "Swapping...",
"to": "to",
"token-supply": "Token Supply",
"top-ten": "Top 10 Holders",
"transaction-fee": "Transaction Fee",
"unavailable": "Unavailable",
"worst": "Worst",
"you-pay": "You pay",
"you-receive": "You receive"
}

View File

@ -0,0 +1,10 @@
{
"confirm-trade": "Confirm Trade",
"est-liq-price": "Est. Liq Price",
"fees-paid-to": "Fees Paid to {{route}}",
"health-impact": "Health Impact",
"minimum-received": "Minimum Received",
"rate": "Rate",
"review-trade": "Review Trade",
"slippage": "Slippage"
}

View File

@ -1,12 +0,0 @@
{
"all": "全部",
"account-pnl": "帐户盈亏",
"account-value": "帐户价值",
"funding-cumulative": "累计资金费用",
"interest-cumulative": "累计利息",
"mngo-rewards": "MNGO奖励",
"perp-pnl": "合约盈亏",
"perp-pnl-ex-rewards": "合约盈亏排除奖励1",
"select-an-asset": "选资产来看其表现。",
"vs-time": "与时间"
}

View File

@ -1,13 +0,0 @@
{
"active-alerts": "活动警报",
"alert-health": "健康度低于什么程度发警告?",
"alert-health-required": "您必须输入警报健康",
"alert-info": "健康度在{{health}}%以下时发电子邮件",
"alerts-disclaimer": "请别全靠警报来保护资产。我们无法保证会准时发出。",
"alerts-max": "您已达到警报数量最多限制",
"create-alert": "创建警报",
"email-address-required": "您必须输入电子邮件地址",
"new-alert": "创建警报",
"no-alerts": "您没有活动警报",
"no-alerts-desc": "以创建警报而收到健康度通知。"
}

View File

@ -1,46 +0,0 @@
{
"anchor-slider": "定滑快",
"edit-all-prices": "调整所有价格",
"great": "很好",
"in-testing-warning": "在试验中! (风险自负): 遇到问题请在discord #dev-ui频道上报到。",
"init-weighted-assets": "初始加权资产价值",
"init-weighted-liabilities": "初始加权借贷价值",
"initial-health": "初始健康度",
"joke-get-party-started": "派对刚才开始喽...",
"joke-hit-em-with": "加油!硬着头皮!",
"joke-insert-coin": "糟糕!别放弃。必须保持百折不挠的精神喔!",
"joke-liquidated": "您遭受清算了!",
"joke-liquidator-activity": "清算者在醒起来...",
"joke-liquidators-closing": "左右为难...",
"joke-liquidators-spotted-you": "有点焦虑不安...",
"joke-live-a-little": "仍有利可图!",
"joke-looking-good": "都井井有条",
"joke-mangoes-are-ripe": "芒果熟了等您摘一摘...",
"joke-rethink-positions": "帐户余额停滞不前...",
"joke-sun-shining": "有机可乘...",
"joke-throw-some-money": "未雨绸缪很重要...",
"joke-zero-borrows-risk": "皇天不负苦心人",
"liq-price": "清算价格",
"maint-weighted-assets": "维持加权资产价值",
"maint-weighted-liabilities": "维持加权借贷价值",
"maintenance-health": "维持健康度",
"new-positions-openable": "可扩大当前持仓",
"no": "不行",
"ok": "OK",
"percent-move-liquidation": "多大涨落导致清算",
"perp-entry": "永续合约入点",
"poor": "不好",
"rekt": "糟糕了",
"risk-calculator": "风险计算器",
"scenario-balances": "模拟余额",
"scenario-details": "模拟细节",
"scenario-maint-health": "模拟维持健康度:",
"simulate-orders-cancelled": "架设取消挂单",
"single-asset-liq": "单个资产虚拟清算价格会假设所有其他资产价格不变",
"spot-val-perp-val": "现货价直+合约余额",
"tooltip-anchor-slider": "将目前资产价格定为滑快起点(0%)",
"tooltip-init-health": "为了扩大当前持仓,初始健康度必须高于0%。",
"tooltip-maint-health": "为了避免清算,维持健康度必须高于0%。",
"very-poor": "很不好",
"yes": "行"
}

View File

@ -1,17 +0,0 @@
{
"are-you-sure": "您确定吗?",
"before-you-continue": "进行之前",
"claim-x-mngo-rewards": "收获{{amount}}MNGO奖励",
"close-account": "关闭帐户",
"close-all-borrows": "归还所有借贷",
"close-open-orders": "取消所有挂单",
"close-perp-positions": "结清所有永续合约持仓",
"closing-account-will": "关闭Mango帐户您就会",
"delete-your-account": "删除您的Mango帐户",
"error-deleting-account": "删除帐户出错",
"goodbye": "再见 👋",
"recover-x-sol": "收回{{amount}}SOL帐户租金",
"settle-balances": "Settle all balances",
"transaction-confirmed": "交易成功",
"withdraw-assets-worth": "将总价值{{value}}提出到您的钱包"
}

View File

@ -1,9 +0,0 @@
{
"set-delegate": "设置受托钱包",
"delegate-your-account": "将您的帐户委托出去",
"delegated-account": "委托帐户",
"info": "将此帐户委托其他Solana帐户控制。",
"public-key": "受托钱包地址",
"delegate-updated": "已更换受托钱包",
"set-error": "设置委托钱包出错"
}

View File

@ -1,41 +0,0 @@
{
"browse-profiles": "Browse",
"choose-profile": "选择头像",
"connect-view-profile": "Connect your wallet to view your profile",
"day-trader": "Day Trader",
"degen": "Degen",
"discretionary": "Discretionary",
"edit-profile": "Edit Profile",
"edit-profile-pic": "切换头像",
"follow": "Follow",
"following": "Following",
"invalid-characters": "Only alphanumeric characters and single spaces allowed",
"length-error": "Names must be less than 10 characters",
"market-maker": "Market Maker",
"no-followers": "No Followers",
"no-followers-desc": "Trading in stealth mode 😎",
"no-following": "No Accounts Followed",
"no-following-desc": "The lone sheep is in danger of the wolf",
"no-nfts": "😞 未找到NFT...",
"no-profile-exists": "This profile doesn't exist...",
"profile": "Profile",
"profile-fetch-fail": "Failed to fetch profile details",
"profile-name": "Profile Name",
"profile-pic-failure": "设置头像失败",
"profile-pic-success": "设置头像成功",
"profile-pic-remove-failure": "删除头像失败",
"profile-pic-remove-success": "删除头像成功",
"profile-update-fail": "Failed to update profile",
"profile-update-success": "Profile updated",
"remove": "删除",
"save-profile": "Save Profile",
"set-profile-pic": "设置头像",
"swing-trader": "Swing Trader",
"total-pnl": "Total Portfolio PnL",
"total-value": "Total Portfolio Value",
"trader": "Trader",
"trader-category": "Trader Category",
"unfollow": "Unfollow",
"yolo": "YOLO",
"your-profile": "Your Profile"
}

View File

@ -1,28 +0,0 @@
{
"10k-mngo": "您的Mango帐户必须含有一万MNGO",
"buy-mngo": "买MNGO",
"copy-link": "复制连结",
"custom-links": "自定连结",
"custom-links-limit": "您可创建的推荐码数量限制于5。",
"earn-16": "收获荐友PERP市场费用的16%再加上荐友也获得4%折扣。",
"earnings-history": "盈利历史",
"enter-referral-id": "输入推荐码",
"fee-earned": "收获费用",
"generate-link": "创建自定连结",
"link": "连结",
"link-created": "已创建自定连结",
"link-not-created": "无法创建自定连结",
"program-details": "活动细节",
"program-details-1": "朋友以您的连结创建Mango帐户时您的推荐码会自动实施。",
"program-details-2": "荐友买卖PERPs的时候您会收获他们缴的费用的16%。",
"program-details-3": "再加上荐友会获得PERP费用的4%折扣。",
"program-details-4": "您的Mango帐户至少必须含有一万MNGO才能收获推荐码带来的盈利。",
"referee": "荐友",
"referral-id": "推荐码",
"sow-seed": "播种芒果",
"too-long-error": "推荐码长度必须少于33个字母",
"total-earnings": "总收入",
"total-referrals": "总推荐",
"your-links": "您的连结",
"your-referrals": "您的推荐"
}

View File

@ -1,8 +0,0 @@
{
"copy-and-share": "拷贝图片来分享",
"mark-price": "现价",
"max-leverage": "最多杠杆",
"show-referral-qr": "显示推荐QR",
"show-size": "显示数量",
"tweet-position": "推文当前持仓"
}

View File

@ -1,58 +0,0 @@
{
"24h-vol": "24h成交量",
"24h-volume": "24h成交量",
"ata-deposit": "押金",
"ata-deposit-details": "{{cost}} SOL为 {{count}} ATA帐户",
"ata-deposit-details_plural": "{{cost}} SOL为 {{count}} ATA帐户",
"ath": "历史高价",
"atl": "历史低价",
"bal": "余额:",
"best": "最佳",
"best-swap": "最佳换币",
"change-percent": "变动%",
"chart-not-available": "无法显示图表",
"cheaper": "低于",
"fees-paid-to": "费用缴给{{feeRecipient}}",
"from": "从",
"get-started": "开始前...",
"got-it": "明白",
"heres-how": "了解更多",
"input-info-unavailable": "获取付出币种资料时出错",
"insights-not-available": "获取时市场分析出错",
"jupiter-error": "Jupiter出错请更改输入",
"market-cap": "总市值",
"market-cap-rank": "总市值排名",
"max-supply": "最大供应量",
"minimum-received": "最好获得",
"more-expensive": "高于",
"need-ata-account": "您必有一个关联币种帐户ATA。",
"no-tokens-found": "找不到币种...",
"other-routes": "{{numberOfRoutes}}条其他路线",
"output-info-unavailable": "获取收到币种资料时出错",
"pay": "付出",
"price-impact": "价格影响",
"price-info": "价格细节",
"rate": "率",
"receive": "收到",
"routes-found": "找到{{numberOfRoutes}}条路线",
"serum-details": "{{cost}} SOL为 {{count}} Serum OpenOrders帐户",
"serum-details_plural": "{{cost}} SOL为 {{count}} Serum OpenOrders帐户",
"serum-requires-openorders": "Serum要求每个币种有一个OpenOrders帐户。以后可以关闭帐户二恢复SOL押金。",
"slippage": "滑点",
"slippage-settings": "滑点设定",
"swap-between-hundreds": "以最好价格来换几百个币种。",
"swap-desc": "Swap interacts with your connected wallet (not your Mango Account).",
"swap-details": "换币细节",
"swap-fee": "换币费用",
"swap-in-wallet": "换币会在您被连结的钱包中进行而不在您的Mango帐户中。",
"swap-successful": "交易成功",
"swapping": "正在交易...",
"to": "到",
"token-supply": "流通供应量",
"top-ten": "前十名持有者",
"transaction-fee": "交易费用",
"unavailable": "无资料",
"worst": "最差",
"you-pay": "您付出",
"you-receive": "您收到"
}

View File

@ -0,0 +1,10 @@
{
"confirm-trade": "Confirm Trade",
"est-liq-price": "Est. Liq Price",
"fees-paid-to": "Fees Paid to {{route}}",
"health-impact": "Health Impact",
"minimum-received": "Minimum Received",
"rate": "Rate",
"review-trade": "Review Trade",
"slippage": "Slippage"
}

View File

@ -1,12 +0,0 @@
{
"all": "全部",
"account-pnl": "帳戶盈虧",
"account-value": "帳戶價值",
"funding-cumulative": "累計資金費用",
"interest-cumulative": "累計利息",
"mngo-rewards": "MNGO獎勵",
"perp-pnl": "合約盈虧",
"perp-pnl-ex-rewards": "合約盈虧排除獎勵1",
"select-an-asset": "選資產來看其表現。",
"vs-time": "與時間"
}

View File

@ -1,13 +0,0 @@
{
"active-alerts": "活動警報",
"alert-health": "健康度低於甚麼程度發警告?",
"alert-health-required": "您必須輸入警報健康",
"alert-info": "健康度在{{health}}%以下時發電子郵件",
"alerts-disclaimer": "請別全靠警報來保護資產。我們無法保證會準時發出。",
"alerts-max": "您已達到警報數量最多限制",
"create-alert": "創建警報",
"email-address-required": "您必須輸入電子郵件地址",
"new-alert": "創建警報",
"no-alerts": "您沒有活動警報",
"no-alerts-desc": "以創建警報而收到健康度通知。"
}

View File

@ -1,46 +0,0 @@
{
"anchor-slider": "定滑快",
"edit-all-prices": "調整所有價格",
"great": "很好",
"in-testing-warning": "在試驗中! (風險自負): 遇到問題請在discord #dev-ui頻道上報到。",
"init-weighted-assets": "初始加權資產價值",
"init-weighted-liabilities": "初始加權借貸價值",
"initial-health": "初始健康度",
"joke-get-party-started": "派對剛才開始嘍...",
"joke-hit-em-with": "加油!硬著頭皮!",
"joke-insert-coin": "糟糕!別放棄。必須保持百折不撓的精神喔!",
"joke-liquidated": "您遭受清算了!",
"joke-liquidator-activity": "清算者在醒起來...",
"joke-liquidators-closing": "左右為難...",
"joke-liquidators-spotted-you": "有點焦慮不安...",
"joke-live-a-little": "仍有利可圖!",
"joke-looking-good": "都井井有條",
"joke-mangoes-are-ripe": "芒果熟了等您摘一摘...",
"joke-rethink-positions": "烏雲密布...",
"joke-sun-shining": "您冒個險吧。市場上有機可乘...",
"joke-throw-some-money": "未雨綢繆很重要...",
"joke-zero-borrows-risk": "皇天不負苦心人",
"liq-price": "清算價格",
"maint-weighted-assets": "維持加權資產價值",
"maint-weighted-liabilities": "維持加權借貸價值",
"maintenance-health": "維持健康度",
"new-positions-openable": "可擴大當前持倉",
"no": "不行",
"ok": "OK",
"percent-move-liquidation": "多大漲落導致清算",
"perp-entry": "永續合約入點",
"poor": "不好",
"rekt": "糟糕了",
"risk-calculator": "風險計算器",
"scenario-balances": "模擬餘額",
"scenario-details": "模擬細節",
"scenario-maint-health": "模擬維持健康度:",
"simulate-orders-cancelled": "架設取消掛單",
"single-asset-liq": "單個資產虛擬清算價格會假設所有其他資產價格不變",
"spot-val-perp-val": "現貨價直+合約餘額",
"tooltip-anchor-slider": "將目前資產價格定為滑快起點(0%)",
"tooltip-init-health": "為了擴大當前持倉,初始健康度必須高於0%。",
"tooltip-maint-health": "為了避免清算,維持健康度必須高於0%。",
"very-poor": "很不好",
"yes": "行"
}

View File

@ -1,17 +0,0 @@
{
"are-you-sure": "您確定嗎?",
"before-you-continue": "進行之前",
"claim-x-mngo-rewards": "收穫{{amount}}MNGO獎勵",
"close-account": "關閉帳戶",
"close-all-borrows": "歸還所有借貸",
"close-open-orders": "取消所有掛單",
"close-perp-positions": "結清所有永續合約持倉",
"closing-account-will": "關閉Mango帳戶您就會",
"delete-your-account": "刪除您的Mango帳戶",
"error-deleting-account": "刪除帳戶出錯",
"goodbye": "再見 👋",
"recover-x-sol": "收回{{amount}}SOL帳戶租金",
"settle-balances": "Settle all balances",
"transaction-confirmed": "交易成功",
"withdraw-assets-worth": "將總價值{{value}}提出到您的錢包"
}

View File

@ -1,9 +0,0 @@
{
"set-delegate": "設置受託錢包",
"delegate-your-account": "將您的帳戶委託出去",
"delegated-account": "委託帳戶",
"info": "將此帳戶委託其他Solana帳戶控制。",
"public-key": "受託錢包地址",
"delegate-updated": "已更換受託錢包",
"set-error": "設置委託錢包出錯"
}

View File

@ -1,41 +0,0 @@
{
"browse-profiles": "Browse",
"choose-profile": "選擇頭像",
"connect-view-profile": "Connect your wallet to view your profile",
"day-trader": "Day Trader",
"degen": "Degen",
"discretionary": "Discretionary",
"edit-profile": "Edit Profile",
"edit-profile-pic": "切換頭像",
"follow": "Follow",
"following": "Following",
"invalid-characters": "Only alphanumeric characters and single spaces allowed",
"length-error": "Names must be less than 10 characters",
"market-maker": "Market Maker",
"no-followers": "No Followers",
"no-followers-desc": "Trading in stealth mode 😎",
"no-following": "No Accounts Followed",
"no-following-desc": "The lone sheep is in danger of the wolf",
"no-nfts": "😞 未找到NFT...",
"no-profile-exists": "This profile doesn't exist...",
"profile": "Profile",
"profile-fetch-fail": "Failed to fetch profile details",
"profile-name": "Profile Name",
"profile-pic-failure": "設置頭像失敗",
"profile-pic-success": "設置頭像成功",
"profile-pic-remove-failure": "刪除頭像失敗",
"profile-pic-remove-success": "刪除頭像成功",
"profile-update-fail": "Failed to update profile",
"profile-update-success": "Profile updated",
"remove": "刪除",
"save-profile": "Save Profile",
"set-profile-pic": "設置頭像",
"swing-trader": "Swing Trader",
"total-pnl": "Total Portfolio PnL",
"total-value": "Total Portfolio Value",
"trader": "Trader",
"trader-category": "Trader Category",
"unfollow": "Unfollow",
"yolo": "YOLO",
"your-profile": "Your Profile"
}

View File

@ -1,28 +0,0 @@
{
"10k-mngo": "您的Mango帳戶必須含有一萬MNGO",
"buy-mngo": "買MNGO",
"copy-link": "複製連結",
"custom-links": "自定連結",
"custom-links-limit": "您可創建的推薦碼數量限制於5。",
"earn-16": "收穫薦友PERP市場費用的16%再加上薦友也獲得4%折扣。",
"earnings-history": "盈利歷史",
"enter-referral-id": "輸入推薦碼",
"fee-earned": "收穫費用",
"generate-link": "創建自定連結",
"link": "連結",
"link-created": "已創建自定連結",
"link-not-created": "無法創建自定連結",
"program-details": "活動細節",
"program-details-1": "朋友以您的連結創建Mango帳戶時您的推薦碼會自動實施。",
"program-details-2": "薦友買賣PERPs的時候您會收穫他們繳的費用的16%。",
"program-details-3": "再加上薦友會獲得PERP費用的4%折扣。",
"program-details-4": "您的Mango帳戶至少必須含有一萬MNGO才能收穫推薦碼帶來的盈利。",
"referee": "薦友",
"referral-id": "推薦碼",
"sow-seed": "播種芒果",
"too-long-error": "推薦碼長度必須少於33個字母",
"total-earnings": "總收入",
"total-referrals": "總推薦",
"your-links": "您的連結",
"your-referrals": "您的推薦"
}

View File

@ -1,8 +0,0 @@
{
"copy-and-share": "拷貝圖片來分享",
"mark-price": "現價",
"max-leverage": "最多槓桿",
"show-referral-qr": "顯示推薦QR",
"show-size": "顯示數量",
"tweet-position": "推文當前持倉"
}

View File

@ -1,58 +0,0 @@
{
"24h-vol": "24h成交量",
"24h-volume": "24h成交量",
"ata-deposit": "押金",
"ata-deposit-details": "{{cost}} SOL為 {{count}} ATA帳戶",
"ata-deposit-details_plural": "{{cost}} SOL為 {{count}} ATA帳戶",
"ath": "歷史高價",
"atl": "歷史低價",
"bal": "餘額:",
"best": "最佳",
"best-swap": "最佳換幣",
"change-percent": "變動%",
"chart-not-available": "無法顯示圖表",
"cheaper": "低於",
"fees-paid-to": "費用繳給{{feeRecipient}}",
"from": "從",
"get-started": "開始前...",
"got-it": "明白",
"heres-how": "了解更多",
"input-info-unavailable": "獲取付出幣種資料時出錯",
"insights-not-available": "獲取時市場分析出錯",
"jupiter-error": "Jupiter出錯請更改輸入",
"market-cap": "總市值",
"market-cap-rank": "總市值排名",
"max-supply": "最大供應量",
"minimum-received": "最好獲得",
"more-expensive": "高於",
"need-ata-account": "您必有一個關聯幣種帳戶ATA。",
"no-tokens-found": "找不到幣種...",
"other-routes": "{{numberOfRoutes}}條其他路線",
"output-info-unavailable": "獲取收到幣種資料時出錯",
"pay": "付出",
"price-impact": "價格影響",
"price-info": "價格細節",
"rate": "率",
"receive": "收到",
"routes-found": "找到{{numberOfRoutes}}條路線",
"serum-details": "{{cost}} SOL為 {{count}} Serum OpenOrders帳戶",
"serum-details_plural": "{{cost}} SOL為 {{count}} Serum OpenOrders帳戶",
"serum-requires-openorders": "Serum要求每個幣種有一個OpenOrders帳戶。以後可以關閉帳戶二恢復SOL押金。",
"slippage": "滑點",
"slippage-settings": "滑點設定",
"swap-between-hundreds": "以最好價格來換幾百個幣種。",
"swap-desc": "Swap interacts with your connected wallet (not your Mango Account).",
"swap-details": "換幣細節",
"swap-fee": "換幣費用",
"swap-in-wallet": "換幣會在您被連結的錢包中進行而不在您的Mango帳戶中。",
"swap-successful": "換幣成功",
"swapping": "正在換幣...",
"to": "到",
"token-supply": "流通供應量",
"top-ten": "前十名持有者",
"transaction-fee": "交易費用",
"unavailable": "無資料",
"worst": "最差",
"you-pay": "您付出",
"you-receive": "您收到"
}

View File

@ -0,0 +1,10 @@
{
"confirm-trade": "Confirm Trade",
"est-liq-price": "Est. Liq Price",
"fees-paid-to": "Fees Paid to {{route}}",
"health-impact": "Health Impact",
"minimum-received": "Minimum Received",
"rate": "Rate",
"review-trade": "Review Trade",
"slippage": "Slippage"
}