Skip to content

Commit

Permalink
Use new completed orders endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
jorbuedo committed Mar 18, 2024
1 parent 53c5a03 commit 1634a47
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 79 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {useFocusEffect} from '@react-navigation/native'
import {getPoolUrlByProvider} from '@yoroi/swap'
import {getPoolUrlByProvider, useSwapOrdersByStatusCompleted} from '@yoroi/swap'
import {useTheme} from '@yoroi/theme'
import {Balance, Swap} from '@yoroi/types'
import BigNumber from 'bignumber.js'
Expand All @@ -23,12 +23,10 @@ import {
import {useMetrics} from '../../../../../metrics/metricsManager'
import {useSearch} from '../../../../../Search/SearchContext'
import {useSelectedWallet} from '../../../../../SelectedWallet'
import {useSync, useTokenInfos, useTransactionInfos} from '../../../../../yoroi-wallets/hooks'
import {TransactionInfo, TxMetadataInfo} from '../../../../../yoroi-wallets/types'
import {useTokenInfos} from '../../../../../yoroi-wallets/hooks'
import {asQuantity, openInExplorer, Quantities} from '../../../../../yoroi-wallets/utils'
import {PRICE_PRECISION} from '../../../common/constants'
import {Counter} from '../../../common/Counter/Counter'
import {parseOrderTxMetadata} from '../../../common/helpers'
import {EmptyCompletedOrdersIllustration} from '../../../common/Illustrations/EmptyCompletedOrdersIllustration'
import {LiquidityPool} from '../../../common/LiquidityPool/LiquidityPool'
import {PoolIcon} from '../../../common/PoolIcon/PoolIcon'
Expand All @@ -46,42 +44,10 @@ export type MappedRawOrder = {
date: string
}

const compareByDate = (a: MappedRawOrder, b: MappedRawOrder) => {
return new Date(b.date).getTime() - new Date(a.date).getTime()
}

const findCompletedOrderTx = (transactions: TransactionInfo[]): MappedRawOrder[] => {
const sentTransactions = transactions.filter((tx) => tx.direction === 'SENT')
const receivedTransactions = transactions.filter((tx) => tx.direction === 'RECEIVED')

const filteredTx = sentTransactions
.reduce((acc, sentTx) => {
const result: TxMetadataInfo = {}
receivedTransactions.forEach((receivedTx) => {
receivedTx.inputs.forEach((input) => {
if (Boolean(input.id) && input?.id?.slice(0, -1) === sentTx?.id && receivedTx.inputs.length > 1) {
result['id'] = sentTx?.id
result['date'] = receivedTx?.lastUpdatedAt
const metadata = parseOrderTxMetadata(sentTx?.metadata?.['674'])
if (metadata) {
result['metadata'] = metadata
return acc.push(result as MappedRawOrder)
}
}
})
})
return acc
}, [] as Array<MappedRawOrder>)
.sort(compareByDate)

return filteredTx.filter((tx) => tx.metadata !== null).sort(compareByDate)
}

export const CompletedOrders = () => {
const strings = useStrings()
const styles = useStyles()
const wallet = useSelectedWallet()
const {sync} = useSync(wallet)

const {track} = useMetrics()

Expand All @@ -91,32 +57,26 @@ export const CompletedOrders = () => {
}, [track]),
)

React.useEffect(() => {
sync()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

const transactionsInfos = useTransactionInfos(wallet)
const completeOrders = findCompletedOrderTx(Object.values(transactionsInfos))
const completedOrders = useSwapOrdersByStatusCompleted()
const tokenIds = React.useMemo(
() => _.uniq(completeOrders?.flatMap((o) => [o.metadata.sellTokenId, o.metadata.buyTokenId])),
[completeOrders],
() => _.uniq(completedOrders?.flatMap((o) => [o.from.tokenId, o.to.tokenId])),
[completedOrders],
)
const tokenInfos = useTokenInfos({wallet, tokenIds})
const {search} = useSearch()

const filteredOrders = React.useMemo(
() =>
completeOrders.filter((order) => {
const sellTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === order.metadata.sellTokenId)
const buyTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === order.metadata.buyTokenId)
completedOrders.filter((order) => {
const sellTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === order.from.tokenId)
const buyTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === order.to.tokenId)

const sellLabel = sellTokenInfo?.ticker ?? sellTokenInfo?.name ?? '-'
const buyLabel = buyTokenInfo?.ticker ?? buyTokenInfo?.name ?? '-'
const searchLower = search.toLocaleLowerCase()
return sellLabel.toLocaleLowerCase().includes(searchLower) || buyLabel.toLocaleLowerCase().includes(searchLower)
}),
[completeOrders, search, tokenInfos],
[completedOrders, search, tokenInfos],
)

