Merge branch 'main' of github.com:blockworks-foundation/mango-ui-v3 into kierangillen/wallet-updates
This commit is contained in:
commit
a827bb71d2
|
@ -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>
|
||||
)
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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')}
|
||||
|
|
|
@ -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} />
|
||||
|
|
|
@ -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>
|
||||
</>
|
||||
)
|
||||
|
|
|
@ -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') ? (
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "触发价格",
|
||||
|
|
|
@ -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": "觸發價格",
|
||||
|
|
Loading…
Reference in New Issue