@paraswap/dex-lib 2.13.1 → 2.14.0
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/config.js +5 -23
- package/build/config.js.map +1 -1
- 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/dex/index.js +2 -2
- package/build/dex/index.js.map +1 -1
- package/build/dex/simple-exchange.d.ts +0 -1
- package/build/dex/simple-exchange.js +0 -2
- package/build/dex/simple-exchange.js.map +1 -1
- package/build/lib/decoders.d.ts +1 -2
- package/build/lib/decoders.js +1 -8
- package/build/lib/decoders.js.map +1 -1
- package/build/lib/fetcher/fetcher.js +0 -3
- package/build/lib/fetcher/fetcher.js.map +1 -1
- package/build/lib/multi-wrapper.d.ts +1 -2
- package/build/lib/multi-wrapper.js.map +1 -1
- package/build/lib/tokens/balancer-fetcher.js +5 -4
- package/build/lib/tokens/balancer-fetcher.js.map +1 -1
- package/build/lib/tokens/utils.d.ts +2 -2
- package/build/lib/tokens/utils.js +1 -1
- package/build/lib/tokens/utils.js.map +1 -1
- package/build/types.d.ts +0 -3
- package/dex-template/__DexName__-e2e.test.ts.template +0 -1
- package/dex-template/__DexName__-events.test.ts.template +0 -1
- package/dex-template/__DexName__-integration.test.ts.template +0 -1
- package/dex-template/__DexName__-pool.ts.template +5 -8
- package/package.json +1 -1
- package/scripts/generate-bytecode.ts +0 -2
- package/src/abi/woo-fi/WooFeeManager.abi.json +318 -0
- package/src/abi/{woo-fi-v2/WooPPV2.abi.json → woo-fi/WooPP.abi.json} +169 -201
- package/src/abi/{woo-fi-v2/WooOracleV2.abi.json → woo-fi/Wooracle.abi.json} +50 -148
- package/src/config.ts +5 -27
- package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +1 -0
- 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/dex/index.ts +2 -2
- package/src/dex/simple-exchange.ts +0 -3
- package/src/dex/woo-fi/config.ts +141 -0
- package/src/dex/woo-fi/constants.ts +21 -0
- package/src/dex/woo-fi/types.ts +55 -0
- package/src/dex/woo-fi/woo-fi-decimal-math.ts +45 -0
- package/src/dex/woo-fi/woo-fi-e2e.test.ts +183 -0
- package/src/dex/woo-fi/woo-fi-integration.test.ts +416 -0
- package/src/dex/woo-fi/woo-fi-math.ts +527 -0
- package/src/dex/woo-fi/woo-fi.ts +693 -0
- package/src/lib/decoders.ts +1 -12
- package/src/lib/fetcher/fetcher.ts +0 -6
- package/src/lib/multi-wrapper.ts +1 -2
- package/src/lib/tokens/balancer-fetcher.ts +6 -5
- package/src/lib/tokens/utils.ts +3 -5
- package/src/types.ts +0 -4
- package/tests/constants-e2e.ts +9 -11
- package/tests/tenderly-simulation.ts +1 -1
- package/tests/utils-e2e.ts +48 -61
- package/tests/utils.ts +0 -2
- 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/abi/woo-fi-v2/IntegrationHelper.abi.json +0 -116
- package/src/dex/generic-rfq/e2e-test-config.ts +0 -37
- package/src/dex/generic-rfq/generic-rfq-local-e2e.test.ts +0 -121
- package/src/dex/woo-fi-v2/config.ts +0 -87
- package/src/dex/woo-fi-v2/constants.ts +0 -22
- package/src/dex/woo-fi-v2/decoders.ts +0 -45
- package/src/dex/woo-fi-v2/types.ts +0 -63
- package/src/dex/woo-fi-v2/utils.ts +0 -19
- package/src/dex/woo-fi-v2/woo-fi-v2-e2e.test.ts +0 -216
- package/src/dex/woo-fi-v2/woo-fi-v2-integration.test.ts +0 -495
- package/src/dex/woo-fi-v2/woo-fi-v2-math.ts +0 -195
- package/src/dex/woo-fi-v2/woo-fi-v2-pool.ts +0 -112
- package/src/dex/woo-fi-v2/woo-fi-v2.ts +0 -487
- package/src/lib/log-messages-suppressor.ts +0 -173
- package/src/lib/stateful-rpc-poller/state-polling-manager.ts +0 -320
- package/src/lib/stateful-rpc-poller/stateful-rpc-poller.ts +0 -604
- package/src/lib/stateful-rpc-poller/types.ts +0 -66
- package/src/lib/stateful-rpc-poller/utils.ts +0 -23
|
@@ -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
|
package/src/dex/index.ts
CHANGED
|
@@ -38,7 +38,7 @@ import { MakerPsm } from './maker-psm/maker-psm';
|
|
|
38
38
|
import { KyberDmm } from './kyberdmm/kyberdmm';
|
|
39
39
|
import { Platypus } from './platypus/platypus';
|
|
40
40
|
import { GMX } from './gmx/gmx';
|
|
41
|
-
import {
|
|
41
|
+
// import { WooFi } from './woo-fi/woo-fi';
|
|
42
42
|
import { ParaSwapLimitOrders } from './paraswap-limit-orders/paraswap-limit-orders';
|
|
43
43
|
import { AugustusRFQOrder } from './augustus-rfq';
|
|
44
44
|
import { Solidly } from './solidly/solidly';
|
|
@@ -107,7 +107,7 @@ const Dexes = [
|
|
|
107
107
|
Platypus,
|
|
108
108
|
GMX,
|
|
109
109
|
JarvisV6,
|
|
110
|
-
|
|
110
|
+
// WooFi,
|
|
111
111
|
ParaSwapLimitOrders,
|
|
112
112
|
Solidly,
|
|
113
113
|
SolidlyEthereum,
|
|
@@ -4,7 +4,6 @@ import { Address, SimpleExchangeParam, NumberAsString } from '../types';
|
|
|
4
4
|
import { CACHE_PREFIX, ETHER_ADDRESS } from '../constants';
|
|
5
5
|
import SimpleSwapHelperABI from '../abi/SimpleSwapHelperRouter.json';
|
|
6
6
|
import ERC20ABI from '../abi/erc20.json';
|
|
7
|
-
import augustusABI from '../abi/augustus.json';
|
|
8
7
|
import { isETHAddress } from '../utils';
|
|
9
8
|
import { MAX_UINT } from '../constants';
|
|
10
9
|
import Web3 from 'web3';
|
|
@@ -19,7 +18,6 @@ export class SimpleExchange {
|
|
|
19
18
|
isFeeOnTransferSupported = false;
|
|
20
19
|
|
|
21
20
|
protected augustusAddress: Address;
|
|
22
|
-
protected augustusInterface: Interface;
|
|
23
21
|
private provider: Web3;
|
|
24
22
|
|
|
25
23
|
protected network: number;
|
|
@@ -34,7 +32,6 @@ export class SimpleExchange {
|
|
|
34
32
|
|
|
35
33
|
this.network = dexHelper.config.data.network;
|
|
36
34
|
this.augustusAddress = dexHelper.config.data.augustusAddress;
|
|
37
|
-
this.augustusInterface = new Interface(augustusABI);
|
|
38
35
|
this.provider = dexHelper.web3Provider;
|
|
39
36
|
|
|
40
37
|
this.dexmapKey =
|