diff --git a/app/package.json b/app/package.json
index bd6c720b..08a0b918 100644
--- a/app/package.json
+++ b/app/package.json
@@ -26,7 +26,7 @@
"@spindl-xyz/attribution-lite": "^0.0.7",
"copy-to-clipboard": "^3.3.1",
"nullthrows": "^1.1.1",
- "posthog-js": "^1.28.0",
+ "posthog-js": "^1.57.2",
"react": "18.2.0",
"react-csv": "^2.2.2",
"react-dom": "^18.2.0",
diff --git a/app/public/images/arbitrum-circle.svg b/app/public/images/arbitrum-logo.svg
similarity index 100%
rename from app/public/images/arbitrum-circle.svg
rename to app/public/images/arbitrum-logo.svg
diff --git a/app/public/images/arbitrum-vaults.png b/app/public/images/arbitrum-vaults.png
deleted file mode 100644
index da285222..00000000
Binary files a/app/public/images/arbitrum-vaults.png and /dev/null differ
diff --git a/app/public/images/newport-optimism.png b/app/public/images/newport-optimism.png
new file mode 100644
index 00000000..240b268f
Binary files /dev/null and b/app/public/images/newport-optimism.png differ
diff --git a/app/public/images/op-logo.svg b/app/public/images/op-logo.svg
new file mode 100644
index 00000000..2e5ce310
--- /dev/null
+++ b/app/public/images/op-logo.svg
@@ -0,0 +1,5 @@
+
diff --git a/app/public/images/optimism.png b/app/public/images/optimism.png
deleted file mode 100644
index 0e0a6df0..00000000
Binary files a/app/public/images/optimism.png and /dev/null differ
diff --git a/app/src/PageRoutes.tsx b/app/src/PageRoutes.tsx
index 06c66622..e43bc9d5 100644
--- a/app/src/PageRoutes.tsx
+++ b/app/src/PageRoutes.tsx
@@ -6,6 +6,9 @@ import { Navigate, Route, Routes } from 'react-router-dom'
import useNetwork from './hooks/account/useNetwork'
import AdminBoardPage from './pages/AdminBoardPage'
import AdminMarketPage from './pages/AdminPage'
+import EarnArrakisPage from './pages/EarnArrakisPage'
+import EarnIndexPage from './pages/EarnIndexPage'
+import EarnVaultsPage from './pages/EarnVaultsPage'
import EscrowPage from './pages/EscrowPage'
import FaucetPage from './pages/FaucetPage'
import LeaderboardHistoryPage from './pages/LeaderboardHistoryPage'
@@ -13,15 +16,9 @@ import LeaderboardPage from './pages/LeaderboardPage'
import NotFoundPage from './pages/NotFoundPage'
import PositionPage from './pages/PositionPage'
import ReferralsPage from './pages/ReferralsPage'
-import RewardsArrakisPage from './pages/RewardsArrakisPage'
-import RewardsIndexPage from './pages/RewardsIndexPage'
-import RewardsVaultsPage from './pages/RewardsVaultsPage'
import StoryBookPage from './pages/StoryBookPage'
import TradeHistoryPage from './pages/TradeHistoryPage'
import TradePage from './pages/TradePage'
-import VaultsHistoryPage from './pages/VaultsHistoryPage'
-import VaultsIndexPage from './pages/VaultsIndexPage'
-import VaultsPage from './pages/VaultsPage'
import VoteIndexPage from './pages/VoteIndexPage'
import VoteProposalCreatePage from './pages/VoteProposalCreatePage'
import VoteProposalDetailsPage from './pages/VoteProposalDetailsPage'
@@ -33,14 +30,9 @@ export default function PageRoutes() {
return (
} />
- } />
- } />
} />
} />
} />
- } />
- } />
- } />
} />
{isMainnet() ? (
<>
@@ -50,10 +42,12 @@ export default function PageRoutes() {
} />
} />
} />
- } />
- } />
- } />
- } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
>
) : null}
} />
diff --git a/app/src/components/common/PositionsTable/index.tsx b/app/src/components/common/PositionsTable/index.tsx
index 05080401..b6b869ae 100644
--- a/app/src/components/common/PositionsTable/index.tsx
+++ b/app/src/components/common/PositionsTable/index.tsx
@@ -130,7 +130,7 @@ const PositionsTable = ({ positions, onClick, pageSize, ...styleProps }: Props)
accessor: 'averageCostPerOption',
Header: 'Average Cost',
Cell: (props: TableCellProps) => {
- return {formatUSD(props.cell.value)}
+ return {props.cell.value ? formatUSD(props.cell.value) : '-'}
},
},
{
@@ -148,12 +148,14 @@ const PositionsTable = ({ positions, onClick, pageSize, ...styleProps }: Props)
const { pnlPercentage } = props.row.original
return (
- 0 ? 'primaryText' : 'errorText'}>
+ 0 ? 'primaryText' : 'errorText'}>
{formatUSD(props.cell.value, { showSign: true })}
-
- {formatPercentage(pnlPercentage)}
-
+ {pnlPercentage ? (
+
+ {formatPercentage(pnlPercentage)}
+
+ ) : null}
)
},
diff --git a/app/src/components/common/RowItem/index.tsx b/app/src/components/common/RowItem/index.tsx
index f74a4d6f..17de8fe2 100644
--- a/app/src/components/common/RowItem/index.tsx
+++ b/app/src/components/common/RowItem/index.tsx
@@ -7,15 +7,22 @@ type Props = {
label: string | React.ReactNode
value: string | React.ReactNode
valueColor?: TextColor
+ variant?: 'small' | 'body'
} & MarginProps &
LayoutProps
-export default function RowItem({ label, value, valueColor = 'text', ...styleProps }: Props) {
+export default function RowItem({ label, value, variant, valueColor = 'text', ...styleProps }: Props) {
return (
- {typeof label === 'string' ? {label} : label}
+ {typeof label === 'string' ? (
+
+ {label}
+
+ ) : (
+ label
+ )}
{typeof value === 'string' ? (
-
+
{value}
) : (
diff --git a/app/src/components/common/TradeEventsTable/index.tsx b/app/src/components/common/TradeEventsTable/index.tsx
index 1d3f7f85..4e17a073 100644
--- a/app/src/components/common/TradeEventsTable/index.tsx
+++ b/app/src/components/common/TradeEventsTable/index.tsx
@@ -6,7 +6,7 @@ import formatBalance from '@lyra/ui/utils/formatBalance'
import formatNumber from '@lyra/ui/utils/formatNumber'
import formatTruncatedDuration from '@lyra/ui/utils/formatTruncatedDuration'
import formatUSD from '@lyra/ui/utils/formatUSD'
-import { AccountRewardEpoch, CollateralUpdateEvent, Position, SettleEvent, TradeEvent } from '@lyrafinance/lyra-js'
+import { CollateralUpdateEvent, Position, SettleEvent, TradeEvent } from '@lyrafinance/lyra-js'
import React, { useMemo } from 'react'
import filterNulls from '@/app/utils/filterNulls'
@@ -19,7 +19,6 @@ type Props = {
events: { event: TradeEvent | CollateralUpdateEvent | SettleEvent; position: Position }[]
onClick?: (event: TradeEvent | CollateralUpdateEvent | SettleEvent) => void
pageSize?: number
- accountRewardEpochs?: AccountRewardEpoch[]
} & MarginProps
export type TradeEventTableData = TableData<{
@@ -39,16 +38,13 @@ export type TradeEventTableData = TableData<{
isBaseCollateral: boolean
}>
-const TradeEventsTable = ({ events, accountRewardEpochs, onClick, pageSize = 10 }: Props) => {
+const TradeEventsTable = ({ events, onClick, pageSize = 10 }: Props) => {
const rows: TradeEventTableData[] = useMemo(() => {
return events.map(({ event, position }) => {
const marketName = event.marketName
const strikePrice = fromBigNumber(event.strikePrice)
const isCall = event.isCall
const expiryTimestamp = event.expiryTimestamp
- const accountRewardEpoch = accountRewardEpochs?.find(
- epoch => epoch.globalEpoch.startTimestamp < event.timestamp && epoch.globalEpoch.endTimestamp >= event.timestamp
- )
let collateralValue = 0
let collateralAmount = 0
@@ -95,7 +91,7 @@ const TradeEventsTable = ({ events, accountRewardEpochs, onClick, pageSize = 10
onClick: onClick ? () => onClick(event) : undefined,
}
})
- }, [events, accountRewardEpochs, onClick])
+ }, [events, onClick])
const columns = useMemo[]>(() => {
return filterNulls([
diff --git a/app/src/components/common/VaultSelector/index.tsx b/app/src/components/common/VaultSelector/index.tsx
deleted file mode 100644
index 4792d81f..00000000
--- a/app/src/components/common/VaultSelector/index.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { ButtonSize } from '@lyra/ui/components/Button'
-import DropdownButton from '@lyra/ui/components/Button/DropdownButton'
-import DropdownButtonListItem from '@lyra/ui/components/Button/DropdownButtonListItem'
-import { TextVariant } from '@lyra/ui/components/Text'
-import { LayoutProps, MarginProps } from '@lyra/ui/types'
-import { Market } from '@lyrafinance/lyra-js'
-import React, { useCallback, useState } from 'react'
-
-type Props = {
- selectedVault: Market | null
- vaults: Market[]
- onChangeVault: (vault: Market) => void
- size?: ButtonSize
- textVariant?: TextVariant
- isTransparent?: boolean
-} & LayoutProps &
- MarginProps
-
-const VaultSelector = ({
- onChangeVault,
- selectedVault,
- vaults,
- size = 'sm',
- textVariant = 'body',
- isTransparent = false,
- ...styleProps
-}: Props) => {
- const [isOpen, setIsOpen] = useState(false)
- const onClose = useCallback(() => setIsOpen(false), [])
- return (
- setIsOpen(true)}
- isOpen={isOpen}
- label={`${selectedVault?.name} Vault APY` ?? ''}
- size={size}
- textVariant={textVariant}
- mobileTitle="Select Vault"
- >
- {vaults.map(market => {
- return (
- {
- onChangeVault(market)
- onClose()
- }}
- />
- )
- })}
-
- )
-}
-
-export default VaultSelector
diff --git a/app/src/components/position/PositionHistoryCard/index.tsx b/app/src/components/position/PositionHistoryCard/index.tsx
index 39ac9397..be89b258 100644
--- a/app/src/components/position/PositionHistoryCard/index.tsx
+++ b/app/src/components/position/PositionHistoryCard/index.tsx
@@ -1,13 +1,9 @@
import Card, { CardElement } from '@lyra/ui/components/Card'
-import CardBody from '@lyra/ui/components/Card/CardBody'
-import Center from '@lyra/ui/components/Center'
-import Spinner from '@lyra/ui/components/Spinner'
+import CardSection from '@lyra/ui/components/Card/CardSection'
import Text from '@lyra/ui/components/Text'
import { Position } from '@lyrafinance/lyra-js'
import React, { useMemo } from 'react'
-import withSuspense from '@/app/hooks/data/withSuspense'
-import useAccountRewardEpochs from '@/app/hooks/rewards/useAccountRewardEpochs'
import filterNulls from '@/app/utils/filterNulls'
import getExplorerUrl from '@/app/utils/getExplorerUrl'
@@ -17,46 +13,39 @@ type Props = {
position: Position
}
-const PositionHistoryCard = withSuspense(
- ({ position }: Props): CardElement => {
- const accountRewardEpochs = useAccountRewardEpochs()
- const events = useMemo(() => {
- if (position) {
- return filterNulls([
- ...position.trades(),
- ...position.collateralUpdates().filter(c => c.isAdjustment),
- position.settle(),
- ])
- .sort((a, b) => b.blockNumber - a.blockNumber)
- .map(event => ({ event, position }))
- } else {
- return []
- }
- }, [position])
- return (
-
-
-
- History
+const PositionHistoryCard = ({ position }: Props): CardElement => {
+ const events = useMemo(() => {
+ if (position) {
+ return filterNulls([
+ ...position.trades(),
+ ...position.collateralUpdates().filter(c => c.isAdjustment),
+ position.settle(),
+ ])
+ .sort((a, b) => b.blockNumber - a.blockNumber)
+ .map(event => ({ event, position }))
+ } else {
+ return []
+ }
+ }, [position])
+ return (
+
+
+ History
+
+ 0}>
+ {!events.length ? (
+
+ Syncing trade history...
+ ) : (
window.open(getExplorerUrl(event.lyra.network, event.transactionHash), '_blank')}
/>
-
-
- )
- },
- () => {
- return (
-
-
-
-
-
- )
- }
-)
+ )}
+
+
+ )
+}
export default PositionHistoryCard
diff --git a/app/src/components/rewards/TradingFeeRebateTable/index.tsx b/app/src/components/rewards/TradingFeeRebateTable/index.tsx
deleted file mode 100644
index c40645c7..00000000
--- a/app/src/components/rewards/TradingFeeRebateTable/index.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import Flex from '@lyra/ui/components/Flex'
-import Text from '@lyra/ui/components/Text'
-import { LayoutProps, MarginProps } from '@lyra/ui/types'
-import formatNumber from '@lyra/ui/utils/formatNumber'
-import formatPercentage from '@lyra/ui/utils/formatPercentage'
-import { GlobalRewardEpochTradingFeeRebateTier } from '@lyrafinance/lyra-js'
-import React from 'react'
-
-import RowItem from '../../common/RowItem'
-
-type Props = {
- feeRebateTiers: GlobalRewardEpochTradingFeeRebateTier[]
- effectiveRebate?: number
-} & MarginProps &
- LayoutProps
-
-export function TradingFeeRebateTable({ effectiveRebate, feeRebateTiers, ...styleProps }: Props) {
- return (
-
- Staked LYRA}
- value={Rebate}
- />
-
- {feeRebateTiers.map(feeRebateTier => (
-
- {formatNumber(feeRebateTier.stakedLyraCutoff)}
-
- }
- value={
-
- {formatPercentage(feeRebateTier.feeRebate, true)}
-
- }
- />
- ))}
-
-
- )
-}
diff --git a/app/src/components/trade/TradeBoardTableOrList/TradeBoardTableDesktop.tsx b/app/src/components/trade/TradeBoardTableOrList/TradeBoardTableDesktop.tsx
index 11f052f8..c5792ec1 100644
--- a/app/src/components/trade/TradeBoardTableOrList/TradeBoardTableDesktop.tsx
+++ b/app/src/components/trade/TradeBoardTableOrList/TradeBoardTableDesktop.tsx
@@ -142,7 +142,7 @@ const TradeBoardTableDesktop = ({
0
)
return {
- rowIdx: rows.length,
+ rowIdx: spotPriceRowIdx,
content: (
diff --git a/app/src/components/trade/TradeChainTable/TradeChainPriceButton.tsx b/app/src/components/trade/TradeChainTable/TradeChainPriceButton.tsx
index 927d21cb..7541d1ed 100644
--- a/app/src/components/trade/TradeChainTable/TradeChainPriceButton.tsx
+++ b/app/src/components/trade/TradeChainTable/TradeChainPriceButton.tsx
@@ -37,26 +37,24 @@ export default function TradeChainPriceButton({
onSelected = emptyFunction,
...styleProps
}: Props): ButtonElement {
- return quote ? (
+ return quote && (!quote.disabledReason || (quote.disabledReason && !getIsQuoteHidden(quote.disabledReason))) ? (