Skip to content

Commit b86cc47

Browse files
committed
new order class
1 parent a6baf76 commit b86cc47

File tree

2 files changed

+90
-118
lines changed

2 files changed

+90
-118
lines changed

packages/sdk/src/lib/orders.ts

Lines changed: 90 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
1-
import { Config, Order, OrderStatus, OrderType } from "./types";
1+
import { Config, OrderStatus, OrderType } from "./types";
22
import BN from "bignumber.js";
33
import { amountUi, delay, eqIgnoreCase, getTheGraphUrl, groupBy, keyBy, orderBy } from "./utils";
44
import { getEstimatedDelayBetweenChunksMillis } from "./lib";
55
import { Configs } from "..";
66

7-
const getProgress = (srcFilled?: string, srcAmountIn?: string) => {
8-
if (!srcFilled || !srcAmountIn) return 0;
9-
let progress = BN(srcFilled || "0")
10-
.dividedBy(srcAmountIn || "0")
11-
.toNumber();
127

13-
return !progress ? 0 : progress < 0.99 ? progress * 100 : 100;
14-
};
158

169
const ordersCreatedQueryValues = `
1710
id
@@ -205,95 +198,100 @@ const getAllFills = async ({ endpoint, signal, ids }: { endpoint: string; signal
205198
return fills;
206199
};
207200

208-
const getStatus = (progress = 0, order: any, statuses?: any) => {
209-
let status = statuses?.[order.Contract_id]?.toLowerCase();
210-
if (progress === 100 || status === "completed") {
211-
return OrderStatus.Completed;
212-
}
213-
if (status === "canceled") {
214-
return OrderStatus.Canceled;
215-
}
216201

217-
if (new Date(Number(order.ask_deadline)).getTime() > Date.now() / 1000) return OrderStatus.Open;
218-
return OrderStatus.Expired;
219-
};
220202

221-
const getLimitPrice = (srcBidAmount: string, dstMinAmount: string, isMarketOrder: boolean, srcTokenDecimals: number, dstTokenDecimals: number) => {
222-
if (isMarketOrder) return;
223-
const srcBidAmountUi = amountUi(srcTokenDecimals, srcBidAmount);
224-
const dstMinAmountUi = amountUi(dstTokenDecimals, dstMinAmount);
203+
class Order {
204+
id: number;
205+
exchange: string;
206+
ask_fillDelay: number;
207+
dex: string;
208+
deadline: number;
209+
createdAt: number;
210+
srcAmount: string;
211+
dstMinAmount: string;
212+
status: string;
213+
srcChunkAmount: string;
214+
txHash: string;
215+
dstFilledAmount: string;
216+
srcFilledAmount: string;
217+
srcFilledAmountUsd: string;
218+
dstFilledAmountUsd: string;
219+
progress: number;
220+
srcTokenAddress: string;
221+
dstTokenAddress: string;
222+
totalChunks: number;
223+
isMarketOrder: boolean;
224+
orderType: string;
225+
226+
constructor(rawOrder: any, fills: any, status: any) {
227+
const isMarketOrder = BN(rawOrder.ask_dstMinAmount || 0).lte(1);
228+
this.id = Number(rawOrder.Contract_id);
229+
this.exchange = rawOrder.exchange;
230+
this.ask_fillDelay = rawOrder.ask_fillDelay;
231+
this.dex = "";
232+
this.deadline = Number(rawOrder.ask_deadline) * 1000;
233+
this.createdAt = new Date(rawOrder.timestamp).getTime();
234+
this.srcAmount = rawOrder.ask_srcAmount;
235+
this.dstMinAmount = rawOrder.ask_dstMinAmount;
236+
this.srcChunkAmount = rawOrder.ask_srcBidAmount;
237+
this.txHash = rawOrder.transactionHash;
238+
this.dstFilledAmount = fills?.dstAmountOut || 0;
239+
this.srcFilledAmount = fills?.srcAmountIn || 0;
240+
this.srcFilledAmountUsd = fills?.dollarValueIn || "0";
241+
this.dstFilledAmountUsd = fills?.dollarValueOut || "0";
242+
this.progress = this.getProgress(this.srcFilledAmount, this.srcAmount);
243+
this.status = this.getStatus(this.progress, rawOrder, status);
244+
245+
this.srcTokenAddress = rawOrder.ask_srcToken;
246+
this.dstTokenAddress = rawOrder.ask_dstToken;
247+
this.totalChunks = new BN(rawOrder.ask_srcAmount || 0)
248+
.div(rawOrder.ask_srcBidAmount || 1) // Avoid division by zero
249+
.integerValue(BN.ROUND_CEIL)
250+
.toNumber();
251+
this.orderType = isMarketOrder ? OrderType.TWAP_MARKET : BN(this.totalChunks).eq(1) ? OrderType.LIMIT : OrderType.TWAP_LIMIT;
252+
this.isMarketOrder = isMarketOrder;
253+
}
225254

226-
return BN(dstMinAmountUi).div(srcBidAmountUi).toString();
227-
};
255+
private getProgress = (srcFilled?: string, srcAmountIn?: string) => {
256+
if (!srcFilled || !srcAmountIn) return 0;
257+
let progress = BN(srcFilled || "0")
258+
.dividedBy(srcAmountIn || "0")
259+
.toNumber();
260+
261+
return !progress ? 0 : progress < 0.99 ? progress * 100 : 100;
262+
};
228263

229-
const getExcecutionPrice = (srcTokenDecimals: number, dstTokenDecimals: number, srcFilledAmount?: string, dstFilledAmount?: string) => {
230-
if (!BN(srcFilledAmount || 0).gt(0) || !BN(dstFilledAmount || 0).gt(0)) return;
264+
getFillDelay(config: Config) {
265+
return (this.ask_fillDelay || 0) * 1000 + getEstimatedDelayBetweenChunksMillis(config);
266+
}
231267

232-
const srcFilledAmountUi = amountUi(srcTokenDecimals, srcFilledAmount);
233-
const dstFilledAmountUi = amountUi(dstTokenDecimals, dstFilledAmount);
268+
getLimitPrice(srcTokenDecimals: number, dstTokenDecimals: number) {
269+
if (this.isMarketOrder) return;
270+
const srcBidAmountUi = amountUi(srcTokenDecimals, this.srcChunkAmount);
271+
const dstMinAmountUi = amountUi(dstTokenDecimals, this.dstMinAmount);
272+
return BN(dstMinAmountUi).div(srcBidAmountUi).toString();
273+
}
274+
getExcecutionPrice(srcTokenDecimals: number, dstTokenDecimals: number) {
275+
if (!BN(this.srcFilledAmount || 0).gt(0) || !BN(this.dstFilledAmount || 0).gt(0)) return;
276+
const srcFilledAmountUi = amountUi(srcTokenDecimals, this.srcFilledAmount);
277+
const dstFilledAmountUi = amountUi(dstTokenDecimals, this.dstFilledAmount);
234278

235-
return BN(dstFilledAmountUi).div(srcFilledAmountUi).toString();
236-
};
279+
return BN(dstFilledAmountUi).div(srcFilledAmountUi).toString();
280+
}
237281

238-
const parseOrder = (order: any, orderFill: any, statuses: any, config?: Config): Order => {
239-
const progress = getProgress(orderFill?.srcAmountIn, order.ask_srcAmount);
240-
const isMarketOrder = BN(order.ask_dstMinAmount || 0).lte(1);
241-
const totalChunks = BN(order.ask_srcAmount || 0)
242-
.div(order.ask_srcBidAmount || 0)
243-
.integerValue(BN.ROUND_CEIL)
244-
.toNumber();
245-
246-
const getOrderType = () => {
247-
if (isMarketOrder) {
248-
return OrderType.TWAP_MARKET;
282+
private getStatus(progress = 0, order: any, statuses?: any) {
283+
let status = statuses?.[order.Contract_id]?.toLowerCase();
284+
if (progress === 100 || status === "completed") {
285+
return OrderStatus.Completed;
249286
}
250-
if (BN(totalChunks).eq(1)) {
251-
return OrderType.LIMIT;
287+
if (status === "canceled") {
288+
return OrderStatus.Canceled;
252289
}
253290

254-
return OrderType.TWAP_LIMIT;
255-
};
256-
257-
return {
258-
id: Number(order.Contract_id),
259-
exchange: order.exchange,
260-
ask_fillDelay: order.ask_fillDelay,
261-
dex: getConfigFromExchangeAddress(order.exchange)?.name || "",
262-
deadline: Number(order.ask_deadline) * 1000,
263-
createdAt: new Date(order.timestamp).getTime(),
264-
srcAmount: order.ask_srcAmount,
265-
dstMinAmount: order.ask_dstMinAmount,
266-
status: getStatus(progress, order, statuses),
267-
srcBidAmount: order.ask_srcBidAmount,
268-
txHash: order.transactionHash,
269-
dstFilledAmount: orderFill?.dstAmountOut,
270-
srcFilledAmount: orderFill?.srcAmountIn,
271-
srcFilledAmountUsd: orderFill?.dollarValueIn || "0",
272-
dstFilledAmountUsd: orderFill?.dollarValueOut || "0",
273-
progress,
274-
srcTokenAddress: order.ask_srcToken,
275-
dstTokenAddress: order.ask_dstToken,
276-
totalChunks: BN(order.ask_srcAmount || 0)
277-
.div(order.ask_srcBidAmount || 0)
278-
.integerValue(BN.ROUND_CEIL)
279-
.toNumber(),
280-
isMarketOrder,
281-
orderType: getOrderType(),
282-
fillDelay: !config ? 0 : (order.ask_fillDelay || 0) * 1000 + getEstimatedDelayBetweenChunksMillis(config),
283-
getLimitPrice: (srcTokenDecimals: number, dstTokenDecimals: number) =>
284-
getLimitPrice(order.ask_srcBidAmount, order.ask_dstMinAmount, isMarketOrder, srcTokenDecimals, dstTokenDecimals),
285-
getExcecutionPrice: (srcTokenDecimals: number, dstTokenDecimals: number) =>
286-
getExcecutionPrice(srcTokenDecimals, dstTokenDecimals, orderFill?.srcAmountIn, orderFill?.dstAmountOut),
287-
};
288-
};
289-
290-
export const getOrderFillDelay = (order: Order, config: Config) => {
291-
return (order.ask_fillDelay || 0) * 1000 + getEstimatedDelayBetweenChunksMillis(config);
292-
};
293-
294-
export const getConfigFromExchangeAddress = (exchangeAddress: string) => {
295-
return Object.values(Configs).find((config) => eqIgnoreCase(config.exchangeAddress, exchangeAddress));
296-
};
291+
if (new Date(Number(order.ask_deadline)).getTime() > Date.now() / 1000) return OrderStatus.Open;
292+
return OrderStatus.Expired;
293+
}
294+
}
297295

298296
export const getOrders = async ({
299297
chainId,
@@ -324,9 +322,10 @@ export const getOrders = async ({
324322
const ids = orders.map((order: any) => order.Contract_id);
325323
const fills = await getAllFills({ endpoint, signal, ids });
326324
const statuses = await getOrderStatuses(ids, endpoint, signal);
327-
orders = orders.map((order: any) => {
328-
const fill = fills?.find((it) => it.TWAP_id === order.Contract_id);
329-
return parseOrder(order, fill, statuses, config);
325+
orders = orders.map((rawOrder: any) => {
326+
const fill = fills?.find((it) => it.TWAP_id === rawOrder.Contract_id);
327+
const status = statuses?.[rawOrder.Contract_id];
328+
return new Order(rawOrder, fill, status);
330329
});
331330

332331
const result = orderBy(orders, (o: any) => o.createdAt, "desc");
@@ -345,7 +344,7 @@ export const getOrderById = async ({ chainId, orderId, signal }: { chainId: numb
345344

346345
const statuses = await getOrderStatuses(ids, endpoint, signal);
347346

348-
return parseOrder(order, fills?.[0], statuses);
347+
return new Order(order, fills?.[0], statuses[order.Contract_id]);
349348
};
350349

351350
export const getAllOrders = ({

packages/sdk/src/lib/types.ts

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,33 +38,6 @@ export enum OrderType {
3838
TWAP_MARKET = "twap-market",
3939
}
4040

41-
export type Order = {
42-
id: number;
43-
exchange: string;
44-
ask_fillDelay: number;
45-
dex: string;
46-
deadline: number;
47-
createdAt: number;
48-
srcAmount: string;
49-
dstMinAmount: string;
50-
status: OrderStatus;
51-
srcBidAmount: string;
52-
txHash: string;
53-
dstFilledAmount: string;
54-
srcFilledAmount: string;
55-
srcFilledAmountUsd: string;
56-
dstFilledAmountUsd: string;
57-
progress: number;
58-
srcTokenAddress: string;
59-
dstTokenAddress: string;
60-
totalChunks: number;
61-
isMarketOrder: boolean;
62-
orderType: OrderType;
63-
fillDelay: number;
64-
getLimitPrice: (srcTokenDecimals: number, dstTokenDecimals: number) => string | undefined;
65-
getExcecutionPrice: (srcTokenDecimals: number, dstTokenDecimals: number) => string | undefined;
66-
};
67-
6841
export interface PrepareOrderArgs {
6942
destTokenMinAmount: string;
7043
srcChunkAmount: string;

0 commit comments

Comments
 (0)