return (
Expand All @@ -125,9 +85,9 @@ export const CompletedOrders = () => {
<FlatList
contentContainerStyle={{paddingTop: 10, paddingHorizontal: 16}}
data={filteredOrders}
renderItem={({item}: {item: MappedRawOrder}) => <ExpandableOrder tokenInfos={tokenInfos} order={item} />}
keyExtractor={(item) => item.id}
ListEmptyComponent={<ListEmptyComponent completedOrders={filteredOrders} />}
renderItem={({item}: {item: Swap.CompletedOrder}) => <ExpandableOrder tokenInfos={tokenInfos} order={item} />}
keyExtractor={(item) => item.txHash}
ListEmptyComponent={<ListEmptyComponent completedOrders={completedOrders} />}
/>
</View>

Expand All @@ -141,21 +101,26 @@ export const CompletedOrders = () => {
)
}

export const ExpandableOrder = ({order, tokenInfos}: {order: MappedRawOrder; tokenInfos: Array<Balance.TokenInfo>}) => {
export const ExpandableOrder = ({
order,
tokenInfos,
}: {
order: Swap.CompletedOrder
tokenInfos: Array<Balance.TokenInfo>
}) => {
const [hiddenInfoOpenId, setHiddenInfoOpenId] = React.useState<string | null>(null)
const wallet = useSelectedWallet()
const intl = useIntl()
const metadata = order.metadata
const id = order.id
const id = order.txHash
const expanded = id === hiddenInfoOpenId
const sellIcon = <TokenIcon wallet={wallet} tokenId={metadata.sellTokenId} variant="swap" />
const buyIcon = <TokenIcon wallet={wallet} tokenId={metadata.buyTokenId} variant="swap" />
const buyTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === metadata.buyTokenId)
const sellTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === metadata.sellTokenId)

const buyQuantity = Quantities.format(metadata.buyQuantity as Balance.Quantity, buyTokenInfo?.decimals ?? 0)
const sellQuantity = Quantities.format(metadata.sellQuantity as Balance.Quantity, sellTokenInfo?.decimals ?? 0)
const tokenPrice = asQuantity(new BigNumber(metadata.sellQuantity).dividedBy(metadata.buyQuantity).toString())
const sellIcon = <TokenIcon wallet={wallet} tokenId={order.from.tokenId} variant="swap" />
const buyIcon = <TokenIcon wallet={wallet} tokenId={order.to.tokenId} variant="swap" />
const buyTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === order.to.tokenId)
const sellTokenInfo = tokenInfos.find((tokenInfo) => tokenInfo.id === order.from.tokenId)

