@paraswap/dex-lib 2.34.0 → 2.35.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.
Files changed (72) hide show
  1. package/build/abi/api3-proxy.json +46 -0
  2. package/build/abi/api3-server-v1.json +463 -0
  3. package/build/abi/quick-perps/fast-price-events.json +70 -0
  4. package/build/abi/quick-perps/fast-price-feed.json +741 -0
  5. package/build/abi/quick-perps/reader.json +313 -0
  6. package/build/abi/quick-perps/vault-price-feed.json +323 -0
  7. package/build/abi/quick-perps/vault.json +1953 -0
  8. package/build/composed-event-subscriber.js +8 -2
  9. package/build/composed-event-subscriber.js.map +1 -1
  10. package/build/config.js +2 -2
  11. package/build/dex/algebra/algebra.js +0 -12
  12. package/build/dex/algebra/algebra.js.map +1 -1
  13. package/build/dex/index.js +2 -0
  14. package/build/dex/index.js.map +1 -1
  15. package/build/dex/quick-perps/config.d.ts +11 -0
  16. package/build/dex/quick-perps/config.js +27 -0
  17. package/build/dex/quick-perps/config.js.map +1 -0
  18. package/build/dex/quick-perps/fast-price-feed.d.ts +26 -0
  19. package/build/dex/quick-perps/fast-price-feed.js +176 -0
  20. package/build/dex/quick-perps/fast-price-feed.js.map +1 -0
  21. package/build/dex/quick-perps/pool.d.ts +21 -0
  22. package/build/dex/quick-perps/pool.js +210 -0
  23. package/build/dex/quick-perps/pool.js.map +1 -0
  24. package/build/dex/quick-perps/quick-perps.d.ts +52 -0
  25. package/build/dex/quick-perps/quick-perps.js +205 -0
  26. package/build/dex/quick-perps/quick-perps.js.map +1 -0
  27. package/build/dex/quick-perps/types.d.ts +98 -0
  28. package/build/dex/quick-perps/types.js +3 -0
  29. package/build/dex/quick-perps/types.js.map +1 -0
  30. package/build/dex/quick-perps/usdq.d.ts +15 -0
  31. package/build/dex/quick-perps/usdq.js +61 -0
  32. package/build/dex/quick-perps/usdq.js.map +1 -0
  33. package/build/dex/quick-perps/vault-price-feed.d.ts +43 -0
  34. package/build/dex/quick-perps/vault-price-feed.js +194 -0
  35. package/build/dex/quick-perps/vault-price-feed.js.map +1 -0
  36. package/build/dex/quick-perps/vault-utils.d.ts +8 -0
  37. package/build/dex/quick-perps/vault-utils.js +41 -0
  38. package/build/dex/quick-perps/vault-utils.js.map +1 -0
  39. package/build/dex/quick-perps/vault.d.ts +46 -0
  40. package/build/dex/quick-perps/vault.js +166 -0
  41. package/build/dex/quick-perps/vault.js.map +1 -0
  42. package/build/lib/api3-feed.d.ts +26 -0
  43. package/build/lib/api3-feed.js +82 -0
  44. package/build/lib/api3-feed.js.map +1 -0
  45. package/package.json +1 -1
  46. package/src/abi/api3-proxy.json +46 -0
  47. package/src/abi/api3-server-v1.json +463 -0
  48. package/src/abi/quick-perps/fast-price-events.json +70 -0
  49. package/src/abi/quick-perps/fast-price-feed.json +741 -0
  50. package/src/abi/quick-perps/reader.json +313 -0
  51. package/src/abi/quick-perps/vault-price-feed.json +323 -0
  52. package/src/abi/quick-perps/vault.json +1953 -0
  53. package/src/composed-event-subscriber.ts +16 -11
  54. package/src/config.ts +2 -2
  55. package/src/dex/algebra/algebra.ts +0 -13
  56. package/src/dex/index.ts +2 -0
  57. package/src/dex/quick-perps/config.ts +31 -0
  58. package/src/dex/quick-perps/fast-price-feed.ts +279 -0
  59. package/src/dex/quick-perps/pool.ts +372 -0
  60. package/src/dex/quick-perps/quick-perps-e2e.test.ts +65 -0
  61. package/src/dex/quick-perps/quick-perps-events.test.ts +101 -0
  62. package/src/dex/quick-perps/quick-perps-integration.test.ts +153 -0
  63. package/src/dex/quick-perps/quick-perps.ts +292 -0
  64. package/src/dex/quick-perps/types.ts +97 -0
  65. package/src/dex/quick-perps/usdq.ts +83 -0
  66. package/src/dex/quick-perps/vault-price-feed.ts +322 -0
  67. package/src/dex/quick-perps/vault-utils.ts +53 -0
  68. package/src/dex/quick-perps/vault.ts +290 -0
  69. package/src/lib/api3-feed.ts +140 -0
  70. package/tests/constants-e2e.ts +29 -0
  71. package/tests/tenderly-simulation.ts +46 -2
  72. package/tests/utils-e2e.ts +18 -10
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QuickPerpsEventPool = void 0;
7
+ const lens_1 = require("../../lens");
8
+ const composed_event_subscriber_1 = require("../../composed-event-subscriber");
9
+ const api3_feed_1 = require("../../lib/api3-feed");
10
+ const fast_price_feed_1 = require("./fast-price-feed");
11
+ const vault_price_feed_1 = require("./vault-price-feed");
12
+ const vault_1 = require("./vault");
13
+ const usdq_1 = require("./usdq");
14
+ const reader_json_1 = __importDefault(require("../../abi/quick-perps/reader.json"));
15
+ const MAX_AMOUNT_IN_CACHE_TTL = 5 * 60;
16
+ class QuickPerpsEventPool extends composed_event_subscriber_1.ComposedEventSubscriber {
17
+ constructor(parentName, network, dexHelper, config) {
18
+ const api3ServerV1Map = Object.entries(config.api3ServerV1).reduce((acc, [key, value]) => {
19
+ acc[key] = new api3_feed_1.Api3FeedSubscriber(value.proxy, value.api3ServerV1, value.dataFeedId, (0, lens_1.lens)().primaryPrices[key], dexHelper.getLogger(`${key} Api3FeedSubscriber for ${parentName}-${network}`));
20
+ return acc;
21
+ }, {});
22
+ const fastPriceFeed = new fast_price_feed_1.FastPriceFeed(config.fastPriceFeed, config.fastPriceEvents, config.tokenAddresses, config.fastPriceFeedConfig, (0, lens_1.lens)().secondaryPrices, dexHelper.getLogger(`${parentName}-${network} fastPriceFeed`));
23
+ const vaultPriceFeed = new vault_price_feed_1.VaultPriceFeed(config.vaultPriceFeedConfig, api3ServerV1Map, fastPriceFeed);
24
+ const usdq = new usdq_1.USDQ(config.usdqAddress, (0, lens_1.lens)().usdq, dexHelper.getLogger(`${parentName}-${network} USDQ`));
25
+ const vault = new vault_1.Vault(config.vaultAddress, config.tokenAddresses, config.vaultConfig, vaultPriceFeed, usdq, (0, lens_1.lens)().vault, dexHelper.getLogger(`${parentName}-${network} vault`));
26
+ super(parentName, 'pool', dexHelper.getLogger(`${parentName}-${network}`), dexHelper, [...Object.values(api3ServerV1Map), fastPriceFeed, usdq, vault], {
27
+ primaryPrices: {},
28
+ secondaryPrices: {
29
+ lastUpdatedAt: 0,
30
+ prices: {},
31
+ },
32
+ vault: {
33
+ usdqAmounts: {},
34
+ },
35
+ usdq: {
36
+ totalSupply: 0n,
37
+ },
38
+ });
39
+ this.network = network;
40
+ this.dexHelper = dexHelper;
41
+ this.PRICE_PRECISION = 10n ** 30n;
42
+ this.USDQ_DECIMALS = 18;
43
+ this.BASIS_POINTS_DIVISOR = 10000n;
44
+ this.vault = vault;
45
+ this.reader = new this.dexHelper.web3Provider.eth.Contract(reader_json_1.default, config.readerAddress);
46
+ }
47
+ async getStateOrGenerate(blockNumber) {
48
+ const evenState = this.getState(blockNumber);
49
+ if (evenState)
50
+ return evenState;
51
+ const onChainState = await this.generateState(blockNumber);
52
+ this.setState(onChainState, blockNumber);
53
+ return onChainState;
54
+ }
55
+ async getMaxAmountIn(_tokenIn, _tokenOut) {
56
+ const cacheKey = `maxAmountIn_${_tokenIn}_${_tokenOut}`;
57
+ const maxAmountCached = await this.dexHelper.cache.get(this.parentName, this.network, cacheKey);
58
+ if (maxAmountCached)
59
+ return BigInt(maxAmountCached);
60
+ const maxAmount = await this.reader.methods
61
+ .getMaxAmountIn(this.vault.vaultAddress, _tokenIn, _tokenOut)
62
+ .call();
63
+ this.dexHelper.cache.setex(this.parentName, this.network, cacheKey, MAX_AMOUNT_IN_CACHE_TTL, maxAmount);
64
+ return BigInt(maxAmount);
65
+ }
66
+ // Reference to the original implementation
67
+ // https://github.com/gmx-io/gmx-contracts/blob/master/contracts/peripherals/Reader.sol#L71
68
+ async getAmountOut(_tokenIn, _tokenOut, _amountsIn, blockNumber) {
69
+ const maxAmountIn = await this.getMaxAmountIn(_tokenIn, _tokenOut);
70
+ const state = await this.getStateOrGenerate(blockNumber);
71
+ const priceIn = this.vault.getMinPrice(state, _tokenIn);
72
+ const priceOut = this.vault.getMaxPrice(state, _tokenOut);
73
+ const tokenInDecimals = this.vault.tokenDecimals[_tokenIn];
74
+ const tokenOutDecimals = this.vault.tokenDecimals[_tokenOut];
75
+ const isStableSwap = this.vault.stableTokens[_tokenIn] && this.vault.stableTokens[_tokenOut];
76
+ const baseBps = isStableSwap
77
+ ? this.vault.stableSwapFeeBasisPoints
78
+ : this.vault.swapFeeBasisPoints;
79
+ const taxBps = isStableSwap
80
+ ? this.vault.stableTaxBasisPoints
81
+ : this.vault.taxBasisPoints;
82
+ const USDQUnit = BigInt(10 ** this.USDQ_DECIMALS);
83
+ const tokenInUnit = BigInt(10 ** tokenInDecimals);
84
+ const tokenOutUnit = BigInt(10 ** tokenOutDecimals);
85
+ return _amountsIn.map(_amountIn => {
86
+ if (_amountIn > maxAmountIn)
87
+ return 0n;
88
+ let feeBasisPoints;
89
+ {
90
+ let usdqAmount = (_amountIn * priceIn) / this.PRICE_PRECISION;
91
+ usdqAmount = (usdqAmount * USDQUnit) / tokenInUnit;
92
+ const feesBasisPoints0 = this.vault.getFeeBasisPoints(state, _tokenIn, usdqAmount, baseBps, taxBps, true);
93
+ const feesBasisPoints1 = this.vault.getFeeBasisPoints(state, _tokenOut, usdqAmount, baseBps, taxBps, false);
94
+ // use the higher of the two fee basis points
95
+ feeBasisPoints =
96
+ feesBasisPoints0 > feesBasisPoints1
97
+ ? feesBasisPoints0
98
+ : feesBasisPoints1;
99
+ }
100
+ let amountOut = (_amountIn * priceIn) / priceOut;
101
+ amountOut = (amountOut * tokenOutUnit) / tokenInUnit;
102
+ const amountOutAfterFees = (amountOut * (this.BASIS_POINTS_DIVISOR - feeBasisPoints)) /
103
+ this.BASIS_POINTS_DIVISOR;
104
+ return amountOutAfterFees;
105
+ });
106
+ }
107
+ static async getWhitelistedTokens(vaultAddress, blockNumber, multiContract) {
108
+ // get tokens count
109
+ const tokenCountResult = (await multiContract.methods
110
+ .aggregate([
111
+ {
112
+ callData: vault_1.Vault.interface.encodeFunctionData('allWhitelistedTokensLength'),
113
+ target: vaultAddress,
114
+ },
115
+ ])
116
+ .call({}, blockNumber)).returnData;
117
+ const tokensCount = parseInt(vault_1.Vault.interface
118
+ .decodeFunctionResult('allWhitelistedTokensLength', tokenCountResult[0])
119
+ .toString());
120
+ // get tokens
121
+ const getTokensCalldata = new Array(tokensCount).fill(0).map((_, i) => {
122
+ return {
123
+ callData: vault_1.Vault.interface.encodeFunctionData('allWhitelistedTokens', [
124
+ i,
125
+ ]),
126
+ target: vaultAddress,
127
+ };
128
+ });
129
+ const tokensResult = (await multiContract.methods
130
+ .aggregate(getTokensCalldata)
131
+ .call({}, blockNumber)).returnData;
132
+ const tokens = tokensResult.map((t) => vault_1.Vault.interface
133
+ .decodeFunctionResult('allWhitelistedTokens', t)[0]
134
+ .toLowerCase());
135
+ return tokens;
136
+ }
137
+ static async getConfig(dexParams, blockNumber, multiContract) {
138
+ const tokens = await this.getWhitelistedTokens(dexParams.vault, blockNumber, multiContract);
139
+ // get price chainlink price feed
140
+ const getPriceFeedCalldata = tokens.map(t => {
141
+ return {
142
+ callData: vault_price_feed_1.VaultPriceFeed.interface.encodeFunctionData('priceFeedProxies', [t]),
143
+ target: dexParams.priceFeed,
144
+ };
145
+ });
146
+ const priceFeedResult = (await multiContract.methods
147
+ .aggregate(getPriceFeedCalldata)
148
+ .call({}, blockNumber)).returnData;
149
+ const priceFeeds = priceFeedResult.map((p) => vault_price_feed_1.VaultPriceFeed.interface
150
+ .decodeFunctionResult('priceFeedProxies', p)[0]
151
+ .toString()
152
+ .toLowerCase());
153
+ // get config for all event listeners
154
+ let multicallSlices = [];
155
+ let multiCallData = [];
156
+ let i = 0;
157
+ for (let priceFeed of priceFeeds) {
158
+ const api3ServerAddressCallData = api3_feed_1.Api3FeedSubscriber.getApi3ServerV1MultiCallInput(priceFeed);
159
+ const dataFeedIdCallData = api3_feed_1.Api3FeedSubscriber.getDataFeedId(priceFeed);
160
+ multiCallData.push(...[api3ServerAddressCallData, dataFeedIdCallData]);
161
+ multicallSlices.push([i, i + 2]);
162
+ i += 2;
163
+ }
164
+ const fastPriceFeedConfigCallData = fast_price_feed_1.FastPriceFeed.getConfigMulticallInputs(dexParams.fastPriceFeed, tokens);
165
+ multiCallData.push(...fastPriceFeedConfigCallData);
166
+ multicallSlices.push([i, i + fastPriceFeedConfigCallData.length]);
167
+ i += fastPriceFeedConfigCallData.length;
168
+ const vaultPriceFeedConfigCallData = vault_price_feed_1.VaultPriceFeed.getConfigMulticallInputs(dexParams.priceFeed, tokens);
169
+ multiCallData.push(...vaultPriceFeedConfigCallData);
170
+ multicallSlices.push([i, i + vaultPriceFeedConfigCallData.length]);
171
+ i += vaultPriceFeedConfigCallData.length;
172
+ const vaultConfigCallData = vault_1.Vault.getConfigMulticallInputs(dexParams.vault, tokens);
173
+ multiCallData.push(...vaultConfigCallData);
174
+ multicallSlices.push([i, i + vaultConfigCallData.length]);
175
+ i += vaultConfigCallData.length;
176
+ const configResults = (await multiContract.methods.aggregate(multiCallData).call({}, blockNumber)).returnData;
177
+ const api3ServerV1 = {};
178
+ for (let token of tokens) {
179
+ const [api3ServerAddressRes, dataFeedIdRes] = configResults.slice(...multicallSlices.shift());
180
+ const serverV1Address = api3_feed_1.Api3FeedSubscriber.decodeApi3ServerV1Result(api3ServerAddressRes);
181
+ const dataFeedId = api3_feed_1.Api3FeedSubscriber.decodeDataFeedId(dataFeedIdRes);
182
+ api3ServerV1[token] = {
183
+ proxy: priceFeeds.shift(),
184
+ api3ServerV1: serverV1Address,
185
+ dataFeedId,
186
+ };
187
+ }
188
+ const fastPriceFeedConfigResults = configResults.slice(...multicallSlices.shift());
189
+ const fastPriceFeedConfig = fast_price_feed_1.FastPriceFeed.getConfig(fastPriceFeedConfigResults, tokens);
190
+ const vaultPriceFeedConfigResults = configResults.slice(...multicallSlices.shift());
191
+ const vaultPriceFeedConfig = vault_price_feed_1.VaultPriceFeed.getConfig(vaultPriceFeedConfigResults, tokens);
192
+ const vaultConfigResults = configResults.slice(...multicallSlices.shift());
193
+ const vaultConfig = vault_1.Vault.getConfig(vaultConfigResults, tokens);
194
+ return {
195
+ vaultAddress: dexParams.vault,
196
+ readerAddress: dexParams.reader,
197
+ priceFeed: dexParams.priceFeed,
198
+ fastPriceFeed: dexParams.fastPriceFeed,
199
+ fastPriceEvents: dexParams.fastPriceEvents,
200
+ usdqAddress: dexParams.usdq,
201
+ tokenAddresses: tokens,
202
+ vaultConfig,
203
+ vaultPriceFeedConfig,
204
+ fastPriceFeedConfig,
205
+ api3ServerV1,
206
+ };
207
+ }
208
+ }
209
+ exports.QuickPerpsEventPool = QuickPerpsEventPool;
210
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/dex/quick-perps/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { Token, Address, ExchangePrices, PoolPrices, AdapterExchangeParam, SimpleExchangeParam, PoolLiquidity, Logger } from '../../types';
3
+ import { SwapSide, Network } from '../../constants';
4
+ import { IDex } from '../idex';
5
+ import { IDexHelper } from '../../dex-helper/idex-helper';
6
+ import { QuickPerpsData, DexParams } from './types';
7
+ import { QuickPerpsEventPool } from './pool';
8
+ import { SimpleExchange } from '../simple-exchange';
9
+ export declare class QuickPerps extends SimpleExchange implements IDex<QuickPerpsData> {
10
+ protected network: Network;
11
+ protected dexHelper: IDexHelper;
12
+ protected adapters: {
13
+ [side: string]: {
14
+ name: string;
15
+ index: number;
16
+ }[] | null;
17
+ };
18
+ protected params: DexParams;
19
+ protected pool: QuickPerpsEventPool | null;
20
+ protected supportedTokensMap: {
21
+ [address: string]: boolean;
22
+ };
23
+ protected supportedTokens: Token[];
24
+ readonly hasConstantPriceLargeAmounts = false;
25
+ readonly needWrapNative = true;
26
+ readonly isFeeOnTransferSupported = false;
27
+ static dexKeysWithNetwork: {
28
+ key: string;
29
+ networks: Network[];
30
+ }[];
31
+ static erc20Interface: Interface;
32
+ vaultUSDBalance: number;
33
+ logger: Logger;
34
+ constructor(network: Network, dexKey: string, dexHelper: IDexHelper, adapters?: {
35
+ [side: string]: {
36
+ name: string;
37
+ index: number;
38
+ }[] | null;
39
+ }, params?: DexParams);
40
+ initializePricing(blockNumber: number): Promise<void>;
41
+ getAdapters(side: SwapSide): {
42
+ name: string;
43
+ index: number;
44
+ }[] | null;
45
+ getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise<string[]>;
46
+ getPricesVolume(srcToken: Token, destToken: Token, amounts: bigint[], side: SwapSide, blockNumber: number, limitPools?: string[]): Promise<null | ExchangePrices<QuickPerpsData>>;
47
+ getCalldataGasCost(poolPrices: PoolPrices<QuickPerpsData>): number | number[];
48
+ getAdapterParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: QuickPerpsData, side: SwapSide): AdapterExchangeParam;
49
+ getSimpleParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: QuickPerpsData, side: SwapSide): SimpleExchangeParam;
50
+ updatePoolState(): Promise<void>;
51
+ getTopPoolsForToken(_tokenAddress: Address, limit: number): Promise<PoolLiquidity[]>;
52
+ }
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.QuickPerps = void 0;
30
+ const abi_1 = require("@ethersproject/abi");
31
+ const constants_1 = require("../../constants");
32
+ const CALLDATA_GAS_COST = __importStar(require("../../calldata-gas-cost"));
33
+ const utils_1 = require("../../utils");
34
+ const pool_1 = require("./pool");
35
+ const simple_exchange_1 = require("../simple-exchange");
36
+ const config_1 = require("./config");
37
+ const vault_1 = require("./vault");
38
+ const erc20_json_1 = __importDefault(require("../../abi/erc20.json"));
39
+ const QuickPerpsGasCost = 300 * 1000;
40
+ class QuickPerps extends simple_exchange_1.SimpleExchange {
41
+ constructor(network, dexKey, dexHelper, adapters = config_1.Adapters[network], params = config_1.QuickPerpsConfig[dexKey][network]) {
42
+ super(dexHelper, dexKey);
43
+ this.network = network;
44
+ this.dexHelper = dexHelper;
45
+ this.adapters = adapters;
46
+ this.params = params;
47
+ this.pool = null;
48
+ this.supportedTokensMap = {};
49
+ // supportedTokens is only used by the pooltracker
50
+ this.supportedTokens = [];
51
+ this.hasConstantPriceLargeAmounts = false;
52
+ this.needWrapNative = true;
53
+ this.isFeeOnTransferSupported = false;
54
+ this.vaultUSDBalance = 0;
55
+ this.logger = dexHelper.getLogger(dexKey);
56
+ }
57
+ async initializePricing(blockNumber) {
58
+ const config = await pool_1.QuickPerpsEventPool.getConfig(this.params, blockNumber, this.dexHelper.multiContract);
59
+ config.tokenAddresses.forEach((token) => (this.supportedTokensMap[token] = true));
60
+ this.pool = new pool_1.QuickPerpsEventPool(this.dexKey, this.network, this.dexHelper, config);
61
+ await this.pool.initialize(blockNumber);
62
+ }
63
+ // Returns the list of contract adapters (name and index)
64
+ // for a buy/sell. Return null if there are no adapters.
65
+ getAdapters(side) {
66
+ return this.adapters[side];
67
+ }
68
+ // Returns list of pool identifiers that can be used
69
+ // for a given swap. poolIdentifiers must be unique
70
+ // across DEXes.
71
+ async getPoolIdentifiers(srcToken, destToken, side, blockNumber) {
72
+ if (side === constants_1.SwapSide.BUY || !this.pool)
73
+ return [];
74
+ const srcAddress = this.dexHelper.config
75
+ .wrapETH(srcToken)
76
+ .address.toLowerCase();
77
+ const destAddress = this.dexHelper.config
78
+ .wrapETH(destToken)
79
+ .address.toLowerCase();
80
+ if (srcAddress !== destAddress &&
81
+ this.supportedTokensMap[srcAddress] &&
82
+ this.supportedTokensMap[destAddress]) {
83
+ return [`${this.dexKey}_${srcAddress}`, `${this.dexKey}_${destAddress}`];
84
+ }
85
+ return [];
86
+ }
87
+ // Returns pool prices for amounts.
88
+ // If limitPools is defined only pools in limitPools
89
+ // should be used. If limitPools is undefined then
90
+ // any pools can be used.
91
+ async getPricesVolume(srcToken, destToken, amounts, side, blockNumber, limitPools) {
92
+ if (side === constants_1.SwapSide.BUY || !this.pool)
93
+ return null;
94
+ const srcAddress = this.dexHelper.config
95
+ .wrapETH(srcToken)
96
+ .address.toLowerCase();
97
+ const destAddress = this.dexHelper.config
98
+ .wrapETH(destToken)
99
+ .address.toLowerCase();
100
+ if (srcAddress === destAddress ||
101
+ !(this.supportedTokensMap[srcAddress] &&
102
+ this.supportedTokensMap[destAddress]))
103
+ return null;
104
+ const srcPoolIdentifier = `${this.dexKey}_${srcAddress}`;
105
+ const destPoolIdentifier = `${this.dexKey}_${destAddress}`;
106
+ const pools = [srcPoolIdentifier, destPoolIdentifier];
107
+ if (limitPools && pools.some(p => !limitPools.includes(p)))
108
+ return null;
109
+ const unitVolume = (0, utils_1.getBigIntPow)(srcToken.decimals);
110
+ const prices = await this.pool.getAmountOut(srcAddress, destAddress, [unitVolume, ...amounts], blockNumber);
111
+ if (!prices)
112
+ return null;
113
+ return [
114
+ {
115
+ prices: prices.slice(1),
116
+ unit: prices[0],
117
+ gasCost: QuickPerpsGasCost,
118
+ exchange: this.dexKey,
119
+ data: {},
120
+ poolAddresses: [this.params.vault],
121
+ },
122
+ ];
123
+ }
124
+ // Returns estimated gas cost of calldata for this DEX in multiSwap
125
+ getCalldataGasCost(poolPrices) {
126
+ return CALLDATA_GAS_COST.DEX_NO_PAYLOAD;
127
+ }
128
+ getAdapterParam(srcToken, destToken, srcAmount, destAmount, data, side) {
129
+ return {
130
+ targetExchange: this.params.vault,
131
+ payload: '0x',
132
+ networkFee: '0',
133
+ };
134
+ }
135
+ getSimpleParam(srcToken, destToken, srcAmount, destAmount, data, side) {
136
+ return {
137
+ callees: [srcToken, this.params.vault],
138
+ calldata: [
139
+ QuickPerps.erc20Interface.encodeFunctionData('transfer', [
140
+ this.params.vault,
141
+ srcAmount,
142
+ ]),
143
+ vault_1.Vault.interface.encodeFunctionData('swap', [
144
+ srcToken,
145
+ destToken,
146
+ this.augustusAddress,
147
+ ]),
148
+ ],
149
+ values: ['0', '0'],
150
+ networkFee: '0',
151
+ };
152
+ }
153
+ async updatePoolState() {
154
+ if (!this.supportedTokens.length) {
155
+ const tokenAddresses = await pool_1.QuickPerpsEventPool.getWhitelistedTokens(this.params.vault, 'latest', this.dexHelper.multiContract);
156
+ const decimalsCallData = QuickPerps.erc20Interface.encodeFunctionData('decimals');
157
+ const tokenBalanceMultiCall = tokenAddresses.map(t => ({
158
+ target: t,
159
+ callData: decimalsCallData,
160
+ }));
161
+ const res = (await this.dexHelper.multiContract.methods
162
+ .aggregate(tokenBalanceMultiCall)
163
+ .call()).returnData;
164
+ const tokenDecimals = res.map((r) => parseInt(QuickPerps.erc20Interface
165
+ .decodeFunctionResult('decimals', r)[0]
166
+ .toString()));
167
+ this.supportedTokens = tokenAddresses.map((t, i) => ({
168
+ address: t,
169
+ decimals: tokenDecimals[i],
170
+ }));
171
+ }
172
+ const erc20BalanceCalldata = QuickPerps.erc20Interface.encodeFunctionData('balanceOf', [this.params.vault]);
173
+ const tokenBalanceMultiCall = this.supportedTokens.map(t => ({
174
+ target: t.address,
175
+ callData: erc20BalanceCalldata,
176
+ }));
177
+ const res = (await this.dexHelper.multiContract.methods
178
+ .aggregate(tokenBalanceMultiCall)
179
+ .call()).returnData;
180
+ const tokenBalances = res.map((r) => BigInt(QuickPerps.erc20Interface
181
+ .decodeFunctionResult('balanceOf', r)[0]
182
+ .toString()));
183
+ const tokenBalancesUSD = await Promise.all(this.supportedTokens.map((t, i) => this.dexHelper.getTokenUSDPrice(t, tokenBalances[i])));
184
+ this.vaultUSDBalance = tokenBalancesUSD.reduce((sum, curr) => sum + curr);
185
+ }
186
+ // Returns list of top pools based on liquidity. Max
187
+ // limit number pools should be returned.
188
+ async getTopPoolsForToken(_tokenAddress, limit) {
189
+ const tokenAddress = _tokenAddress.toLowerCase();
190
+ if (!this.supportedTokens.some(t => t.address === tokenAddress))
191
+ return [];
192
+ return [
193
+ {
194
+ exchange: this.dexKey,
195
+ address: this.params.vault,
196
+ connectorTokens: this.supportedTokens.filter(t => t.address !== tokenAddress),
197
+ liquidityUSD: this.vaultUSDBalance,
198
+ },
199
+ ];
200
+ }
201
+ }
202
+ exports.QuickPerps = QuickPerps;
203
+ QuickPerps.dexKeysWithNetwork = (0, utils_1.getDexKeysWithNetwork)(config_1.QuickPerpsConfig);
204
+ QuickPerps.erc20Interface = new abi_1.Interface(erc20_json_1.default);
205
+ //# sourceMappingURL=quick-perps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-perps.js","sourceRoot":"","sources":["../../../src/dex/quick-perps/quick-perps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { Address } from '../../types';
2
+ import { Api3FeedSubscriberState } from '../../lib/api3-feed';
3
+ export declare type PoolState = {
4
+ primaryPrices: {
5
+ [poolAddress: string]: Api3FeedSubscriberState;
6
+ };
7
+ secondaryPrices: FastPriceFeedState;
8
+ vault: VaultState;
9
+ usdq: USDQState;
10
+ };
11
+ export declare type FastPriceFeedState = {
12
+ lastUpdatedAt: number;
13
+ prices: {
14
+ [tokenAddress: string]: bigint;
15
+ };
16
+ };
17
+ export declare type VaultState = {
18
+ usdqAmounts: {
19
+ [tokenAddress: string]: bigint;
20
+ };
21
+ };
22
+ export declare type USDQState = {
23
+ totalSupply: bigint;
24
+ };
25
+ export declare type QuickPerpsData = {};
26
+ export declare type DexParams = {
27
+ vault: Address;
28
+ reader: Address;
29
+ priceFeed: Address;
30
+ fastPriceFeed: Address;
31
+ fastPriceEvents: Address;
32
+ usdq: Address;
33
+ };
34
+ export declare type FastPriceFeedConfig = {
35
+ priceDuration: number;
36
+ maxDeviationBasisPoints: bigint;
37
+ favorFastPrice: Record<string, boolean>;
38
+ spreadBasisPointsIfInactive: bigint;
39
+ spreadBasisPointsIfChainError: bigint;
40
+ maxPriceUpdateDelay: number;
41
+ };
42
+ export declare type VaultPriceFeedConfig = {
43
+ isSecondaryPriceEnabled: boolean;
44
+ strictStableTokens: {
45
+ [address: string]: boolean;
46
+ };
47
+ spreadBasisPoints: {
48
+ [address: string]: bigint;
49
+ };
50
+ adjustmentBasisPoints: {
51
+ [address: string]: bigint;
52
+ };
53
+ isAdjustmentAdditive: {
54
+ [address: string]: boolean;
55
+ };
56
+ priceDecimals: {
57
+ [address: string]: number;
58
+ };
59
+ maxStrictPriceDeviation: bigint;
60
+ };
61
+ export declare type VaultConfig = {
62
+ tokenDecimals: {
63
+ [address: string]: number;
64
+ };
65
+ stableTokens: {
66
+ [address: string]: boolean;
67
+ };
68
+ tokenWeights: {
69
+ [address: string]: bigint;
70
+ };
71
+ stableSwapFeeBasisPoints: bigint;
72
+ swapFeeBasisPoints: bigint;
73
+ stableTaxBasisPoints: bigint;
74
+ taxBasisPoints: bigint;
75
+ hasDynamicFees: bigint;
76
+ includeAmmPrice: boolean;
77
+ useSwapPricing: boolean;
78
+ totalTokenWeights: bigint;
79
+ };
80
+ export declare type PoolConfig = {
81
+ vaultAddress: Address;
82
+ readerAddress: Address;
83
+ priceFeed: Address;
84
+ fastPriceFeed: Address;
85
+ fastPriceEvents: Address;
86
+ usdqAddress: Address;
87
+ tokenAddresses: Address[];
88
+ vaultConfig: VaultConfig;
89
+ vaultPriceFeedConfig: VaultPriceFeedConfig;
90
+ fastPriceFeedConfig: FastPriceFeedConfig;
91
+ api3ServerV1: {
92
+ [address: string]: {
93
+ proxy: Address;
94
+ api3ServerV1: Address;
95
+ dataFeedId: string;
96
+ };
97
+ };
98
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dex/quick-perps/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { Interface } from '@ethersproject/abi';
2
+ import { DeepReadonly } from 'ts-essentials';
3
+ import { PartialEventSubscriber } from '../../composed-event-subscriber';
4
+ import { Address, MultiCallInput, MultiCallOutput, Logger, Log, BlockHeader } from '../../types';
5
+ import { USDQState } from './types';
6
+ import { Lens } from '../../lens';
7
+ export declare class USDQ<State> extends PartialEventSubscriber<State, USDQState> {
8
+ private usdqAddress;
9
+ static readonly interface: Interface;
10
+ constructor(usdqAddress: Address, lens: Lens<DeepReadonly<State>, DeepReadonly<USDQState>>, logger: Logger);
11
+ getTotalSupply(state: DeepReadonly<State>): bigint;
12
+ processLog(state: DeepReadonly<USDQState>, log: Readonly<Log>, blockHeader: Readonly<BlockHeader>): DeepReadonly<USDQState> | null;
13
+ getGenerateStateMultiCallInputs(): MultiCallInput[];
14
+ generateState(multicallOutputs: MultiCallOutput[], blockNumber?: number | 'latest'): DeepReadonly<USDQState>;
15
+ }