@paraswap/dex-lib 2.13.1 → 2.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dex/curve-v1/config.js +0 -2
- package/build/dex/curve-v1/config.js.map +1 -1
- package/build/dex/curve-v1/curve-v1.js +0 -2
- package/build/dex/curve-v1/curve-v1.js.map +1 -1
- package/build/dex/curve-v1/types.d.ts +0 -1
- package/build/dex/curve-v1/types.js.map +1 -1
- package/build/dex/generic-rfq/rate-fetcher.js +0 -2
- package/build/dex/generic-rfq/rate-fetcher.js.map +1 -1
- package/build/dex/generic-rfq/validators.d.ts +1 -1
- package/build/dex/generic-rfq/validators.js +26 -36
- package/build/dex/generic-rfq/validators.js.map +1 -1
- package/build/lib/fetcher/fetcher.js +0 -3
- package/build/lib/fetcher/fetcher.js.map +1 -1
- package/package.json +1 -1
- package/src/dex/curve-v1/config.ts +0 -2
- package/src/dex/curve-v1/curve-v1-e2e.test.ts +37 -18
- package/src/dex/curve-v1/curve-v1.ts +0 -2
- package/src/dex/curve-v1/types.ts +0 -1
- package/src/dex/generic-rfq/generic-rfq-e2e.test.ts +258 -63
- package/src/dex/generic-rfq/rate-fetcher.ts +0 -2
- package/src/dex/generic-rfq/validators.test.ts +32 -6
- package/src/dex/generic-rfq/validators.ts +32 -57
- package/src/lib/fetcher/fetcher.ts +0 -6
- package/tests/constants-e2e.ts +6 -3
- package/tests/utils-e2e.ts +48 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.vscode/launch.json +0 -21
- package/build/dex/aave-v3/tokens/arbitrum.json +0 -50
- package/build/dex/aave-v3/tokens/avalanche.json +0 -50
- package/build/dex/aave-v3/tokens/fantom.json +0 -62
- package/build/dex/aave-v3/tokens/mainnet.json +0 -44
- package/build/dex/aave-v3/tokens/optimism.json +0 -50
- package/build/dex/aave-v3/tokens/polygon.json +0 -98
- package/build/dex/balancer-v2/VirtualBoostedPool.d.ts +0 -79
- package/build/dex/balancer-v2/VirtualBoostedPool.js +0 -382
- package/build/dex/balancer-v2/VirtualBoostedPool.js.map +0 -1
- package/build/dex/generic-rfq/e2e-test-config.d.ts +0 -9
- package/build/dex/generic-rfq/e2e-test-config.js +0 -33
- package/build/dex/generic-rfq/e2e-test-config.js.map +0 -1
- package/build/dex/test-aave-v3/config.d.ts +0 -4
- package/build/dex/test-aave-v3/config.js +0 -15
- package/build/dex/test-aave-v3/config.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3-pool.d.ts +0 -39
- package/build/dex/test-aave-v3/test-aave-v3-pool.js +0 -63
- package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3.d.ts +0 -37
- package/build/dex/test-aave-v3/test-aave-v3.js +0 -126
- package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
- package/build/dex/test-aave-v3/types.d.ts +0 -6
- package/build/dex/test-aave-v3/types.js +0 -3
- package/build/dex/test-aave-v3/types.js.map +0 -1
- package/src/dex/generic-rfq/e2e-test-config.ts +0 -37
- package/src/dex/generic-rfq/generic-rfq-local-e2e.test.ts +0 -121
|
@@ -6,8 +6,8 @@ import { Network, ContractMethod, SwapSide, MAX_UINT } from '../../constants';
|
|
|
6
6
|
import { generateConfig } from '../../config';
|
|
7
7
|
import { newTestE2E, getEnv } from '../../../tests/utils-e2e';
|
|
8
8
|
import { SmartTokens, GENERIC_ADDR1 } from '../../../tests/constants-e2e';
|
|
9
|
+
import { startTestServer } from './example-api.test';
|
|
9
10
|
import { RFQConfig } from './types';
|
|
10
|
-
import { testConfig } from './e2e-test-config';
|
|
11
11
|
|
|
12
12
|
const PK_KEY = process.env.TEST_PK_KEY;
|
|
13
13
|
|
|
@@ -19,13 +19,113 @@ const testAccount = new ethers.Wallet(PK_KEY!);
|
|
|
19
19
|
|
|
20
20
|
jest.setTimeout(1000 * 60 * 3);
|
|
21
21
|
|
|
22
|
+
describe('GenericRFQ E2E Mainnet', () => {
|
|
23
|
+
let stopServer: undefined | Function = undefined;
|
|
24
|
+
|
|
25
|
+
beforeAll(() => {
|
|
26
|
+
stopServer = startTestServer(testAccount);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const network = Network.MAINNET;
|
|
30
|
+
const smartTokens = SmartTokens[network];
|
|
31
|
+
|
|
32
|
+
const srcToken = smartTokens.WETH;
|
|
33
|
+
const destToken = smartTokens.DAI;
|
|
34
|
+
|
|
35
|
+
const config = generateConfig(network);
|
|
36
|
+
|
|
37
|
+
describe('GenericRFQ', () => {
|
|
38
|
+
const dexKey = 'DummyParaSwapPool';
|
|
39
|
+
|
|
40
|
+
srcToken.addBalance(testAccount.address, MAX_UINT);
|
|
41
|
+
srcToken.addAllowance(
|
|
42
|
+
testAccount.address,
|
|
43
|
+
config.augustusRFQAddress,
|
|
44
|
+
MAX_UINT,
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
destToken.addBalance(testAccount.address, MAX_UINT);
|
|
48
|
+
destToken.addAllowance(
|
|
49
|
+
testAccount.address,
|
|
50
|
+
config.augustusRFQAddress,
|
|
51
|
+
MAX_UINT,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
describe('Simpleswap', () => {
|
|
55
|
+
it('SELL WETH -> DAI', async () => {
|
|
56
|
+
await newTestE2E({
|
|
57
|
+
config,
|
|
58
|
+
srcToken,
|
|
59
|
+
destToken,
|
|
60
|
+
senderAddress: GENERIC_ADDR1,
|
|
61
|
+
thirdPartyAddress: testAccount.address,
|
|
62
|
+
_amount: '1000000000000000000',
|
|
63
|
+
swapSide: SwapSide.SELL,
|
|
64
|
+
dexKey: dexKey,
|
|
65
|
+
contractMethod: ContractMethod.simpleSwap,
|
|
66
|
+
network: network,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('SELL DAI -> WETH', async () => {
|
|
71
|
+
await newTestE2E({
|
|
72
|
+
config,
|
|
73
|
+
destToken,
|
|
74
|
+
srcToken,
|
|
75
|
+
senderAddress: GENERIC_ADDR1,
|
|
76
|
+
thirdPartyAddress: testAccount.address,
|
|
77
|
+
_amount: '1000000000000000000',
|
|
78
|
+
swapSide: SwapSide.SELL,
|
|
79
|
+
dexKey: dexKey,
|
|
80
|
+
contractMethod: ContractMethod.simpleSwap,
|
|
81
|
+
network: network,
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('BUY WETH -> DAI', async () => {
|
|
86
|
+
await newTestE2E({
|
|
87
|
+
config,
|
|
88
|
+
srcToken,
|
|
89
|
+
destToken,
|
|
90
|
+
senderAddress: GENERIC_ADDR1,
|
|
91
|
+
thirdPartyAddress: testAccount.address,
|
|
92
|
+
_amount: '1000000000000000000',
|
|
93
|
+
swapSide: SwapSide.BUY,
|
|
94
|
+
dexKey: dexKey,
|
|
95
|
+
contractMethod: ContractMethod.simpleBuy,
|
|
96
|
+
network: network,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('BUY DAI -> WETH', async () => {
|
|
101
|
+
await newTestE2E({
|
|
102
|
+
config,
|
|
103
|
+
destToken,
|
|
104
|
+
srcToken,
|
|
105
|
+
senderAddress: GENERIC_ADDR1,
|
|
106
|
+
thirdPartyAddress: testAccount.address,
|
|
107
|
+
_amount: '1000000000000000000',
|
|
108
|
+
swapSide: SwapSide.BUY,
|
|
109
|
+
dexKey: dexKey,
|
|
110
|
+
contractMethod: ContractMethod.simpleBuy,
|
|
111
|
+
network: network,
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
afterAll(() => {
|
|
118
|
+
if (stopServer) {
|
|
119
|
+
stopServer();
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
22
124
|
const buildConfigForGenericRFQ = (): RFQConfig => {
|
|
23
125
|
const url = getEnv('GENERIC_RFQ_URL');
|
|
24
126
|
|
|
25
127
|
const secret = {
|
|
26
|
-
secretKey:
|
|
27
|
-
'binary',
|
|
28
|
-
),
|
|
128
|
+
secretKey: atob(getEnv('GENERIC_RFQ_SECRET_KEY')),
|
|
29
129
|
accessKey: getEnv('GENERIC_RFQ_ACCESS_KEY'),
|
|
30
130
|
domain: 'paraswap',
|
|
31
131
|
};
|
|
@@ -79,65 +179,160 @@ const buildConfigForGenericRFQ = (): RFQConfig => {
|
|
|
79
179
|
};
|
|
80
180
|
};
|
|
81
181
|
|
|
82
|
-
|
|
83
|
-
const dexKey = 'YOUR_NAME';
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
182
|
+
describe('GenericRFQ YOUR_NAME E2E Mainnet', () => {
|
|
183
|
+
const dexKey = 'YOUR_NAME';
|
|
184
|
+
|
|
185
|
+
const network = Network.MAINNET;
|
|
186
|
+
const smartTokens = SmartTokens[network];
|
|
187
|
+
const config = generateConfig(network);
|
|
188
|
+
|
|
189
|
+
config.rfqConfigs[dexKey] = buildConfigForGenericRFQ();
|
|
190
|
+
|
|
191
|
+
describe('GenericRFQ B/Q BUY', () => {
|
|
192
|
+
const srcToken = smartTokens.USDC;
|
|
193
|
+
const destToken = smartTokens.WBTC;
|
|
194
|
+
|
|
195
|
+
srcToken.addBalance(testAccount.address, MAX_UINT);
|
|
196
|
+
srcToken.addAllowance(
|
|
197
|
+
testAccount.address,
|
|
198
|
+
config.augustusRFQAddress,
|
|
199
|
+
MAX_UINT,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
destToken.addBalance(testAccount.address, MAX_UINT);
|
|
203
|
+
destToken.addAllowance(
|
|
204
|
+
testAccount.address,
|
|
205
|
+
config.augustusRFQAddress,
|
|
206
|
+
MAX_UINT,
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
describe('Simpleswap', () => {
|
|
210
|
+
it('BUY USDC -> WBTC', async () => {
|
|
211
|
+
await newTestE2E({
|
|
212
|
+
config,
|
|
213
|
+
srcToken,
|
|
214
|
+
destToken,
|
|
215
|
+
senderAddress: GENERIC_ADDR1,
|
|
216
|
+
thirdPartyAddress: testAccount.address,
|
|
217
|
+
_amount: '1000000',
|
|
218
|
+
swapSide: SwapSide.BUY,
|
|
219
|
+
dexKey: dexKey,
|
|
220
|
+
contractMethod: ContractMethod.simpleBuy,
|
|
221
|
+
network: network,
|
|
222
|
+
sleepMs: 5000,
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
describe('GenericRFQ Q/B BUY', () => {
|
|
229
|
+
const srcToken = smartTokens.WBTC;
|
|
230
|
+
const destToken = smartTokens.USDC;
|
|
231
|
+
|
|
232
|
+
srcToken.addBalance(testAccount.address, MAX_UINT);
|
|
233
|
+
srcToken.addAllowance(
|
|
234
|
+
testAccount.address,
|
|
235
|
+
config.augustusRFQAddress,
|
|
236
|
+
MAX_UINT,
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
destToken.addBalance(testAccount.address, MAX_UINT);
|
|
240
|
+
destToken.addAllowance(
|
|
241
|
+
testAccount.address,
|
|
242
|
+
config.augustusRFQAddress,
|
|
243
|
+
MAX_UINT,
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
describe('Simpleswap', () => {
|
|
247
|
+
it('BUY WBTC -> USDC', async () => {
|
|
248
|
+
await newTestE2E({
|
|
249
|
+
config,
|
|
250
|
+
srcToken,
|
|
251
|
+
destToken,
|
|
252
|
+
senderAddress: GENERIC_ADDR1,
|
|
253
|
+
thirdPartyAddress: testAccount.address,
|
|
254
|
+
_amount: '1000000',
|
|
255
|
+
swapSide: SwapSide.BUY,
|
|
256
|
+
dexKey: dexKey,
|
|
257
|
+
contractMethod: ContractMethod.simpleBuy,
|
|
258
|
+
network: network,
|
|
259
|
+
sleepMs: 5000,
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
describe('GenericRFQ B/Q SELL', () => {
|
|
266
|
+
const srcToken = smartTokens.USDC;
|
|
267
|
+
const destToken = smartTokens.WBTC;
|
|
268
|
+
|
|
269
|
+
srcToken.addBalance(testAccount.address, MAX_UINT);
|
|
270
|
+
srcToken.addAllowance(
|
|
271
|
+
testAccount.address,
|
|
272
|
+
config.augustusRFQAddress,
|
|
273
|
+
MAX_UINT,
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
destToken.addBalance(testAccount.address, MAX_UINT);
|
|
277
|
+
destToken.addAllowance(
|
|
278
|
+
testAccount.address,
|
|
279
|
+
config.augustusRFQAddress,
|
|
280
|
+
MAX_UINT,
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
describe('Simpleswap', () => {
|
|
284
|
+
it('SELL USDC -> WBTC', async () => {
|
|
285
|
+
await newTestE2E({
|
|
286
|
+
config,
|
|
287
|
+
srcToken,
|
|
288
|
+
destToken,
|
|
289
|
+
senderAddress: GENERIC_ADDR1,
|
|
290
|
+
thirdPartyAddress: testAccount.address,
|
|
291
|
+
_amount: '1000000',
|
|
292
|
+
swapSide: SwapSide.SELL,
|
|
293
|
+
dexKey: dexKey,
|
|
294
|
+
contractMethod: ContractMethod.simpleSwap,
|
|
295
|
+
network: network,
|
|
296
|
+
sleepMs: 5000,
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
describe('GenericRFQ Q/B SELL', () => {
|
|
303
|
+
const srcToken = smartTokens.WBTC;
|
|
304
|
+
const destToken = smartTokens.USDC;
|
|
305
|
+
|
|
306
|
+
srcToken.addBalance(testAccount.address, MAX_UINT);
|
|
307
|
+
srcToken.addAllowance(
|
|
308
|
+
testAccount.address,
|
|
309
|
+
config.augustusRFQAddress,
|
|
310
|
+
MAX_UINT,
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
destToken.addBalance(testAccount.address, MAX_UINT);
|
|
314
|
+
destToken.addAllowance(
|
|
315
|
+
testAccount.address,
|
|
316
|
+
config.augustusRFQAddress,
|
|
317
|
+
MAX_UINT,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
describe('Simpleswap', () => {
|
|
321
|
+
it('SELL WBTC -> USDC', async () => {
|
|
322
|
+
await newTestE2E({
|
|
323
|
+
config,
|
|
324
|
+
srcToken,
|
|
325
|
+
destToken,
|
|
326
|
+
senderAddress: GENERIC_ADDR1,
|
|
327
|
+
thirdPartyAddress: testAccount.address,
|
|
328
|
+
_amount: '10000',
|
|
329
|
+
swapSide: SwapSide.SELL,
|
|
330
|
+
dexKey: dexKey,
|
|
331
|
+
contractMethod: ContractMethod.simpleSwap,
|
|
332
|
+
network: network,
|
|
333
|
+
sleepMs: 5000,
|
|
139
334
|
});
|
|
140
|
-
}
|
|
335
|
+
});
|
|
141
336
|
});
|
|
142
|
-
}
|
|
337
|
+
});
|
|
143
338
|
});
|
|
@@ -403,11 +403,9 @@ export class RateFetcher {
|
|
|
403
403
|
delete payload.secret;
|
|
404
404
|
}
|
|
405
405
|
|
|
406
|
-
this.logger.debug('FirmRate Request:', payload);
|
|
407
406
|
const { data } = await this.dexHelper.httpRequest.request<unknown>(
|
|
408
407
|
payload,
|
|
409
408
|
);
|
|
410
|
-
this.logger.debug('FirmRate Response: ', data);
|
|
411
409
|
|
|
412
410
|
const firmRateResp = validateAndCast<RFQFirmRateResponse>(
|
|
413
411
|
data,
|
|
@@ -112,11 +112,10 @@ describe('GenericRFQ Validator test', () => {
|
|
|
112
112
|
},
|
|
113
113
|
};
|
|
114
114
|
|
|
115
|
-
const
|
|
115
|
+
const pricesInvalidBidsNotSortedDesc = {
|
|
116
116
|
prices: {
|
|
117
117
|
'WETH/DAI': {
|
|
118
118
|
bids: [
|
|
119
|
-
['1337.425240000000000000', '1.166200000000000000'],
|
|
120
119
|
['1333.024812000000000000', '1.166200000000000000'],
|
|
121
120
|
['1333.425240000000000000', '1.166200000000000000'],
|
|
122
121
|
['1332.624384000000000000', '1.166200000000000000'],
|
|
@@ -136,6 +135,29 @@ describe('GenericRFQ Validator test', () => {
|
|
|
136
135
|
},
|
|
137
136
|
};
|
|
138
137
|
|
|
138
|
+
const pricesInvalidAskNotSortedAsc = {
|
|
139
|
+
prices: {
|
|
140
|
+
'WETH/DAI': {
|
|
141
|
+
bids: [
|
|
142
|
+
['1333.425240000000000000', '1.166200000000000000'],
|
|
143
|
+
['1333.024812000000000000', '1.166200000000000000'],
|
|
144
|
+
['1332.624384000000000000', '1.166200000000000000'],
|
|
145
|
+
['1332.223956000000000000', '1.166200000000000000'],
|
|
146
|
+
['1331.823528000000000000', '1.166200000000000000'],
|
|
147
|
+
['1331.423100000000000000', '1.169000000000000000'],
|
|
148
|
+
],
|
|
149
|
+
asks: [
|
|
150
|
+
['1337.146033000000000000', '1.166200000000000000'],
|
|
151
|
+
['1336.745410000000000000', '1.166200000000000000'],
|
|
152
|
+
['1337.546656000000000000', '1.166200000000000000'],
|
|
153
|
+
['1337.947279000000000000', '1.166200000000000000'],
|
|
154
|
+
['1338.347902000000000000', '1.166200000000000000'],
|
|
155
|
+
['1338.748525000000000000', '1.169000000000000000'],
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
|
|
139
161
|
const noPrices = {
|
|
140
162
|
prices: {
|
|
141
163
|
'WETH/DAI': {},
|
|
@@ -178,6 +200,12 @@ describe('GenericRFQ Validator test', () => {
|
|
|
178
200
|
|
|
179
201
|
it('Price test', () => {
|
|
180
202
|
expect(() => validateAndCast(prices, pricesResponse)).not.toThrowError();
|
|
203
|
+
expect(() =>
|
|
204
|
+
validateAndCast(pricesInvalidBidsNotSortedDesc, pricesResponse),
|
|
205
|
+
).toThrowError();
|
|
206
|
+
expect(() =>
|
|
207
|
+
validateAndCast(pricesInvalidAskNotSortedAsc, pricesResponse),
|
|
208
|
+
).toThrowError();
|
|
181
209
|
expect(() =>
|
|
182
210
|
validateAndCast(noPrices, pricesResponse),
|
|
183
211
|
).not.toThrowError();
|
|
@@ -190,9 +218,6 @@ describe('GenericRFQ Validator test', () => {
|
|
|
190
218
|
expect(() =>
|
|
191
219
|
validateAndCast(onlyAsks, pricesResponse),
|
|
192
220
|
).not.toThrowError();
|
|
193
|
-
expect(() =>
|
|
194
|
-
validateAndCast(pricesNegativeSpread, pricesResponse),
|
|
195
|
-
).toThrowError('the maximum bid is higher than minimum ask');
|
|
196
221
|
});
|
|
197
222
|
});
|
|
198
223
|
|
|
@@ -236,10 +261,11 @@ describe('GenericRFQ Validator test', () => {
|
|
|
236
261
|
},
|
|
237
262
|
};
|
|
238
263
|
|
|
239
|
-
it('
|
|
264
|
+
it('Blacklist test', () => {
|
|
240
265
|
expect(() =>
|
|
241
266
|
validateAndCast(order, firmRateResponseValidator),
|
|
242
267
|
).not.toThrowError();
|
|
268
|
+
// expect(() => validateAndCast(invalidBlacklist, blacklistResponseValidator)).toThrowError();
|
|
243
269
|
});
|
|
244
270
|
});
|
|
245
271
|
});
|
|
@@ -56,7 +56,7 @@ const stringNumberValidator = (
|
|
|
56
56
|
return value;
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
-
const
|
|
59
|
+
const pricesValidatorWithoutSorting = joi
|
|
60
60
|
.array()
|
|
61
61
|
.items(
|
|
62
62
|
joi
|
|
@@ -66,58 +66,47 @@ const pricesValidator = joi
|
|
|
66
66
|
);
|
|
67
67
|
|
|
68
68
|
const ext: joi.Extension = {
|
|
69
|
-
type: '
|
|
70
|
-
base:
|
|
71
|
-
bids: pricesValidator,
|
|
72
|
-
asks: pricesValidator,
|
|
73
|
-
}),
|
|
69
|
+
type: 'sortedArray',
|
|
70
|
+
base: pricesValidatorWithoutSorting,
|
|
74
71
|
rules: {
|
|
75
|
-
|
|
76
|
-
validate: (
|
|
77
|
-
values
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
!values.asks ||
|
|
83
|
-
values.bids.length === 0 ||
|
|
84
|
-
values.asks.length === 0
|
|
85
|
-
) {
|
|
86
|
-
return values;
|
|
87
|
-
}
|
|
88
|
-
const maxBid = values.bids
|
|
89
|
-
.map(numbers => new BigNumber(numbers[0]))
|
|
90
|
-
.reduce(
|
|
91
|
-
(previousValue, currentValue) =>
|
|
92
|
-
currentValue.gte(previousValue) ? currentValue : previousValue,
|
|
93
|
-
new BigNumber(0),
|
|
94
|
-
);
|
|
95
|
-
const minAsk = values.asks
|
|
96
|
-
.map(numbers => new BigNumber(numbers[0]))
|
|
97
|
-
.reduce(
|
|
98
|
-
(previousValue, currentValue) =>
|
|
99
|
-
currentValue.lte(previousValue) ? currentValue : previousValue,
|
|
100
|
-
new BigNumber('123456789012345678901234567890'),
|
|
101
|
-
);
|
|
102
|
-
return maxBid < minAsk
|
|
72
|
+
asc: {
|
|
73
|
+
validate: (values: string[], helpers: CustomHelpers) => {
|
|
74
|
+
const prices = values.map(numbers => new BigNumber(numbers[0]));
|
|
75
|
+
const isAscOrder = prices.every(
|
|
76
|
+
(x, i) => i === 0 || x.gte(prices[i - 1]),
|
|
77
|
+
);
|
|
78
|
+
return isAscOrder
|
|
103
79
|
? values
|
|
104
80
|
: helpers.message({
|
|
105
|
-
custom:
|
|
81
|
+
custom: `array is not asc sorted ${JSON.stringify(values)}`,
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
desc: {
|
|
86
|
+
validate: (values: string[][], helpers: CustomHelpers) => {
|
|
87
|
+
const prices = values.map(numbers => new BigNumber(numbers[0]));
|
|
88
|
+
const isAscOrder = prices.every(
|
|
89
|
+
(x, i) => i === 0 || x.lte(prices[i - 1]),
|
|
90
|
+
);
|
|
91
|
+
return isAscOrder
|
|
92
|
+
? values
|
|
93
|
+
: helpers.message({
|
|
94
|
+
custom: `array is not desc sorted ${JSON.stringify(values)}`,
|
|
106
95
|
});
|
|
107
96
|
},
|
|
108
97
|
},
|
|
109
98
|
},
|
|
110
99
|
};
|
|
111
100
|
|
|
112
|
-
|
|
101
|
+
const pricesArrayValidator = joi.extend(ext);
|
|
102
|
+
|
|
103
|
+
export const priceValidator = joi.object({
|
|
104
|
+
bids: pricesArrayValidator.sortedArray().desc(),
|
|
105
|
+
asks: pricesArrayValidator.sortedArray().asc(),
|
|
106
|
+
});
|
|
113
107
|
|
|
114
108
|
export const pricesResponse = joi.object({
|
|
115
|
-
prices: joi
|
|
116
|
-
.object()
|
|
117
|
-
.pattern(
|
|
118
|
-
joi.string().min(1),
|
|
119
|
-
priceValidator.validatedPrices().bidsLowerThanAsks(),
|
|
120
|
-
),
|
|
109
|
+
prices: joi.object().pattern(joi.string().min(1), priceValidator),
|
|
121
110
|
});
|
|
122
111
|
|
|
123
112
|
export const validateAndCast = <T>(
|
|
@@ -182,26 +171,12 @@ const stringStartWithHex0x = (
|
|
|
182
171
|
return value;
|
|
183
172
|
};
|
|
184
173
|
|
|
185
|
-
const mustBeAugustusSwapper = (
|
|
186
|
-
value: string,
|
|
187
|
-
helpers: CustomHelpers,
|
|
188
|
-
): string | ErrorReport => {
|
|
189
|
-
const allowedTakers = [
|
|
190
|
-
'0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57'.toLowerCase(),
|
|
191
|
-
];
|
|
192
|
-
return allowedTakers.includes(value.toLowerCase())
|
|
193
|
-
? value
|
|
194
|
-
: helpers.message({
|
|
195
|
-
custom: `"order.taker" must be any of ${JSON.stringify(allowedTakers)}`,
|
|
196
|
-
});
|
|
197
|
-
};
|
|
198
|
-
|
|
199
174
|
export const orderWithSignatureValidator = joi
|
|
200
175
|
.object({
|
|
201
176
|
nonceAndMeta: joi.string().custom(stringPositiveBigIntValidator),
|
|
202
177
|
expiry: joi.number().min(0),
|
|
203
178
|
maker: addressSchema.required(),
|
|
204
|
-
taker: addressSchema.required()
|
|
179
|
+
taker: addressSchema.required(),
|
|
205
180
|
makerAsset: addressSchema.required(),
|
|
206
181
|
takerAsset: addressSchema.required(),
|
|
207
182
|
makerAmount: joi
|
|
@@ -76,12 +76,6 @@ export default class Fetcher<T> {
|
|
|
76
76
|
.map((_, i) => i)
|
|
77
77
|
.filter(i => results[i] instanceof Error);
|
|
78
78
|
|
|
79
|
-
results.map(result => {
|
|
80
|
-
this.logger.debug(
|
|
81
|
-
'Results Data:',
|
|
82
|
-
JSON.stringify((result as any).data, null, 4).substring(0, 500),
|
|
83
|
-
);
|
|
84
|
-
});
|
|
85
79
|
failures.forEach(i => {
|
|
86
80
|
this.logger.warn(
|
|
87
81
|
`failed polling ${this.requests[i].info.requestOptions.url} ${results[i]}`,
|
package/tests/constants-e2e.ts
CHANGED
|
@@ -33,6 +33,10 @@ export const Tokens: {
|
|
|
33
33
|
addBalance: balancesFn,
|
|
34
34
|
addAllowance: allowedFn,
|
|
35
35
|
},
|
|
36
|
+
CUSDC: {
|
|
37
|
+
address: '0x39AA39c021dfbaE8faC545936693aC917d5E7563',
|
|
38
|
+
decimals: 8,
|
|
39
|
+
},
|
|
36
40
|
WBTC: {
|
|
37
41
|
address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',
|
|
38
42
|
decimals: 8,
|
|
@@ -46,8 +50,6 @@ export const Tokens: {
|
|
|
46
50
|
USDT: {
|
|
47
51
|
address: '0xdac17f958d2ee523a2206206994597c13d831ec7',
|
|
48
52
|
decimals: 6,
|
|
49
|
-
addBalance: balancesFn,
|
|
50
|
-
addAllowance: allowedFn,
|
|
51
53
|
},
|
|
52
54
|
STETH: {
|
|
53
55
|
address: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84',
|
|
@@ -807,7 +809,7 @@ export const Holders: {
|
|
|
807
809
|
CVX: '0x0aCA67Fa70B142A3b9bF2eD89A81B40ff85dACdC',
|
|
808
810
|
MIM: '0xa046a8660e66d178ee07ec97c585eeb6aa18c26c',
|
|
809
811
|
AnkETH: '0xF7260D4ADc48fEefd5a19a9Eb23f9747CeE15C92',
|
|
810
|
-
DAI: '
|
|
812
|
+
DAI: '0x60FaAe176336dAb62e284Fe19B885B095d29fB7F',
|
|
811
813
|
oldFRAX: '0x183d0dc5867c01bfb1dbbc41d6a9d3de6e044626',
|
|
812
814
|
newFRAX: '0x183d0dc5867c01bfb1dbbc41d6a9d3de6e044626',
|
|
813
815
|
FEI: '0x19c549357034d10db8d75ed812b45be1dd8a7218',
|
|
@@ -829,6 +831,7 @@ export const Holders: {
|
|
|
829
831
|
ADAIv1: '0x3021026e4ff227571a5a563ad19ea657c7027e59',
|
|
830
832
|
CETH: '0x712d0f306956a6a4b4f9319ad9b9de48c5345996',
|
|
831
833
|
CDAI: '0xab4ce310054a11328685ece1043211b68ba5d082',
|
|
834
|
+
CUSDC: '0xC2F61a6eEEC48d686901D325CDE9233b81c793F3',
|
|
832
835
|
EURS: '0xC1056Adeb61a01964Ea265cA95EffB7016f9Ed78',
|
|
833
836
|
EURT: '0x6914FC70fAC4caB20a8922E900C4BA57fEECf8E1',
|
|
834
837
|
CRV: '0x7a16fF8270133F063aAb6C9977183D9e72835428',
|