Merge branch 'main' of github.com:blockworks-foundation/mango-ui-v3 into kierangillen/wallet-updates

This commit is contained in:
Kieran Gillen 2022-03-23 11:50:02 +01:00
commit a827bb71d2
20 changed files with 187 additions and 139 deletions

View File

@ -1,15 +0,0 @@
import React from 'react'
import dayjs from 'dayjs'
interface DateDisplayProps {
date: string
}
export const DateDisplay: React.FC<DateDisplayProps> = ({ date }) => {
return (
<div>
<div>{dayjs(date).format('DD MMM YYYY')}</div>
<div className="text-left">{dayjs(date).format('h:mma')}</div>
</div>
)
}

View File

@ -4,6 +4,7 @@ import { Connection } from '@solana/web3.js'
import { sumBy } from 'lodash'
import useInterval from '../hooks/useInterval'
import { SECONDS } from '../stores/useMangoStore'
import { useTranslation } from 'next-i18next'
const connection = new Connection('https://solana-api.projectserum.com/')
@ -29,6 +30,7 @@ const getRecentPerformance = async (setShow, setTps) => {
const GlobalNotification = () => {
const [show, setShow] = useState(false)
const [tps, setTps] = useState(0)
const { t } = useTranslation('common')
useEffect(() => {
getRecentPerformance(setShow, setTps)
@ -42,10 +44,7 @@ const GlobalNotification = () => {
return (
<div className="flex items-center bg-th-bkg-4 text-th-primary">
<div className="w-full p-1 text-center">
<span>
Solana network is experiencing degraded performance. Transactions
may fail to send or confirm. (TPS: {tps?.toFixed(0)})
</span>
<span>{t('degraded-performance', { tps: tps?.toFixed(0) })}</span>
</div>
<button

View File

@ -100,10 +100,7 @@ const MarketDetails = () => {
{usdFormatter(market?.volumeUsd24h, 0)}
</div>
</div>
<Tooltip
content="Funding is paid continuously. The 1hr rate displayed is a rolling average of the past 60 mins."
placement={'bottom'}
>
<Tooltip content={t('tooltip-funding')} placement={'bottom'}>
<div className="flex items-center justify-between hover:cursor-help md:block">
<div className="flex items-center text-th-fgd-3 md:pb-0.5 md:text-[0.65rem]">
{t('average-funding')}

View File

@ -71,6 +71,19 @@ const MarketNavItem: FunctionComponent<MarketNavItemProps> = ({
{getMarketLeverage(mangoGroup, mangoGroupConfig, market)}x
</span>
</div>
{market?.change24h ? (
<div
className={`text-xs ${
market?.change24h
? market.change24h >= 0
? 'text-th-green'
: 'text-th-red'
: 'text-th-fgd-4'
}`}
>
{`${(market.change24h * 100).toFixed(1)}%`}
</div>
) : null}
</button>
<div className="ml-2">
<FavoriteMarketButton market={market} />

View File

@ -1,6 +1,7 @@
import { Disclosure, Transition } from '@headlessui/react'
import { ChevronDownIcon } from '@heroicons/react/solid'
import { Fragment, ReactNode } from 'react'
import dayjs from 'dayjs'
export const Table = ({ children }) => (
<table className="min-w-full">{children}</table>
@ -97,3 +98,10 @@ export const Row = ({ children }: RowProps) => {
</div>
)
}
export const TableDateDisplay = ({ date }: { date: string }) => (
<>
<p className="mb-0 text-th-fgd-2">{dayjs(date).format('DD MMM YYYY')}</p>
<p className="mb-0 text-xs">{dayjs(date).format('h:mma')}</p>
</>
)

View File

@ -7,7 +7,14 @@ import { LinkButton } from './Button'
import { useSortableData } from '../hooks/useSortableData'
import { useViewport } from '../hooks/useViewport'
import { breakpoints } from './TradePageGrid'
import { Table, Td, Th, TrBody, TrHead } from './TableElements'
import {
Table,
TableDateDisplay,
Td,
Th,
TrBody,
TrHead,
} from './TableElements'
import { ExpandableRow } from './TableElements'
import { formatUsdValue } from '../utils'
import { useTranslation } from 'next-i18next'
@ -221,9 +228,7 @@ const TradeHistoryTable = ({ numTrades }: { numTrades?: number }) => {
className="flex items-center no-underline"
onClick={() => requestSort('loadTimestamp')}
>
<span className="font-normal">
{t('approximate-time')}
</span>
<span className="font-normal">{t('date')}</span>
<ArrowSmDownIcon
className={`default-transition ml-1 h-4 w-4 flex-shrink-0 ${
sortConfig?.key === 'loadTimestamp'
@ -272,12 +277,14 @@ const TradeHistoryTable = ({ numTrades }: { numTrades?: number }) => {
<Td className="!py-2 ">
{formatUsdValue(trade.feeCost)}
</Td>
<Td className="w-[0.1%] !py-2">
{trade.loadTimestamp || trade.timestamp
? renderTradeDateTime(
trade.loadTimestamp || trade.timestamp
)
: t('recent')}
<Td className="!py-2">
{trade.loadTimestamp || trade.timestamp ? (
<TableDateDisplay
date={trade.loadTimestamp || trade.timestamp}
/>
) : (
t('recent')
)}
</Td>
<Td className="keep-break w-[0.1%] !py-2">
{trade.marketName.includes('PERP') ? (

View File

@ -302,8 +302,8 @@ export default function AccountBorrows() {
<TrHead>
<Th>{t('asset')}</Th>
<Th>{t('price')}</Th>
<Th>Deposit APR</Th>
<Th>Borrow APR</Th>
<Th>{t('deposit')} APR</Th>
<Th>{t('borrow')} APR</Th>
{mangoAccount ? <Th>{t('max-borrow')}</Th> : null}
<Th>{t('liquidity')}</Th>
</TrHead>

View File

@ -1,7 +1,14 @@
import { useEffect, useMemo, useState } from 'react'
import dayjs from 'dayjs'
import useMangoStore from '../../stores/useMangoStore'
import { Table, Td, Th, TrBody, TrHead } from '../TableElements'
import {
Table,
TableDateDisplay,
Td,
Th,
TrBody,
TrHead,
} from '../TableElements'
import { isEmpty } from 'lodash'
import { useTranslation } from 'next-i18next'
import Select from '../Select'
@ -386,7 +393,7 @@ const AccountFunding = () => {
return (
<TrBody key={stat.time}>
<Td className="w-1/2">
{dayjs(utc).format('DD/MM/YY, h:mma')}
<TableDateDisplay date={utc} />
</Td>
<Td className="w-1/2">
{stat.total_funding.toFixed(

View File

@ -9,7 +9,14 @@ import {
import TradeHistoryTable from '../TradeHistoryTable'
import useMangoStore from '../../stores/useMangoStore'
import { Table, TrHead, Th, TrBody, Td } from '../TableElements'
import {
Table,
TrHead,
Th,
TrBody,
Td,
TableDateDisplay,
} from '../TableElements'
import { LinkButton } from '../Button'
import { useSortableData } from '../../hooks/useSortableData'
import { formatUsdValue } from '../../utils'
@ -19,6 +26,8 @@ import Button from '../Button'
import Loading from '../Loading'
import { fetchHourlyPerformanceStats } from './AccountOverview'
import { useWallet } from '@solana/wallet-adapter-react'
import Tooltip from '../Tooltip'
import { InformationCircleIcon } from '@heroicons/react/outline'
const historyViews = [
{ label: 'Trades', key: 'Trades' },
@ -80,54 +89,20 @@ export default function AccountHistory() {
}
const exportHistoryToCSV = () => {
let dataToExport
let headers
const dataToExport = history
.filter((val) => val.activity_type == view)
.map((row) => {
row = row.activity_details
const timestamp = new Date(row.block_datetime)
if (view == 'Trades') {
// filter liquidations from history
const tradeHistory = useMangoStore
.getState()
.tradeHistory.parsed.filter((t) => !('liqor' in t))
dataToExport = tradeHistory.map((trade) => {
const timestamp = new Date(trade.loadTimestamp)
return {
asset: trade.marketName,
orderType: trade.side.toUpperCase(),
quantity: trade.size,
price: trade.price,
value: trade.value,
liquidity: trade.liquidity,
fee: trade.feeCost,
date: `${timestamp.toLocaleDateString()} ${timestamp.toLocaleTimeString()}`,
asset: row.symbol,
quantity: row.quantity,
value: row.usd_equivalent,
}
})
headers = [
'Market',
'Side',
'Size',
'Price',
'Value',
'Liquidity',
'Fee',
'Approx. Time',
]
} else {
dataToExport = history
.filter((val) => val.activity_type == view)
.map((row) => {
row = row.activity_details
const timestamp = new Date(row.block_datetime)
return {
date: `${timestamp.toLocaleDateString()} ${timestamp.toLocaleTimeString()}`,
asset: row.symbol,
quantity: row.quantity,
value: row.usd_equivalent,
}
})
headers = ['Timestamp', 'Asset', 'Quantity', 'Value']
}
const headers = ['Timestamp', 'Asset', 'Quantity', 'Value']
if (dataToExport.length == 0) {
notify({
@ -185,31 +160,54 @@ export default function AccountHistory() {
{t('use-explorer-three')}
</div>
</div>
{view !== 'Trades' ? (
<Button
className={`flex h-8 items-center justify-center whitespace-nowrap pt-0 pb-0 pl-3 pr-3 text-xs`}
onClick={exportHistoryToCSV}
>
<div className={`flex items-center`}>
<SaveIcon className={`mr-1.5 h-4 w-4`} />
{t('export-data')}
</div>
</Button>
) : canWithdraw ? (
<Button
className={`flex h-8 items-center justify-center whitespace-nowrap pt-0 pb-0 pl-3 pr-3 text-xs`}
onClick={exportPerformanceDataToCSV}
>
{loadExportData ? (
<Loading />
) : (
<div className="flex space-x-3">
{view === 'Trades' && canWithdraw ? (
<Button
className={`flex h-8 items-center justify-center whitespace-nowrap pt-0 pb-0 pl-3 pr-3 text-xs`}
onClick={exportPerformanceDataToCSV}
>
{loadExportData ? (
<Loading />
) : (
<div className={`flex items-center`}>
<SaveIcon className={`mr-1.5 h-4 w-4`} />
{t('export-pnl-csv')}
</div>
)}
</Button>
) : null}
{view !== 'Trades' ? (
<Button
className={`flex h-8 items-center justify-center whitespace-nowrap pt-0 pb-0 pl-3 pr-3 text-xs`}
onClick={exportHistoryToCSV}
>
<div className={`flex items-center`}>
<SaveIcon className={`mr-1.5 h-4 w-4`} />
{t('export-pnl-csv')}
{t('export-data')}
</div>
)}
</Button>
) : null}
</Button>
) : canWithdraw ? (
<div className={`flex items-center`}>
<a
className={`default-transition flex h-8 items-center justify-center whitespace-nowrap rounded-full bg-th-bkg-button pt-0 pb-0 pl-3 pr-3 text-xs font-bold text-th-fgd-1 hover:text-th-fgd-1 hover:brightness-[1.1]`}
href={`https://event-history-api.herokuapp.com/all_trades_csv?mango_account=${mangoAccountPk}&open_orders=${mangoAccount.spotOpenOrders
.filter(
(e) => e.toString() !== '11111111111111111111111111111111'
)
.join(',')}`}
download
target="_blank"
rel="noopener noreferrer"
>
<SaveIcon className={`mr-1.5 h-4 w-4`} />
Export Trades CSV
</a>
<Tooltip content={t('trade-export-disclaimer')}>
<InformationCircleIcon className="ml-1.5 h-5 w-5 cursor-help text-th-fgd-3" />
</Tooltip>
</div>
) : null}
</div>
</div>
<ViewContent view={view} history={history} />
</>
@ -420,16 +418,14 @@ const LiquidationHistoryTable = ({ history, view }) => {
perpMarket
)
const date = new Date(activity_details.block_datetime)
const lostDecimals = assetLost.symbol === 'SOL' ? 9 : 6
const gainedDecimals = assetGained.symbol === 'SOL' ? 9 : 6
return (
<TrBody key={activity_details.signature}>
<Td>
<div>{date.toLocaleDateString()}</div>
<div className="text-xs text-th-fgd-3">
{date.toLocaleTimeString()}
</div>
<TableDateDisplay
date={activity_details.block_datetime}
/>
</Td>
<Td>
@ -580,14 +576,12 @@ const HistoryTable = ({ history, view }) => {
</thead>
<tbody>
{items.map((activity_details: any) => {
const date = new Date(activity_details.block_datetime)
return (
<TrBody key={activity_details.signature}>
<Td>
<div>{date.toLocaleDateString()}</div>
<div className="text-xs text-th-fgd-3">
{date.toLocaleTimeString()}
</div>
<TableDateDisplay
date={activity_details.block_datetime}
/>
</Td>
<Td>
<div className="flex items-center">

View File

@ -3,7 +3,14 @@ import { useEffect, useMemo, useState } from 'react'
import dayjs from 'dayjs'
import useMangoStore from '../../stores/useMangoStore'
import Select from '../Select'
import { Table, Td, Th, TrBody, TrHead } from '../TableElements'
import {
Table,
TableDateDisplay,
Td,
Th,
TrBody,
TrHead,
} from '../TableElements'
import { useTranslation } from 'next-i18next'
import { isEmpty } from 'lodash'
import usePagination from '../../hooks/usePagination'
@ -546,7 +553,7 @@ const AccountInterest = () => {
return (
<TrBody key={stat.time}>
<Td className="w-1/3">
{dayjs(utc).format('DD/MM/YY, h:mma')}
<TableDateDisplay date={utc} />
</Td>
<Td className="w-1/3">
{stat.borrow_interest > 0

View File

@ -111,7 +111,7 @@ const MobileTradePage = () => {
<Swipeable index={viewIndex} onChangeIndex={handleChangeViewIndex}>
<div>
<div className="mb-2 grid grid-cols-12 grid-rows-1 gap-4 rounded-lg py-2">
<div className="col-span-7 pt-2">
<div className="col-span-7">
<AdvancedTradeForm />
</div>
<div className="col-span-5">

View File

@ -58,7 +58,7 @@ export default function StatsPerps({ perpStats }) {
}, [selectedMarketConfig, perpMarkets])
const perpsData = useMemo(() => {
if (perpStats.length === 0) return []
if (perpStats.length === 0 || !selectedMarket) return []
let selectedStatsData = perpStats.filter(
(stat) => stat.name === selectedAsset

View File

@ -150,8 +150,10 @@ export default function AdvancedTradeForm({
useEffect(() => {
const walletSol = walletTokens.find((a) => a.config.symbol === 'SOL')
walletSol ? setInsufficientSol(walletSol.uiBalance < 0.01) : null
}, [walletTokens])
walletSol && connected
? setInsufficientSol(walletSol.uiBalance < 0.01)
: null
}, [connected, walletTokens])
useEffect(() => {
if (tradeType === 'Market') {
@ -483,7 +485,7 @@ export default function AdvancedTradeForm({
const closeBorrowString =
percentToClose(baseSize, roundedBorrows) > 100
? t('close-open-long', {
size: (+baseSize - roundedDeposits).toFixed(sizeDecimalCount),
size: (+baseSize - roundedBorrows).toFixed(sizeDecimalCount),
symbol: marketConfig.baseSymbol,
})
: `${percentToClose(baseSize, roundedBorrows).toFixed(0)}% ${t(
@ -760,7 +762,7 @@ export default function AdvancedTradeForm({
}
return (
<div className="flex h-full flex-col">
<div>
<ElementTitle className="hidden md:flex">
{marketConfig.name}
<span className="ml-2 rounded border border-th-primary px-1 py-0.5 text-xs text-th-primary">
@ -768,7 +770,7 @@ export default function AdvancedTradeForm({
</span>
</ElementTitle>
{insufficientSol ? (
<div className="pb-3 text-left">
<div className="mb-3 text-left">
<InlineNotification desc={t('add-more-sol')} type="warning" />
</div>
) : null}

View File

@ -18,7 +18,7 @@ const OrderSideTabs: FunctionComponent<OrderSideTabsProps> = ({
const { t } = useTranslation('common')
const market = useMangoStore((s) => s.selectedMarket.current)
return (
<div className={`relative mb-3 -mt-2.5 md:border-b md:border-th-fgd-4`}>
<div className={`relative mb-3 md:-mt-2.5 md:border-b md:border-th-fgd-4`}>
<div
className={`absolute hidden md:block ${
side === 'buy'

View File

@ -1,6 +1,8 @@
import Select from '../Select'
import { useTranslation } from 'next-i18next'
const TradeType = ({ value, onChange, offerTriggers = false }) => {
const { t } = useTranslation('common')
const TRADE_TYPES = ['Limit', 'Market']
if (offerTriggers)
TRADE_TYPES.push(
@ -11,10 +13,13 @@ const TradeType = ({ value, onChange, offerTriggers = false }) => {
)
return (
<Select value={value} onChange={onChange}>
<Select
value={t(value.replace(/\s+/g, '-').toLowerCase())}
onChange={onChange}
>
{TRADE_TYPES.map((type) => (
<Select.Option key={type} value={type}>
{type}
{t(type.replace(/\s+/g, '-').toLowerCase())}
</Select.Option>
))}
</Select>

View File

@ -30,7 +30,14 @@ import {
} from '@heroicons/react/outline'
import { MngoMonoIcon } from '../components/icons'
import Link from 'next/link'
import { Table, Td, Th, TrBody, TrHead } from '../components/TableElements'
import {
Table,
TableDateDisplay,
Td,
Th,
TrBody,
TrHead,
} from '../components/TableElements'
import AccountsModal from '../components/AccountsModal'
import { useViewport } from '../hooks/useViewport'
import { breakpoints } from '../components/TradePageGrid'
@ -39,7 +46,6 @@ import MobileTableHeader from '../components/mobile/MobileTableHeader'
import Input, { Label } from '../components/Input'
import InlineNotification from '../components/InlineNotification'
import useMangoAccount from '../hooks/useMangoAccount'
import { DateDisplay } from '../components/DateDisplay'
import { handleWalletConnect } from 'components/ConnectWalletButton'
import { useWallet } from '@solana/wallet-adapter-react'
@ -439,7 +445,7 @@ export default function Referral() {
return (
<TrBody key={ref.signature}>
<Td>
<DateDisplay date={ref.block_datetime} />
<TableDateDisplay date={ref.block_datetime} />
</Td>
<Td>
<Link
@ -470,7 +476,7 @@ export default function Referral() {
buttonTemplate={
<div className="flex w-full items-center justify-between text-th-fgd-1">
<div>
<DateDisplay date={ref.block_datetime} />
<TableDateDisplay date={ref.block_datetime} />
</div>
<div className="text-right">
{usdFormatter(ref.referral_fee_accrual, 4)}

View File

@ -100,6 +100,7 @@
"date": "Date",
"default-market": "Default Market",
"default-spot-margin": "Trade with margin by default",
"degraded-performance": "Solana network is experiencing degraded performance. Transactions may fail to send or confirm. (TPS: {{tps}})",
"delay-displaying-recent": "There may be a delay in displaying the latest activity.",
"delayed-info": "Data updates hourly",
"deposit": "Deposit",
@ -365,6 +366,7 @@
"tooltip-display-step": "Display Step Size",
"tooltip-earn-mngo": "Earn MNGO by market making on Perp markets.",
"tooltip-enable-margin": "Enable spot margin for this trade",
"tooltip-funding": "Funding is paid continuously. The 1hr rate displayed is a rolling average of the past 60 mins.",
"tooltip-gui-rebate": "Taker fee is {{taker_rate)}} before the 20% GUI hoster fee is rebated.",
"tooltip-interest-charged": "Interest is charged on your borrowed balance and is subject to change.",
"tooltip-ioc": "Immediate or cancel orders are guaranteed to be the taker or it will be canceled.",
@ -391,6 +393,7 @@
"total-srm": "Total SRM in Mango",
"totals": "Totals",
"trade": "Trade",
"trade-export-disclaimer": "Due to the nature of how trades are processed, it is not possible to guarantee that all trades will be exported. However, a best effort approach has been taken, combining several independent sources to reduce the likelihood of missing trades.",
"trade-history": "Trade History",
"trades": "Trades",
"trades-history": "Trade History",

View File

@ -99,6 +99,7 @@
"date": "Fecha",
"default-market": "Mercado predeterminado",
"default-spot-margin": "Comercia con margen por defecto",
"degraded-performance": "Solana network is experiencing degraded performance. Transactions may fail to send or confirm. (TPS: {{tps}})",
"delay-displaying-recent": "Puede haber un retraso en la visualización de la última actividad.",
"delayed-info": "Data updates hourly",
"deposit": "Depositar",
@ -141,6 +142,7 @@
"first-deposit-desc": "Necesita 0.035 SOL para crear una cuenta de mango.",
"funding": "Fondos",
"funding-chart-title": "Fondos (últimos 30 días)",
"futures": "Futuros",
"get-started": "Comenzar",
"health": "Salud",
"health-check": "Verificación del estado de la cuenta",
@ -305,6 +307,7 @@
"repay-partial": "Pagar el {{porcentaje}}% del préstamo",
"reposition": "Arrastra para reposicionar",
"reset": "Reset",
"rolling-change": "24hr Change",
"rpc-endpoint": "Punto final de RPC",
"save": "Ahorrar",
"save-name": "Guardar nombre",
@ -360,6 +363,7 @@
"tooltip-display-step": "Tamaño del paso de visualización",
"tooltip-earn-mngo": "Gana MNGO por creación de mercado en los mercados perpetuos.",
"tooltip-enable-margin": "Habilite el margen al contado para esta operación",
"tooltip-funding": "Funding is paid continuously. The 1hr rate displayed is a rolling average of the past 60 mins.",
"tooltip-gui-rebate": "La tarifa del receptor es {{taker_rate)}} antes de que se reembolse el 20% de la tarifa de hospedaje de GUI.",
"tooltip-interest-charged": "Los intereses se cargan sobre el saldo prestado y están sujetos a cambios.",
"tooltip-ioc": "Las ordenes inmediatas o canceladas están garantizados para ser el receptor o se cancelarán.",
@ -388,6 +392,7 @@
"trade": "Comercio",
"trade-history": "Historial comercial",
"trades": "Trades",
"trade-export-disclaimer": "Due to the nature of how trades are processed, it is not possible to guarantee that all trades will be exported. However, a best effort approach has been taken, combining several independent sources to reduce the likelihood of missing trades.",
"trades-history": "Historial comercial",
"transaction-sent": "Transacción enviada",
"trigger-price": "Precio de activación",

View File

@ -88,10 +88,10 @@
"create-account": "创建帐户",
"current-stats": "当前统计",
"custom": "自定义",
"daily-change": "24小时变动",
"daily-high": "24hr高价",
"daily-low": "24hr底价",
"daily-range": "24小时广度",
"daily-change": "一日间变动",
"daily-high": "24小时高价",
"daily-low": "24小时底价",
"daily-range": "一日间广度",
"daily-volume": "24小时成交量",
"dark": "黑暗",
"data-refresh-tip-desc": "虽然数据会自动更新,但您还是可以点击手动更新。",
@ -99,6 +99,7 @@
"date": "日期",
"default-market": "预设市场",
"default-spot-margin": "预设开启杠杆交易",
"degraded-performance": "Solana网格速度正在降低。交易也许会失败。(TPS: {{tps}})",
"delay-displaying-recent": "显示最近状态也许有所延误。",
"delayed-info": "资料每小时更新",
"deposit": "存款",
@ -141,6 +142,7 @@
"first-deposit-desc": "创建Mango帐户最少需要0.035 SOL。",
"funding": "资金费",
"funding-chart-title": "资金费 前30天(图表有点延迟)",
"futures": "永续合约",
"get-started": "开始",
"health": "健康度",
"health-check": "帐户健康检查",
@ -229,7 +231,7 @@
"net": "净",
"net-balance": "净余额",
"net-interest-value": "利息净价值",
"net-interest-value-desc": "利息是以获取/付出时价值来计算的。纳税时也许会有用。",
"net-interest-value-desc": "利息是以获取/付出时价值来计算的。纳税时也许会有用。",
"new": "新子帐户",
"new-account": "新子帐户",
"next": "前往",
@ -305,6 +307,7 @@
"repay-partial": "归还{{percentage}}%借贷",
"reposition": "推动以重新定位",
"reset": "重置",
"rolling-change": "24小时变动",
"rpc-endpoint": "RPC终点",
"save": "保存",
"save-name": "保存标签",
@ -360,6 +363,7 @@
"tooltip-display-step": "显示梯计",
"tooltip-earn-mngo": "以做永续合约市商而获得MNGO奖励。",
"tooltip-enable-margin": "为此交易啟用保证金",
"tooltip-funding": "资金费是连续支付的。一小时费率以前60分钟滚动平均来算。",
"tooltip-gui-rebate": "吃单费率是{{taker_rate}}再减20%介面费率折扣.",
"tooltip-interest-charged": "利率以借贷餘额计算而可波动。",
"tooltip-ioc": "IOC交易若不吃单就会被取消。",
@ -388,6 +392,7 @@
"trade": "交易",
"trade-history": "交易纪录",
"trades": "成交",
"trade-export-disclaimer": "Due to the nature of how trades are processed, it is not possible to guarantee that all trades will be exported. However, a best effort approach has been taken, combining several independent sources to reduce the likelihood of missing trades.",
"trades-history": "交易纪录",
"transaction-sent": "已下订单",
"trigger-price": "触发价格",

View File

@ -88,10 +88,10 @@
"create-account": "創建帳戶",
"current-stats": "當前統計",
"custom": "自定義",
"daily-change": "24小時變動",
"daily-high": "24hr高價",
"daily-low": "24hr底價",
"daily-range": "24小時廣度",
"daily-change": "一日間變動",
"daily-high": "24小時高價",
"daily-low": "24小時底價",
"daily-range": "一日間廣度",
"daily-volume": "24小時成交量",
"dark": "黑暗",
"data-refresh-tip-desc": "雖然數據會自動更新,但您還是可以點擊手動更新。",
@ -99,6 +99,7 @@
"date": "日期",
"default-market": "預設市場",
"default-spot-margin": "預設開啟槓桿交易",
"degraded-performance": "Solana網格速度正在降低。交易也許會失敗。(TPS: {{tps}})",
"delay-displaying-recent": "顯示最近狀態也許有所延誤。",
"delayed-info": "資料每小時更新",
"deposit": "存款",
@ -141,6 +142,7 @@
"first-deposit-desc": "創建Mango帳戶最少需要0.035 SOL。",
"funding": "資金費",
"funding-chart-title": "資金費 前30天(圖表有點延遲)",
"futures": "永續合約",
"get-started": "開始",
"health": "健康度",
"health-check": "帳戶健康檢查",
@ -229,7 +231,7 @@
"net": "淨",
"net-balance": "淨餘額",
"net-interest-value": "利息淨價值",
"net-interest-value-desc": "利息是以獲取/付出時價值來計算的。納稅時也許會有用。",
"net-interest-value-desc": "利息是以獲取/付出時價值來計算的。納稅時也許會有用。",
"new": "新子帳戶",
"new-account": "新子帳戶",
"next": "前往",
@ -305,6 +307,7 @@
"repay-partial": "歸還{{percentage}}%借貸",
"reposition": "推動以重新定位",
"reset": "重置",
"rolling-change": "24小時變動",
"rpc-endpoint": "RPC終點",
"save": "保存",
"save-name": "保存標籤",
@ -360,6 +363,7 @@
"tooltip-display-step": "顯示梯計",
"tooltip-earn-mngo": "以做永續合約市商而獲得MNGO獎勵。",
"tooltip-enable-margin": "為此交易啟用保證金",
"tooltip-funding": "資金費是連續支付的。一小時費率以前60分鐘滾動平均來算。",
"tooltip-gui-rebate": "吃單費率是{{taker_rate}}再減20%介面費率折扣.",
"tooltip-interest-charged": "利率以借貸餘額計算而可波動。",
"tooltip-ioc": "IOC交易若不吃單就會被取消。",
@ -388,6 +392,7 @@
"trade": "交易",
"trade-history": "交易紀錄",
"trades": "成交",
"trade-export-disclaimer": "Due to the nature of how trades are processed, it is not possible to guarantee that all trades will be exported. However, a best effort approach has been taken, combining several independent sources to reduce the likelihood of missing trades.",
"trades-history": "交易紀錄",
"transaction-sent": "已下訂單",
"trigger-price": "觸發價格",