Skip to content

Commit 28da880

Browse files
alfetopitoLeandro Boscariol
andauthored
Classifying trade on getTrades service and storying type on Trade (gnosis#1103)
Co-authored-by: Leandro Boscariol <[email protected]>
1 parent 75b796f commit 28da880

File tree

6 files changed

+37
-27
lines changed

6 files changed

+37
-27
lines changed

src/api/exchange/ExchangeApi.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ export interface EventWithBlockInfo extends BaseTradeEvent {
148148
timestamp: number
149149
}
150150

151+
export type TradeType = 'full' | 'partial' | 'liquidity' | 'unknown'
152+
151153
/**
152154
* Trade enriches BaseTradeEvent with block, order and token data
153155
*/
@@ -157,6 +159,7 @@ export interface Trade extends EventWithBlockInfo {
157159
settlingTimestamp: number
158160
buyToken: TokenDetails
159161
sellToken: TokenDetails
162+
type?: TradeType
160163
limitPrice?: BigNumber
161164
fillPrice: BigNumber
162165
remainingAmount?: BN

src/components/TradesWidget/TradeRow.tsx

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,23 @@ import BigNumber from 'bignumber.js'
44
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
55
import { faUndo } from '@fortawesome/free-solid-svg-icons'
66

7-
import { formatPrice, formatSmart, formatAmountFull, DEFAULT_PRECISION, isOrderUnlimited } from '@gnosis.pm/dex-js'
7+
import { formatPrice, formatSmart, formatAmountFull, DEFAULT_PRECISION } from '@gnosis.pm/dex-js'
88

9-
import { Trade } from 'api/exchange/ExchangeApi'
9+
import { Trade, TradeType } from 'api/exchange/ExchangeApi'
1010

1111
import { EtherscanLink } from 'components/EtherscanLink'
1212

13-
import { isTradeFilled, isTradeSettled, formatDateFromBatchId } from 'utils'
13+
import { isTradeSettled, formatDateFromBatchId } from 'utils'
1414
import { displayTokenSymbolOrLink } from 'utils/display'
1515
import { ONE_HUNDRED_BIG_NUMBER } from 'const'
1616

17-
type TradeType = 'full' | 'partial' | 'liquidity' | 'unknown'
18-
19-
export function classifyTrade(trade: Trade): TradeType {
20-
const { remainingAmount, orderBuyAmount, orderSellAmount } = trade
21-
22-
if (!remainingAmount) {
23-
return 'unknown'
24-
}
25-
if (orderBuyAmount && orderSellAmount && isOrderUnlimited(orderBuyAmount, orderSellAmount)) {
26-
return 'liquidity'
27-
}
28-
return isTradeFilled(trade) ? 'full' : 'partial'
29-
}
30-
3117
interface TradeRowProps {
3218
trade: Trade
3319
networkId?: number
3420
}
3521

3622
const TypePill = styled.span<{
37-
tradeType: TradeType
23+
tradeType?: TradeType
3824
}>`
3925
background-color: ${({ tradeType }): string => {
4026
switch (tradeType) {
@@ -96,14 +82,13 @@ export const TradeRow: React.FC<TradeRowProps> = params => {
9682
timestamp,
9783
txHash,
9884
orderSellAmount,
85+
type,
9986
} = trade
10087
const buyTokenDecimals = buyToken.decimals || DEFAULT_PRECISION
10188
const sellTokenDecimals = sellToken.decimals || DEFAULT_PRECISION
10289

103-
const tradeType = useMemo(() => classifyTrade(trade), [trade])
104-
10590
const typeColumnTitle = useMemo(() => {
106-
switch (tradeType) {
91+
switch (type) {
10792
case 'full':
10893
case 'partial': {
10994
if (orderSellAmount) {
@@ -122,7 +107,7 @@ export const TradeRow: React.FC<TradeRowProps> = params => {
122107
default:
123108
return ''
124109
}
125-
}, [orderSellAmount, sellAmount, sellToken, sellTokenDecimals, tradeType])
110+
}, [orderSellAmount, sellAmount, sellToken, sellTokenDecimals, type])
126111

127112
// Do not display trades that are not settled
128113
return !isTradeSettled(trade) ? null : (
@@ -146,7 +131,7 @@ export const TradeRow: React.FC<TradeRowProps> = params => {
146131
{formatSmart({ amount: buyAmount, precision: buyTokenDecimals })} {displayTokenSymbolOrLink(buyToken)}
147132
</td>
148133
<td data-label="Type" title={typeColumnTitle}>
149-
<TypePill tradeType={tradeType}>{tradeType}</TypePill>
134+
<TypePill tradeType={type}>{type}</TypePill>
150135
</td>
151136
<td>
152137
{/* TODO: remove icon and filter out reverted trades */}

src/components/TradesWidget/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { Trade } from 'api/exchange/ExchangeApi'
1818

1919
import { toCsv, CsvColumns } from 'utils/csv'
2020

21-
import { TradeRow, classifyTrade } from 'components/TradesWidget/TradeRow'
21+
import { TradeRow } from 'components/TradesWidget/TradeRow'
2222
import { getNetworkFromId, isTradeSettled, isTradeReverted } from 'utils'
2323

2424
const CsvButtonContainer = styled.div`
@@ -74,7 +74,7 @@ function csvTransformer(trade: Trade): CsvColumns {
7474
thousandSeparator: false,
7575
isLocaleAware: false,
7676
}),
77-
Type: classifyTrade(trade),
77+
Type: trade.type || '',
7878
TransactionHash: txHash,
7979
EventLogIndex: eventIndex.toString(),
8080
OrderId: orderId,

src/services/factories/getTrades.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { ExchangeApi, Trade, TradeReversion, Order, AuctionElement, BaseTradeEve
88
import { getTokensFactory } from 'services/factories/tokenList'
99
import { addUnlistedTokensToUserTokenListByIdFactory } from 'services/factories/addUnlistedTokensToUserTokenListById'
1010

11-
import { dateToBatchId, calculateSettlingTimestamp, logDebug, isOrderDeleted } from 'utils'
11+
import { dateToBatchId, calculateSettlingTimestamp, logDebug, isOrderDeleted, classifyTrade } from 'utils'
1212

1313
interface GetTradesAndTradeReversionParams {
1414
networkId: number
@@ -64,7 +64,7 @@ export function getTradesAndTradeReversionsFactory(factoryParams: {
6464
// Maybe we couldn't find the order /shrug
6565
const order = orders.get(event.orderId)
6666

67-
return {
67+
const trade: Trade = {
6868
...event,
6969
batchId,
7070
timestamp,
@@ -85,6 +85,10 @@ export function getTradesAndTradeReversionsFactory(factoryParams: {
8585
orderBuyAmount: order && order.priceNumerator,
8686
orderSellAmount: order && order.priceDenominator,
8787
}
88+
89+
trade.type = classifyTrade(trade)
90+
91+
return trade
8892
})
8993
}
9094

src/utils/classifiers.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { isOrderUnlimited } from '@gnosis.pm/dex-js'
2+
3+
import { isTradeFilled } from './miscellaneous'
4+
5+
import { Trade, TradeType } from 'api/exchange/ExchangeApi'
6+
7+
export function classifyTrade(trade: Trade): TradeType {
8+
const { remainingAmount, orderBuyAmount, orderSellAmount } = trade
9+
10+
if (!remainingAmount) {
11+
return 'unknown'
12+
}
13+
if (orderBuyAmount && orderSellAmount && isOrderUnlimited(orderBuyAmount, orderSellAmount)) {
14+
return 'liquidity'
15+
}
16+
return isTradeFilled(trade) ? 'full' : 'partial'
17+
}

src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export * from './price'
77
export * from './validation'
88
export * from './flagCodes'
99
export * from './deferred'
10+
export * from './classifiers'

0 commit comments

Comments
 (0)