Skip to content

Commit a4e5416

Browse files
authored
fix: Swallow orderbook service failure in AssetSwapperOrderbook [LIT-852] (0xProject#1273)
* Move `Orderbook implementations` under `src/orderbook` * Remove unused getBatchOrdersAsync * Add unit test
1 parent 99480f7 commit a4e5416

File tree

6 files changed

+55
-42
lines changed

6 files changed

+55
-42
lines changed

src/asset-swapper/types.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -685,11 +685,7 @@ export abstract class Orderbook {
685685
takerToken: string,
686686
pruneFn?: (o: SignedLimitOrder) => boolean,
687687
): Promise<SignedLimitOrder[]>;
688-
public abstract getBatchOrdersAsync(
689-
makerTokens: string[],
690-
takerToken: string,
691-
pruneFn?: (o: SignedLimitOrder) => boolean,
692-
): Promise<SignedLimitOrder[][]>;
688+
693689
public async destroyAsync(): Promise<void> {
694690
return;
695691
}

src/asset-swapper/utils/utils.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,6 @@ export const assert = {
9292
...sharedAssert,
9393
isValidOrderbook(variableName: string, orderFetcher: Orderbook): void {
9494
sharedAssert.isFunction(`${variableName}.getOrdersAsync`, orderFetcher.getOrdersAsync.bind(orderFetcher));
95-
sharedAssert.isFunction(
96-
`${variableName}.getBatchOrdersAsync`,
97-
orderFetcher.getBatchOrdersAsync.bind(orderFetcher),
98-
);
9995
},
10096
isValidPercentage(variableName: string, percentage: number): void {
10197
assert.isNumber(variableName, percentage);

src/utils/asset_swapper_orderbook.ts renamed to src/orderbook/asset_swapper_orderbook.ts

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { FillQuoteTransformerOrderType, Orderbook, SignedLimitOrder } from '../asset-swapper';
22
import { DEFAULT_PAGE, DEFAULT_PER_PAGE } from '../constants';
3+
import { logger } from '../logger';
34
import { OrderBookService } from '../services/orderbook_service';
45
import { SRAOrder } from '../types';
56

@@ -8,40 +9,46 @@ export class AssetSwapperOrderbook extends Orderbook {
89
super();
910
}
1011

12+
/**
13+
* Returns matching limit orders.
14+
*
15+
* NOTE: If the request to orderbook service fails, it returns an empty array.
16+
*/
1117
public async getOrdersAsync(
1218
makerToken: string,
1319
takerToken: string,
1420
pruneFn?: (o: SignedLimitOrder) => boolean,
1521
): Promise<SignedLimitOrder[]> {
16-
const apiOrders = await this.orderbookService.getOrdersAsync(
17-
DEFAULT_PAGE,
18-
DEFAULT_PER_PAGE,
19-
{
20-
makerToken,
21-
takerToken,
22-
},
23-
{},
24-
);
22+
const apiOrders = await this.orderbookService
23+
.getOrdersAsync(
24+
DEFAULT_PAGE,
25+
DEFAULT_PER_PAGE,
26+
{
27+
makerToken,
28+
takerToken,
29+
},
30+
{},
31+
)
32+
.catch((err) => {
33+
logger.warn(
34+
{
35+
takerToken,
36+
makerToken,
37+
errorMessage: err.message,
38+
},
39+
'Request to OrderBookService failed',
40+
);
41+
42+
return {
43+
records: [],
44+
};
45+
});
2546

2647
const orders = apiOrders.records.map(apiOrderToOrderbookOrder);
2748
const result = pruneFn ? orders.filter(pruneFn) : orders;
2849
return result;
2950
}
30-
public async getBatchOrdersAsync(
31-
makerTokens: string[],
32-
takerToken: string,
33-
pruneFn?: (o: SignedLimitOrder) => boolean,
34-
): Promise<SignedLimitOrder[][]> {
35-
const apiOrders = await this.orderbookService.getBatchOrdersAsync(DEFAULT_PAGE, DEFAULT_PER_PAGE, makerTokens, [
36-
takerToken,
37-
]);
38-
const orders = apiOrders.records.map(apiOrderToOrderbookOrder);
39-
const pruned = pruneFn ? orders.filter(pruneFn) : orders;
40-
const groupedByMakerToken: SignedLimitOrder[][] = makerTokens.map((token) =>
41-
pruned.filter((o) => o.order.makerToken === token),
42-
);
43-
return groupedByMakerToken;
44-
}
51+
4552
public async destroyAsync(): Promise<void> {
4653
return;
4754
}

src/utils/no_op_orderbook.ts renamed to src/orderbook/no_op_orderbook.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ export class NoOpOrderbook extends Orderbook {
1212
): Promise<SignedLimitOrder[]> {
1313
return [];
1414
}
15-
public async getBatchOrdersAsync(
16-
_makerTokens: string[],
17-
_takerToken: string,
18-
_pruneFn?: (o: SignedLimitOrder) => boolean,
19-
): Promise<SignedLimitOrder[][]> {
20-
return [];
21-
}
2215
public async destroyAsync(): Promise<void> {
2316
return;
2417
}

src/runners/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ import { OrderBookService } from '../services/orderbook_service';
2828
import { PostgresRfqtFirmQuoteValidator } from '../services/postgres_rfqt_firm_quote_validator';
2929
import { SwapService } from '../services/swap_service';
3030
import { HttpServiceConfig, AppDependencies } from '../types';
31-
import { AssetSwapperOrderbook } from '../utils/asset_swapper_orderbook';
32-
import { NoOpOrderbook } from '../utils/no_op_orderbook';
31+
import { AssetSwapperOrderbook } from '../orderbook/asset_swapper_orderbook';
32+
import { NoOpOrderbook } from '../orderbook/no_op_orderbook';
3333
import { RfqClient } from '../utils/rfq_client';
3434
import { RfqDynamicBlacklist } from '../utils/rfq_dyanmic_blacklist';
3535
import { S3Client } from '../utils/s3_client';
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { expect } from '@0x/contracts-test-utils';
2+
import 'mocha';
3+
import { AssetSwapperOrderbook } from '../../src/orderbook/asset_swapper_orderbook';
4+
import { OrderBookService } from '../../src/services/orderbook_service';
5+
6+
describe('AssetSwapperOrderbook', () => {
7+
describe('getOrdersAsync', () => {
8+
it('Returns an empty array of orders on failure', async () => {
9+
const fakeOrderbookService = {
10+
getOrdersAsync: async () => {
11+
throw new Error('orderbook service failure');
12+
},
13+
} as unknown as OrderBookService;
14+
15+
const orderbook = new AssetSwapperOrderbook(fakeOrderbookService);
16+
const orders = await orderbook.getOrdersAsync('makerToken', 'takerToken');
17+
18+
expect(orders).to.have.lengthOf(0);
19+
});
20+
});
21+
});

0 commit comments

Comments
 (0)