@paraswap/dex-lib 2.12.12-rfqtests.1 → 2.12.12

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.
Files changed (105) hide show
  1. package/build/abi/augustus.json +375 -0
  2. package/build/abi/woo-fi-v2/IntegrationHelper.abi.json +116 -0
  3. package/build/abi/woo-fi-v2/WooOracleV2.abi.json +358 -0
  4. package/build/abi/woo-fi-v2/WooPPV2.abi.json +580 -0
  5. package/build/config.js +3 -3
  6. package/build/dex/aave-v3/tokens/arbitrum.json +20 -20
  7. package/build/dex/aave-v3/tokens/avalanche.json +44 -20
  8. package/build/dex/aave-v3/tokens/fantom.json +30 -30
  9. package/build/dex/aave-v3/tokens/optimism.json +18 -18
  10. package/build/dex/aave-v3/tokens/polygon.json +60 -42
  11. package/build/dex/generic-rfq/rate-fetcher.js +0 -1
  12. package/build/dex/generic-rfq/rate-fetcher.js.map +1 -1
  13. package/build/dex/generic-rfq/validators.d.ts +1 -1
  14. package/build/dex/generic-rfq/validators.js +26 -36
  15. package/build/dex/generic-rfq/validators.js.map +1 -1
  16. package/build/dex/hashflow/rate-fetcher.d.ts +14 -0
  17. package/build/dex/hashflow/rate-fetcher.js +37 -0
  18. package/build/dex/hashflow/rate-fetcher.js.map +1 -0
  19. package/build/dex/hashflow/validators.d.ts +3 -0
  20. package/build/dex/hashflow/validators.js +12 -0
  21. package/build/dex/hashflow/validators.js.map +1 -0
  22. package/build/dex/{test-aave-v3 → test-dex}/config.d.ts +1 -1
  23. package/build/dex/{test-aave-v3 → test-dex}/config.js +3 -3
  24. package/build/dex/test-dex/config.js.map +1 -0
  25. package/build/dex/{test-aave-v3/test-aave-v3-pool.d.ts → test-dex/test-dex-pool.d.ts} +3 -3
  26. package/build/dex/{test-aave-v3/test-aave-v3-pool.js → test-dex/test-dex-pool.js} +7 -7
  27. package/build/dex/test-dex/test-dex-pool.js.map +1 -0
  28. package/build/dex/{test-aave-v3/test-aave-v3.d.ts → test-dex/test-dex.d.ts} +8 -8
  29. package/build/dex/{test-aave-v3/test-aave-v3.js → test-dex/test-dex.js} +7 -7
  30. package/build/dex/test-dex/test-dex.js.map +1 -0
  31. package/build/dex/{test-aave-v3 → test-dex}/types.d.ts +1 -1
  32. package/build/dex/{test-aave-v3 → test-dex}/types.js.map +1 -1
  33. package/build/dex/uniswap-v3/config.js +13 -0
  34. package/build/dex/uniswap-v3/config.js.map +1 -1
  35. package/build/dex/woo-fi-v2/config.d.ts +4 -0
  36. package/build/dex/woo-fi-v2/config.js +87 -0
  37. package/build/dex/woo-fi-v2/config.js.map +1 -0
  38. package/build/dex/woo-fi-v2/constants.d.ts +5 -0
  39. package/build/dex/woo-fi-v2/constants.js +15 -0
  40. package/build/dex/woo-fi-v2/constants.js.map +1 -0
  41. package/build/dex/woo-fi-v2/decoders.d.ts +6 -0
  42. package/build/dex/woo-fi-v2/decoders.js +29 -0
  43. package/build/dex/woo-fi-v2/decoders.js.map +1 -0
  44. package/build/dex/woo-fi-v2/types.d.ts +41 -0
  45. package/build/dex/woo-fi-v2/types.js +3 -0
  46. package/build/dex/woo-fi-v2/types.js.map +1 -0
  47. package/build/dex/woo-fi-v2/utils.d.ts +2 -0
  48. package/build/dex/woo-fi-v2/utils.js +24 -0
  49. package/build/dex/woo-fi-v2/utils.js.map +1 -0
  50. package/build/dex/woo-fi-v2/woo-fi-math.d.ts +16 -0
  51. package/build/dex/woo-fi-v2/woo-fi-math.js +137 -0
  52. package/build/dex/woo-fi-v2/woo-fi-math.js.map +1 -0
  53. package/build/dex/woo-fi-v2/woo-fi-v2-math.d.ts +16 -0
  54. package/build/dex/woo-fi-v2/woo-fi-v2-math.js +137 -0
  55. package/build/dex/woo-fi-v2/woo-fi-v2-math.js.map +1 -0
  56. package/build/dex/woo-fi-v2/woo-fi-v2-pool.d.ts +12 -0
  57. package/build/dex/woo-fi-v2/woo-fi-v2-pool.js +79 -0
  58. package/build/dex/woo-fi-v2/woo-fi-v2-pool.js.map +1 -0
  59. package/build/dex/woo-fi-v2/woo-fi-v2.d.ts +52 -0
  60. package/build/dex/woo-fi-v2/woo-fi-v2.js +310 -0
  61. package/build/dex/woo-fi-v2/woo-fi-v2.js.map +1 -0
  62. package/build/lib/log-messages-suppressor.d.ts +30 -0
  63. package/build/lib/log-messages-suppressor.js +107 -0
  64. package/build/lib/log-messages-suppressor.js.map +1 -0
  65. package/build/lib/stateful-rpc-poller/state-polling-manager.d.ts +23 -0
  66. package/build/lib/stateful-rpc-poller/state-polling-manager.js +173 -0
  67. package/build/lib/stateful-rpc-poller/state-polling-manager.js.map +1 -0
  68. package/build/lib/stateful-rpc-poller/stateful-rpc-poller.d.ts +72 -0
  69. package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js +369 -0
  70. package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js.map +1 -0
  71. package/build/lib/stateful-rpc-poller/types.d.ts +35 -0
  72. package/build/lib/stateful-rpc-poller/types.js +10 -0
  73. package/build/lib/stateful-rpc-poller/types.js.map +1 -0
  74. package/build/lib/stateful-rpc-poller/utils.d.ts +4 -0
  75. package/build/lib/stateful-rpc-poller/utils.js +17 -0
  76. package/build/lib/stateful-rpc-poller/utils.js.map +1 -0
  77. package/build/lib/validators.d.ts +7 -0
  78. package/build/lib/validators.js +27 -0
  79. package/build/lib/validators.js.map +1 -0
  80. package/package.json +1 -1
  81. package/src/config.ts +3 -3
  82. package/src/dex/generic-rfq/generic-rfq-e2e.test.ts +71 -85
  83. package/src/dex/generic-rfq/rate-fetcher.ts +0 -1
  84. package/src/dex/generic-rfq/validators.test.ts +32 -6
  85. package/src/dex/generic-rfq/validators.ts +32 -57
  86. package/src/dex/uniswap-v3/config.ts +13 -0
  87. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +76 -0
  88. package/tests/constants-e2e.ts +0 -2
  89. package/tests/utils-e2e.ts +48 -59
  90. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  91. package/.idea/misc.xml +0 -6
  92. package/.idea/modules.xml +0 -8
  93. package/.idea/vcs.xml +0 -6
  94. package/.vscode/launch.json +0 -21
  95. package/build/dex/aave-v3/tokens/mainnet.json +0 -44
  96. package/build/dex/balancer-v2/VirtualBoostedPool.d.ts +0 -79
  97. package/build/dex/balancer-v2/VirtualBoostedPool.js +0 -382
  98. package/build/dex/balancer-v2/VirtualBoostedPool.js.map +0 -1
  99. package/build/dex/test-aave-v3/config.js.map +0 -1
  100. package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
  101. package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
  102. package/src/dex/generic-rfq/generic-rfq-e2e-arbitrum.test.ts +0 -360
  103. package/src/dex/generic-rfq/generic-rfq-e2e-bsc.test.ts +0 -346
  104. package/src/dex/generic-rfq/generic-rfq-e2e-polygon.test.ts +0 -360
  105. /package/build/dex/{test-aave-v3 → test-dex}/types.js +0 -0
