From 1634a47a3b55fc1a9ac3bf029209ad555f3d24ea Mon Sep 17 00:00:00 2001 From: jorbuedo Date: Mon, 18 Mar 2024 18:39:43 +0100 Subject: [PATCH] Use new completed orders endpoint --- .../ListOrders/CompletedOrders.tsx | 99 ++++++------------- .../src/adapters/openswap-api/api.mocks.ts | 2 + .../swap/src/adapters/openswap-api/config.ts | 4 +- .../adapters/openswap-api/openswap.mocks.ts | 3 +- .../swap/src/adapters/openswap-api/orders.ts | 6 +- .../swap/src/adapters/openswap-api/types.ts | 2 +- packages/swap/src/helpers/transformers.ts | 7 +- packages/types/src/swap/order.ts | 2 + 8 files changed, 46 insertions(+), 79 deletions(-) diff --git a/apps/wallet-mobile/src/features/Swap/useCases/StartSwapScreen/ListOrders/CompletedOrders.tsx b/apps/wallet-mobile/src/features/Swap/useCases/StartSwapScreen/ListOrders/CompletedOrders.tsx index c561f28b06..89dd5e105d 100644 --- a/apps/wallet-mobile/src/features/Swap/useCases/StartSwapScreen/ListOrders/CompletedOrders.tsx +++ b/apps/wallet-mobile/src/features/Swap/useCases/StartSwapScreen/ListOrders/CompletedOrders.tsx @@ -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' @@ -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' @@ -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) - .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() @@ -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 ( @@ -125,9 +85,9 @@ export const CompletedOrders = () => { } - keyExtractor={(item) => item.id} - ListEmptyComponent={} + renderItem={({item}: {item: Swap.CompletedOrder}) => } + keyExtractor={(item) => item.txHash} + ListEmptyComponent={} /> @@ -141,21 +101,26 @@ export const CompletedOrders = () => { ) } -export const ExpandableOrder = ({order, tokenInfos}: {order: MappedRawOrder; tokenInfos: Array}) => { +export const ExpandableOrder = ({ + order, + tokenInfos, +}: { + order: Swap.CompletedOrder + tokenInfos: Array +}) => { const [hiddenInfoOpenId, setHiddenInfoOpenId] = React.useState(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 = - const buyIcon = - 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 = + const buyIcon = + 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 ?? '-' @@ -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={ @@ -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, @@ -336,10 +301,10 @@ const TxLink = ({onTxPress, txId}: {onTxPress: () => void; txId: string}) => { ) } -const ListEmptyComponent = ({completedOrders}: {completedOrders: Array}) => { +const ListEmptyComponent = ({completedOrders}: {completedOrders: Swap.CompletedOrderResponse}) => { const {search: assetSearchTerm, visible: isSearching} = useSearch() - if (isSearching && assetSearchTerm.length > 0 && completedOrders.length === 0) return + if (isSearching && assetSearchTerm.length > 0 && completedOrders.length > 0) return return } diff --git a/packages/swap/src/adapters/openswap-api/api.mocks.ts b/packages/swap/src/adapters/openswap-api/api.mocks.ts index 0ef53c097f..2273ba3669 100644 --- a/packages/swap/src/adapters/openswap-api/api.mocks.ts +++ b/packages/swap/src/adapters/openswap-api/api.mocks.ts @@ -25,6 +25,8 @@ const getCompletedOrders: Array = [ tokenId: 'c04f4200502a998e9eebafac0291a1f38008de3fe146d136946d8f4b.415247454e54', }, + provider: 'minswap', + placedAt: 1631635254, }, ] diff --git a/packages/swap/src/adapters/openswap-api/config.ts b/packages/swap/src/adapters/openswap-api/config.ts index aabb9a6bc1..4110dd262a 100644 --- a/packages/swap/src/adapters/openswap-api/config.ts +++ b/packages/swap/src/adapters/openswap-api/config.ts @@ -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', @@ -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: diff --git a/packages/swap/src/adapters/openswap-api/openswap.mocks.ts b/packages/swap/src/adapters/openswap-api/openswap.mocks.ts index 23e7fc396c..5bbb162ea3 100644 --- a/packages/swap/src/adapters/openswap-api/openswap.mocks.ts +++ b/packages/swap/src/adapters/openswap-api/openswap.mocks.ts @@ -368,7 +368,7 @@ const getCompletedOrders: CompletedOrder[] = [ attachedLvl: 'someAttachedLvl', scriptVersion: 'v1', pubKeyHash: 'somePubKeyHash', - feeField: 10, + dex: 'minswap', }, ] @@ -403,7 +403,6 @@ const getOpenOrders: OpenOrder[] = [ // ], utxo: '1e977694e2413bd0e6105303bb44da60530cafe49b864dde8f8902b021ed86ba#0', provider: 'muesliswap_v4', - // feeField: '2650000', // allowPartial: true, owner: 'addr1qxxvt9rzpdxxysmqp50d7f5a3gdescgrejsu7zsdxqjy8yun4cngaq46gr8c9qyz4td9ddajzqhjnrqvfh0gspzv9xnsmq6nqx', diff --git a/packages/swap/src/adapters/openswap-api/orders.ts b/packages/swap/src/adapters/openswap-api/orders.ts index 8f034bbd25..9a576e0a74 100644 --- a/packages/swap/src/adapters/openswap-api/orders.ts +++ b/packages/swap/src/adapters/openswap-api/orders.ts @@ -101,10 +101,6 @@ export async function getCompletedOrders( const response = await client.get(apiUrl, { params: { 'stake-key-hash': stakeKeyHash, - 'canceled': 'n', - 'open': 'n', - 'matched': 'y', - 'v2_only': 'y', }, }) @@ -114,5 +110,5 @@ export async function getCompletedOrders( }) } - return response.data.filter((order) => order.status === 'matched') + return response.data } diff --git a/packages/swap/src/adapters/openswap-api/types.ts b/packages/swap/src/adapters/openswap-api/types.ts index f6820414b1..951f0327eb 100644 --- a/packages/swap/src/adapters/openswap-api/types.ts +++ b/packages/swap/src/adapters/openswap-api/types.ts @@ -69,7 +69,7 @@ export type CompletedOrder = { attachedLvl: string scriptVersion: string pubKeyHash: string - feeField: number + dex: Provider } export type CompletedOrderResponse = CompletedOrder[] diff --git a/packages/swap/src/helpers/transformers.ts b/packages/swap/src/helpers/transformers.ts index 54d41d54ce..1bfae61edf 100644 --- a/packages/swap/src/helpers/transformers.ts +++ b/packages/swap/src/helpers/transformers.ts @@ -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}`, @@ -93,9 +94,11 @@ export const transformersMaker = ( } return { - txHash: txHash, + txHash, from: asYoroiAmount(from), to: asYoroiAmount(to), + placedAt, + provider: dex ?? 'muesliswap', } as const } diff --git a/packages/types/src/swap/order.ts b/packages/types/src/swap/order.ts index 2e31d83be9..26c964bb02 100644 --- a/packages/types/src/swap/order.ts +++ b/packages/types/src/swap/order.ts @@ -41,4 +41,6 @@ export type SwapCompletedOrder = { from: BalanceAmount to: BalanceAmount txHash: string + provider: SwapPoolProvider + placedAt: number }