@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.
- package/build/abi/augustus.json +375 -0
- package/build/abi/woo-fi-v2/IntegrationHelper.abi.json +116 -0
- package/build/abi/woo-fi-v2/WooOracleV2.abi.json +358 -0
- package/build/abi/woo-fi-v2/WooPPV2.abi.json +580 -0
- package/build/config.js +3 -3
- package/build/dex/aave-v3/tokens/arbitrum.json +20 -20
- package/build/dex/aave-v3/tokens/avalanche.json +44 -20
- package/build/dex/aave-v3/tokens/fantom.json +30 -30
- package/build/dex/aave-v3/tokens/optimism.json +18 -18
- package/build/dex/aave-v3/tokens/polygon.json +60 -42
- package/build/dex/generic-rfq/rate-fetcher.js +0 -1
- 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/hashflow/rate-fetcher.d.ts +14 -0
- package/build/dex/hashflow/rate-fetcher.js +37 -0
- package/build/dex/hashflow/rate-fetcher.js.map +1 -0
- package/build/dex/hashflow/validators.d.ts +3 -0
- package/build/dex/hashflow/validators.js +12 -0
- package/build/dex/hashflow/validators.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/config.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/config.js +3 -3
- package/build/dex/test-dex/config.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3-pool.d.ts → test-dex/test-dex-pool.d.ts} +3 -3
- package/build/dex/{test-aave-v3/test-aave-v3-pool.js → test-dex/test-dex-pool.js} +7 -7
- package/build/dex/test-dex/test-dex-pool.js.map +1 -0
- package/build/dex/{test-aave-v3/test-aave-v3.d.ts → test-dex/test-dex.d.ts} +8 -8
- package/build/dex/{test-aave-v3/test-aave-v3.js → test-dex/test-dex.js} +7 -7
- package/build/dex/test-dex/test-dex.js.map +1 -0
- package/build/dex/{test-aave-v3 → test-dex}/types.d.ts +1 -1
- package/build/dex/{test-aave-v3 → test-dex}/types.js.map +1 -1
- package/build/dex/uniswap-v3/config.js +13 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/woo-fi-v2/config.d.ts +4 -0
- package/build/dex/woo-fi-v2/config.js +87 -0
- package/build/dex/woo-fi-v2/config.js.map +1 -0
- package/build/dex/woo-fi-v2/constants.d.ts +5 -0
- package/build/dex/woo-fi-v2/constants.js +15 -0
- package/build/dex/woo-fi-v2/constants.js.map +1 -0
- package/build/dex/woo-fi-v2/decoders.d.ts +6 -0
- package/build/dex/woo-fi-v2/decoders.js +29 -0
- package/build/dex/woo-fi-v2/decoders.js.map +1 -0
- package/build/dex/woo-fi-v2/types.d.ts +41 -0
- package/build/dex/woo-fi-v2/types.js +3 -0
- package/build/dex/woo-fi-v2/types.js.map +1 -0
- package/build/dex/woo-fi-v2/utils.d.ts +2 -0
- package/build/dex/woo-fi-v2/utils.js +24 -0
- package/build/dex/woo-fi-v2/utils.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-math.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.d.ts +16 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.js +137 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-math.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.d.ts +12 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js +79 -0
- package/build/dex/woo-fi-v2/woo-fi-v2-pool.js.map +1 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.d.ts +52 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.js +310 -0
- package/build/dex/woo-fi-v2/woo-fi-v2.js.map +1 -0
- package/build/lib/log-messages-suppressor.d.ts +30 -0
- package/build/lib/log-messages-suppressor.js +107 -0
- package/build/lib/log-messages-suppressor.js.map +1 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.d.ts +23 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.js +173 -0
- package/build/lib/stateful-rpc-poller/state-polling-manager.js.map +1 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.d.ts +72 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js +369 -0
- package/build/lib/stateful-rpc-poller/stateful-rpc-poller.js.map +1 -0
- package/build/lib/stateful-rpc-poller/types.d.ts +35 -0
- package/build/lib/stateful-rpc-poller/types.js +10 -0
- package/build/lib/stateful-rpc-poller/types.js.map +1 -0
- package/build/lib/stateful-rpc-poller/utils.d.ts +4 -0
- package/build/lib/stateful-rpc-poller/utils.js +17 -0
- package/build/lib/stateful-rpc-poller/utils.js.map +1 -0
- package/build/lib/validators.d.ts +7 -0
- package/build/lib/validators.js +27 -0
- package/build/lib/validators.js.map +1 -0
- package/package.json +1 -1
- package/src/config.ts +3 -3
- package/src/dex/generic-rfq/generic-rfq-e2e.test.ts +71 -85
- package/src/dex/generic-rfq/rate-fetcher.ts +0 -1
- package/src/dex/generic-rfq/validators.test.ts +32 -6
- package/src/dex/generic-rfq/validators.ts +32 -57
- package/src/dex/uniswap-v3/config.ts +13 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +76 -0
- package/tests/constants-e2e.ts +0 -2
- 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/mainnet.json +0 -44
- 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/test-aave-v3/config.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3-pool.js.map +0 -1
- package/build/dex/test-aave-v3/test-aave-v3.js.map +0 -1
- package/src/dex/generic-rfq/generic-rfq-e2e-arbitrum.test.ts +0 -360
- package/src/dex/generic-rfq/generic-rfq-e2e-bsc.test.ts +0 -346
- package/src/dex/generic-rfq/generic-rfq-e2e-polygon.test.ts +0 -360
- /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
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: '
|
|
155
|
-
BscAdapter02: '
|
|
156
|
-
BscBuyAdapter: '
|
|
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:
|
|
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.
|
|
195
|
-
const destToken = smartTokens.
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
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: '
|
|
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.
|
|
235
|
-
const destToken = smartTokens.
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
|
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.
|
|
275
|
-
const destToken = smartTokens.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
|
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.
|
|
315
|
-
const destToken = smartTokens.
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
|
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: '
|
|
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
|
|
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
|
|
@@ -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 }],
|