1- import { Config , Order , OrderStatus , OrderType } from "./types" ;
1+ import { Config , OrderStatus , OrderType } from "./types" ;
22import BN from "bignumber.js" ;
33import { amountUi , delay , eqIgnoreCase , getTheGraphUrl , groupBy , keyBy , orderBy } from "./utils" ;
44import { getEstimatedDelayBetweenChunksMillis } from "./lib" ;
55import { 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
169const ordersCreatedQueryValues = `
1710id
@@ -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
298296export 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
351350export const getAllOrders = ( {
0 commit comments