const buyQuantity = Quantities.format(order.to.quantity, buyTokenInfo?.decimals ?? 0)
const sellQuantity = Quantities.format(order.from.quantity, sellTokenInfo?.decimals ?? 0)
const tokenPrice = asQuantity(new BigNumber(order.from.quantity).dividedBy(order.to.quantity).toString())
const denomination = (sellTokenInfo?.decimals ?? 0) - (buyTokenInfo?.decimals ?? 0)
const marketPrice = Quantities.format(tokenPrice ?? Quantities.zero, denomination, PRICE_PRECISION)
const buyLabel = buyTokenInfo?.ticker ?? buyTokenInfo?.name ?? '-'
Expand All @@ -169,7 +134,7 @@ export const ExpandableOrder = ({order, tokenInfos}: {order: MappedRawOrder; tok
txId={id}
total={`${sellQuantity} ${sellLabel}`}
onTxPress={() => openInExplorer(id, wallet.networkId)}
provider={metadata.provider}
provider={order.provider}
/>
}
header={
Expand All @@ -190,7 +155,7 @@ export const ExpandableOrder = ({order, tokenInfos}: {order: MappedRawOrder; tok
sellLabel={sellLabel}
buyLabel={buyLabel}
tokenAmount={`${buyQuantity} ${buyLabel}`}
txTimeCreated={intl.formatDate(new Date(order.date), {
txTimeCreated={intl.formatDate(new Date(order.placedAt), {
dateStyle: 'short',
timeStyle: 'medium',
hour12: false,
Expand Down Expand Up @@ -336,10 +301,10 @@ const TxLink = ({onTxPress, txId}: {onTxPress: () => void; txId: string}) => {
)
}

const ListEmptyComponent = ({completedOrders}: {completedOrders: Array<MappedRawOrder>}) => {
const ListEmptyComponent = ({completedOrders}: {completedOrders: Swap.CompletedOrderResponse}) => {
const {search: assetSearchTerm, visible: isSearching} = useSearch()

if (isSearching && assetSearchTerm.length > 0 && completedOrders.length === 0) return <EmptySearchResult />
if (isSearching && assetSearchTerm.length > 0 && completedOrders.length > 0) return <EmptySearchResult />

return <NoOrdersYet />
}
Expand Down
2 changes: 2 additions & 0 deletions packages/swap/src/adapters/openswap-api/api.mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ const getCompletedOrders: Array<Swap.CompletedOrder> = [
tokenId:
'c04f4200502a998e9eebafac0291a1f38008de3fe146d136946d8f4b.415247454e54',
},
provider: 'minswap',
placedAt: 1631635254,
},
]

Expand Down
4 changes: 2 additions & 2 deletions packages/swap/src/adapters/openswap-api/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export const SWAP_API_ENDPOINTS = {
getPoolsPair: 'https://onchain2.muesliswap.com/pools/pair',
getLiquidityPools: 'https://api.muesliswap.com/liquidity/pools',
getOrders: 'https://onchain2.muesliswap.com/orders/all/',
getCompletedOrders: 'https://api.muesliswap.com/orders/v2',
getCompletedOrders: 'https://api.muesliswap.com/orders/v3/history',
getTokenPairs: 'https://api.muesliswap.com/list',
getTokens: 'https://api.muesliswap.com/token-list',
constructSwapDatum: 'https://aggregator.muesliswap.com/constructSwapDatum',
Expand All @@ -18,7 +18,7 @@ export const SWAP_API_ENDPOINTS = {
getPoolsPair: 'https://preprod.pools.muesliswap.com/pools/pair',
getLiquidityPools: 'https://preprod.api.muesliswap.com/liquidity/pools',
getOrders: 'https://preprod.pools.muesliswap.com/orders/all/',
getCompletedOrders: 'https://api.muesliswap.com/orders/v2',
getCompletedOrders: 'https://preprod.api.muesliswap.com/orders/v3/history',
getTokenPairs: 'https://preprod.api.muesliswap.com/list',
getTokens: 'https://preprod.api.muesliswap.com/token-list',
constructSwapDatum:
Expand Down
3 changes: 1 addition & 2 deletions packages/swap/src/adapters/openswap-api/openswap.mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ const getCompletedOrders: CompletedOrder[] = [
attachedLvl: 'someAttachedLvl',
scriptVersion: 'v1',
pubKeyHash: 'somePubKeyHash',
feeField: 10,
dex: 'minswap',
},
]

Expand Down Expand Up @@ -403,7 +403,6 @@ const getOpenOrders: OpenOrder[] = [
// ],
utxo: '1e977694e2413bd0e6105303bb44da60530cafe49b864dde8f8902b021ed86ba#0',
provider: 'muesliswap_v4',
// feeField: '2650000',
// allowPartial: true,
owner:
'addr1qxxvt9rzpdxxysmqp50d7f5a3gdescgrejsu7zsdxqjy8yun4cngaq46gr8c9qyz4td9ddajzqhjnrqvfh0gspzv9xnsmq6nqx',
Expand Down
6 changes: 1 addition & 5 deletions packages/swap/src/adapters/openswap-api/orders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,6 @@ export async function getCompletedOrders(
const response = await client.get<CompletedOrderResponse>(apiUrl, {
params: {
'stake-key-hash': stakeKeyHash,
'canceled': 'n',
'open': 'n',
'matched': 'y',
'v2_only': 'y',
},
})

Expand All @@ -114,5 +110,5 @@ export async function getCompletedOrders(
})
}

return response.data.filter((order) => order.status === 'matched')
return response.data
}
2 changes: 1 addition & 1 deletion packages/swap/src/adapters/openswap-api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export type CompletedOrder = {
attachedLvl: string
scriptVersion: string
pubKeyHash: string
feeField: number
dex: Provider
}
export type CompletedOrderResponse = CompletedOrder[]

Expand Down
7 changes: 5 additions & 2 deletions packages/swap/src/helpers/transformers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ export const transformersMaker = (
}

const asYoroiCompletedOrder = (openswapOrder: CompletedOrder) => {
const {txHash, fromAmount, fromToken, toAmount, toToken} = openswapOrder
const {txHash, fromAmount, fromToken, toAmount, toToken, placedAt, dex} =
openswapOrder
const from = {
amount: fromAmount,
token: `${fromToken.address.policyId}.${fromToken.address.name}`,
Expand All @@ -93,9 +94,11 @@ export const transformersMaker = (
}

return {
txHash: txHash,
txHash,
from: asYoroiAmount(from),
to: asYoroiAmount(to),
placedAt,
provider: dex ?? 'muesliswap',
} as const
}

Expand Down
2 changes: 2 additions & 0 deletions packages/types/src/swap/order.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,6 @@ export type SwapCompletedOrder = {
from: BalanceAmount
to: BalanceAmount
txHash: string
provider: SwapPoolProvider
placedAt: number
}

0 comments on commit 1634a47

Please sign in to comment.