@@ -0,0 +1,35 @@
1
+ import { MultiCallParams, MultiResult } from '../multi-wrapper';
2
+ export declare type ObjWithUpdateInfo<T> = {
3
+ value: T;
4
+ blockNumber: number;
5
+ lastUpdatedAtMs: number;
6
+ };
7
+ export interface IStatefulRpcPoller<State, M> {
8
+ identifierKey: string;
9
+ dexKey: string;
10
+ isPoolParticipateInUpdates: boolean;
11
+ isPoolInTheMiddleOfUpdate: boolean;
12
+ network: number;
13
+ isTimeToTriggerUpdate(blockNumber: number): boolean;
14
+ getFetchStateWithBlockInfoMultiCalls(): [
15
+ MultiCallParams<number>,
16
+ ...MultiCallParams<M>[]
17
+ ];
18
+ parseStateFromMultiResultsWithBlockInfo(multiOutputs: [MultiResult<number>, ...MultiResult<M>[]], lastUpdatedAtMs: number): ObjWithUpdateInfo<State>;
19
+ setState(state: State, blockNumber: number, lastUpdatedAtMs: number): Promise<void>;
20
+ fetchStateFromCache(): Promise<ObjWithUpdateInfo<State> | null>;
21
+ fetchLatestStateFromRpc(): Promise<ObjWithUpdateInfo<State> | null>;
22
+ initializeState(): Promise<void>;
23
+ getState(blockNumber: number): Promise<ObjWithUpdateInfo<State> | null>;
24
+ setLiquidity(newLiquidityInUSD: number, lastUpdatedAtMs: number, blockNumber?: number): Promise<void>;
25
+ }
26
+ export declare type PollingManagerControllersCb = {
27
+ enableStateTracking: (identifierKey: string) => void;
28
+ disableStateTracking: (identifierKey: string) => void;
29
+ registerPendingPool: <T, M>(statefulRpcPoller: IStatefulRpcPoller<T, M>) => void;
30
+ };
31
+ export declare enum StateSources {
32
+ LOCAL_MEMORY = "local_memory",
33
+ CACHE = "cache",
34
+ RPC = "rpc"
35
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StateSources = void 0;
4
+ var StateSources;
5
+ (function (StateSources) {
6
+ StateSources["LOCAL_MEMORY"] = "local_memory";
7
+ StateSources["CACHE"] = "cache";
8
+ StateSources["RPC"] = "rpc";
9
+ })(StateSources = exports.StateSources || (exports.StateSources = {}));
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/stateful-rpc-poller/types.ts"],"names":[],"mappings":";;;AA6DA,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,6CAA6B,CAAA;IAC7B,+BAAe,CAAA;IACf,2BAAW,CAAA;AACb,CAAC,EAJW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAIvB"}
@@ -0,0 +1,4 @@
1
+ import type { StatePollingManager } from './state-polling-manager';
2
+ import { PollingManagerControllersCb } from './types';
3
+ export declare function getIdentifierKeyForRpcPoller(poolIdentifier: string, network: number): string;
4
+ export declare function pollingManagerCbExtractor(statePollingManager: StatePollingManager): PollingManagerControllersCb;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pollingManagerCbExtractor = exports.getIdentifierKeyForRpcPoller = void 0;
4
+ function getIdentifierKeyForRpcPoller(poolIdentifier, network) {
5
+ return `${network}_${poolIdentifier}`.toLowerCase();
6
+ }
7
+ exports.getIdentifierKeyForRpcPoller = getIdentifierKeyForRpcPoller;
8
+ // Helper function to extract relevant call backs for later use
9
+ function pollingManagerCbExtractor(statePollingManager) {
10
+ return {
11
+ enableStateTracking: statePollingManager.enableStateTracking.bind(statePollingManager),
12
+ disableStateTracking: statePollingManager.disableStateTracking.bind(statePollingManager),
13
+ registerPendingPool: statePollingManager.registerPendingPool.bind(statePollingManager),
14
+ };
15
+ }
16
+ exports.pollingManagerCbExtractor = pollingManagerCbExtractor;
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/stateful-rpc-poller/utils.ts"],"names":[],"mappings":";;;AAGA,SAAgB,4BAA4B,CAC1C,cAAsB,EACtB,OAAe;IAEf,OAAO,GAAG,OAAO,IAAI,cAAc,EAAE,CAAC,WAAW,EAAE,CAAC;AACtD,CAAC;AALD,oEAKC;AAED,+DAA+D;AAC/D,SAAgB,yBAAyB,CACvC,mBAAwC;IAExC,OAAO;QACL,mBAAmB,EACjB,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACnE,oBAAoB,EAClB,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACpE,mBAAmB,EACjB,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC;KACpE,CAAC;AACJ,CAAC;AAXD,8DAWC"}
@@ -0,0 +1,7 @@
1
+ import joi from 'joi';
2
+ export declare class ValidationError extends Error {
3
+ readonly rawMessage: string;
4
+ readonly key?: string;
5
+ constructor(message: string, key?: string);
6
+ }
7
+ export declare const validateAndCast: <T>(value: unknown, schema: joi.Schema, name?: string | undefined) => T;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateAndCast = exports.ValidationError = void 0;
4
+ class ValidationError extends Error {
5
+ constructor(message, key) {
6
+ super(key !== undefined ? `'${key}': ${message}` : message);
7
+ this.rawMessage = message;
8
+ this.key = key;
9
+ }
10
+ }
11
+ exports.ValidationError = ValidationError;
12
+ const validateAndCast = (value, schema, name) => {
13
+ const { error, value: parsed } = schema.validate(value);
14
+ if (error !== undefined) {
15
+ let message;
16
+ if (name) {
17
+ message = `"${name}" ${error.message.slice(error.message.indexOf('must'))}`;
18
+ }
19
+ else {
20
+ message = error.message;
21
+ }
22
+ throw new ValidationError(message);
23
+ }
24
+ return parsed;
25
+ };
26
+ exports.validateAndCast = validateAndCast;
27
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAgB,SAAQ,KAAK;IAKxC,YAAY,OAAe,EAAE,GAAY;QACvC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAVD,0CAUC;AAEM,MAAM,eAAe,GAAG,CAC7B,KAAc,EACd,MAAkB,EAClB,IAAa,EACV,EAAE;IACL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,IAAI,OAAO,CAAC;QACZ,IAAI,IAAI,EAAE;YACR,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CACxC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAC9B,EAAE,CAAC;SACL;aAAM;YACL,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;SACzB;QACD,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;KACpC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC;AAnBW,QAAA,eAAe,mBAmB1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraswap/dex-lib",
3
- "version": "2.12.12-rfqtests.1",
3
+ "version": "2.12.12",
4
4
  "main": "build/index.js",
5
5
  "types": "build/index.d.ts",
6
6
  "repository": "https://github.com/paraswap/paraswap-dex-lib",
package/src/config.ts CHANGED
@@ -151,9 +151,9 @@ const baseConfigs: { [network: number]: BaseConfig } = {
151
151
  hashFlowDisabledMMs:
152
152
  process.env[`HASHFLOW_DISABLED_MMS_56`]?.split(',') || [],
153
153
  adapterAddresses: {
154
- BscAdapter01: '0x27eb327B7255a2bF666EBB4D60AB4752dA4611b9',
155
- BscAdapter02: '0xa003dFBA51C9e1e56C67ae445b852bdEd7aC5EEd',
156
- BscBuyAdapter: '0xfa072107a2CCfE5664794282EF36400735ABB70F',
154
+ BscAdapter01: '0xA31d9C571DF00e0F428B0bD24c34D103E8112222',
155
+ BscAdapter02: '0xe102429Ef7CAaBaAA3bc2C017aC784c5F665EE82',
156
+ BscBuyAdapter: '0xA7f4fBCEB76a1B1c05C106a4289C28B3b91C17ca',
157
157
  },
158
158
  uniswapV2ExchangeRouterAddress:
159
159
  '0x53e693c6C7FFC4446c53B205Cf513105Bf140D7b',
@@ -125,7 +125,7 @@ const buildConfigForGenericRFQ = (): RFQConfig => {
125
125
  const url = getEnv('GENERIC_RFQ_URL');
126
126
 
127
127
  const secret = {
128
- secretKey: Buffer.from(getEnv('GENERIC_RFQ_SECRET_KEY'), 'base64').toString('binary'),
128
+ secretKey: atob(getEnv('GENERIC_RFQ_SECRET_KEY')),
129
129
  accessKey: getEnv('GENERIC_RFQ_ACCESS_KEY'),
130
130
  domain: 'paraswap',
131
131
  };
@@ -179,8 +179,6 @@ const buildConfigForGenericRFQ = (): RFQConfig => {
179
179
  };
180
180
  };
181
181
 
182
- const SKIP_TENDERLY = !!getEnv('GENERIC_RFQ_SKIP_TENDERLY', true);
183
-
184
182
  describe('GenericRFQ YOUR_NAME E2E Mainnet', () => {
185
183
  const dexKey = 'YOUR_NAME';
186
184
 
@@ -191,67 +189,62 @@ describe('GenericRFQ YOUR_NAME E2E Mainnet', () => {
191
189
  config.rfqConfigs[dexKey] = buildConfigForGenericRFQ();
192
190
 
193
191
  describe('GenericRFQ B/Q BUY', () => {
194
- const srcToken = smartTokens.USDT;
195
- const destToken = smartTokens.WETH;
196
-
197
- if (!SKIP_TENDERLY) {
198
- srcToken.addBalance(testAccount.address, MAX_UINT);
199
- srcToken.addAllowance(
200
- testAccount.address,
201
- config.augustusRFQAddress,
202
- MAX_UINT,
203
- );
204
-
205
- destToken.addBalance(testAccount.address, MAX_UINT);
206
- destToken.addAllowance(
207
- testAccount.address,
208
- config.augustusRFQAddress,
209
- MAX_UINT,
210
- );
211
- }
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
+ );
212
208
 
213
209
  describe('Simpleswap', () => {
214
- it('BUY USDT -> WETH', async () => {
210
+ it('BUY USDC -> WBTC', async () => {
215
211
  await newTestE2E({
216
212
  config,
217
213
  srcToken,
218
214
  destToken,
219
215
  senderAddress: GENERIC_ADDR1,
220
216
  thirdPartyAddress: testAccount.address,
221
- _amount: '10000000000000000',
217
+ _amount: '1000000',
222
218
  swapSide: SwapSide.BUY,
223
219
  dexKey: dexKey,
224
220
  contractMethod: ContractMethod.simpleBuy,
225
221
  network: network,
226
222
  sleepMs: 5000,
227
- skipTenderly: SKIP_TENDERLY,
228
223
  });
229
224
  });
230
225
  });
231
226
  });
232
227
 
233
228
  describe('GenericRFQ Q/B BUY', () => {
234
- const srcToken = smartTokens.WETH;
235
- const destToken = smartTokens.USDT;
236
-
237
- if (!SKIP_TENDERLY) {
238
- srcToken.addBalance(testAccount.address, MAX_UINT);
239
- srcToken.addAllowance(
240
- testAccount.address,
241
- config.augustusRFQAddress,
242
- MAX_UINT,
243
- );
244
-
245
- destToken.addBalance(testAccount.address, MAX_UINT);
246
- destToken.addAllowance(
247
- testAccount.address,
248
- config.augustusRFQAddress,
249
- MAX_UINT,
250
- );
251
- }
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
+ );
252
245
 
253
246
  describe('Simpleswap', () => {
254
- it('BUY WETH -> USDT', async () => {
247
+ it('BUY WBTC -> USDC', async () => {
255
248
  await newTestE2E({
256
249
  config,
257
250
  srcToken,
@@ -264,34 +257,31 @@ describe('GenericRFQ YOUR_NAME E2E Mainnet', () => {
264
257
  contractMethod: ContractMethod.simpleBuy,
265
258
  network: network,
266
259
  sleepMs: 5000,
267
- skipTenderly: SKIP_TENDERLY,
268
260
  });
269
261
  });
270
262
  });
271
263
  });
272
264
 
273
265
  describe('GenericRFQ B/Q SELL', () => {
274
- const srcToken = smartTokens.USDT;
275
- const destToken = smartTokens.WETH;
276
-
277
- if (!SKIP_TENDERLY) {
278
- srcToken.addBalance(testAccount.address, MAX_UINT);
279
- srcToken.addAllowance(
280
- testAccount.address,
281
- config.augustusRFQAddress,
282
- MAX_UINT,
283
- );
284
-
285
- destToken.addBalance(testAccount.address, MAX_UINT);
286
- destToken.addAllowance(
287
- testAccount.address,
288
- config.augustusRFQAddress,
289
- MAX_UINT,
290
- );
291
- }
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
+ );
292
282
 
293
283
  describe('Simpleswap', () => {
294
- it('SELL USDT -> WETH', async () => {
284
+ it('SELL USDC -> WBTC', async () => {
295
285
  await newTestE2E({
296
286
  config,
297
287
  srcToken,
@@ -304,47 +294,43 @@ describe('GenericRFQ YOUR_NAME E2E Mainnet', () => {
304
294
  contractMethod: ContractMethod.simpleSwap,
305
295
  network: network,
306
296
  sleepMs: 5000,
307
- skipTenderly: SKIP_TENDERLY,
308
297
  });
309
298
  });
310
299
  });
311
300
  });
312
301
 
313
302
  describe('GenericRFQ Q/B SELL', () => {
314
- const srcToken = smartTokens.WETH;
315
- const destToken = smartTokens.USDT;
316
-
317
- if (!SKIP_TENDERLY) {
318
- srcToken.addBalance(testAccount.address, MAX_UINT);
319
- srcToken.addAllowance(
320
- testAccount.address,
321
- config.augustusRFQAddress,
322
- MAX_UINT,
323
- );
324
-
325
- destToken.addBalance(testAccount.address, MAX_UINT);
326
- destToken.addAllowance(
327
- testAccount.address,
328
- config.augustusRFQAddress,
329
- MAX_UINT,
330
- );
331
- }
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
+ );
332
319
 
333
320
  describe('Simpleswap', () => {
334
- it('SELL WETH -> USDT', async () => {
321
+ it('SELL WBTC -> USDC', async () => {
335
322
  await newTestE2E({
336
323
  config,
337
324
  srcToken,
338
325
  destToken,
339
326
  senderAddress: GENERIC_ADDR1,
340
327
  thirdPartyAddress: testAccount.address,
341
- _amount: '10000000000000000',
328
+ _amount: '10000',
342
329
  swapSide: SwapSide.SELL,
343
330
  dexKey: dexKey,
344
331
  contractMethod: ContractMethod.simpleSwap,
345
332
  network: network,
346
333
  sleepMs: 5000,
347
- skipTenderly: SKIP_TENDERLY,
348
334
  });
349
335
  });
350
336
  });
@@ -406,7 +406,6 @@ export class RateFetcher {
406
406
  const { data } = await this.dexHelper.httpRequest.request<unknown>(
407
407
  payload,
408
408
  );
409
- this.logger.info(`Firm quote response for payload ${payload} is ${data}`);
410
409
 
411
410
  const firmRateResp = validateAndCast<RFQFirmRateResponse>(
412
411
  data,
@@ -112,11 +112,10 @@ describe('GenericRFQ Validator test', () => {
112
112
  },
113
113
  };
114
114
 
115
- const pricesNegativeSpread = {
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('Order test', () => {
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 pricesValidator = joi
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: 'validatedPrices',
70
- base: joi.object({
71
- bids: pricesValidator,
72
- asks: pricesValidator,
73
- }),
69
+ type: 'sortedArray',
70
+ base: pricesValidatorWithoutSorting,
74
71
  rules: {
75
- bidsLowerThanAsks: {
76
- validate: (
77
- values: { bids: string[]; asks: string[] },
78
- helpers: CustomHelpers,
79
- ) => {
80
- if (
81
- !values.bids ||
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: 'the maximum bid is higher than minimum ask',
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
- export const priceValidator = joi.extend(ext);
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().custom(mustBeAugustusSwapper),
179
+ taker: addressSchema.required(),
205
180
  makerAsset: addressSchema.required(),
206
181
  takerAsset: addressSchema.required(),
207
182
  makerAmount: joi
@@ -35,6 +35,15 @@ export const UniswapV3Config: DexConfigMap<DexParams> = {
35
35
  uniswapMulticall: '0x1F98415757620B543A52E61c46B32eB19261F984',
36
36
  chunksCount: 10,
37
37
  },
38
+ [Network.BSC]: {
39
+ factory: '0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7',
40
+ quoter: '0x78D78E420Da98ad378D7799bE8f4AF69033EB077',
41
+ router: '0x83c346ba3d4bf36b308705e24fad80999401854b',
42
+ supportedFees: SUPPORTED_FEES,
43
+ stateMulticall: '0x593F39A4Ba26A9c8ed2128ac95D109E8e403C485',
44
+ uniswapMulticall: '0x963Df249eD09c358A4819E39d9Cd5736c3087184',
45
+ chunksCount: 10,
46
+ },
38
47
  [Network.POLYGON]: {
39
48
  factory: '0x1F98431c8aD98523631AE4a59f267346ea31F984',
40
49
  quoter: '0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6',
@@ -70,6 +79,10 @@ export const Adapters: Record<number, AdapterMappings> = {
70
79
  [SwapSide.SELL]: [{ name: 'Adapter01', index: 6 }],
71
80
  [SwapSide.BUY]: [{ name: 'BuyAdapter', index: 2 }],
72
81
  },
82
+ [Network.BSC]: {
83
+ [SwapSide.SELL]: [{ name: 'BscAdapter02', index: 4 }],
84
+ [SwapSide.BUY]: [{ name: 'BscBuyAdapter', index: 5 }],
85
+ },
73
86
  [Network.POLYGON]: {
74
87
  [SwapSide.SELL]: [{ name: 'PolygonAdapter01', index: 13 }],
75
88
  [SwapSide.BUY]: [{ name: 'PolygonBuyAdapter', index: 2 }],