@paraswap/dex-lib 4.0.4 → 4.0.5-balancer-v3.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.
Files changed (189) hide show
  1. package/.vscode/launch.json +53 -0
  2. package/.vscode/settings.json +2 -0
  3. package/.vscode/tasks.json +15 -0
  4. package/build/abi/{integral/pool.json → inception/inception-ineth-pool.json} +558 -537
  5. package/build/abi/inception/inception-ratio-feed.json +329 -0
  6. package/build/abi/inception/inception-vault.json +991 -0
  7. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +52 -0
  8. package/build/abi/usual-m-smart-m/usualM.abi.json +483 -0
  9. package/build/abi/usual-m-usd0/usualCollateralDao.abi.json +681 -0
  10. package/build/abi/usual-m-wrapped-m/usualM.abi.json +509 -0
  11. package/build/abi/{integral/relayer.json → wombat/pool.json} +474 -721
  12. package/build/dex/aave-v1/aave-v1.d.ts +2 -1
  13. package/build/dex/aave-v1/aave-v1.js +23 -0
  14. package/build/dex/aave-v1/aave-v1.js.map +1 -1
  15. package/build/dex/aave-v2/tokens-avalanche.json +44 -0
  16. package/build/dex/aave-v2/tokens-mainnet.json +188 -0
  17. package/build/dex/aave-v2/tokens-polygon.json +44 -0
  18. package/build/dex/balancer-v3/abi/balancerBatchRouter.d.ts +729 -0
  19. package/build/dex/balancer-v3/abi/balancerBatchRouter.js +732 -0
  20. package/build/dex/balancer-v3/abi/balancerBatchRouter.js.map +1 -0
  21. package/build/dex/balancer-v3/abi/balancerRouter.d.ts +1406 -0
  22. package/build/dex/balancer-v3/abi/balancerRouter.js +1175 -0
  23. package/build/dex/balancer-v3/abi/balancerRouter.js.map +1 -0
  24. package/build/dex/balancer-v3/abi/vaultExtension.V3.d.ts +2081 -0
  25. package/build/dex/balancer-v3/abi/vaultExtension.V3.js +1851 -0
  26. package/build/dex/balancer-v3/abi/vaultExtension.V3.js.map +1 -0
  27. package/build/dex/balancer-v3/balancer-v3-pool.d.ts +1 -0
  28. package/build/dex/balancer-v3/balancer-v3-pool.js +29 -11
  29. package/build/dex/balancer-v3/balancer-v3-pool.js.map +1 -1
  30. package/build/dex/balancer-v3/balancer-v3-sepolia-pools.d.ts +34 -0
  31. package/build/dex/balancer-v3/balancer-v3-sepolia-pools.js +406 -0
  32. package/build/dex/balancer-v3/balancer-v3-sepolia-pools.js.map +1 -0
  33. package/build/dex/balancer-v3/config.js +1 -5
  34. package/build/dex/balancer-v3/config.js.map +1 -1
  35. package/build/dex/balancer-v3/getOnChainState.d.ts +9 -0
  36. package/build/dex/balancer-v3/getOnChainState.js +38 -5
  37. package/build/dex/balancer-v3/getOnChainState.js.map +1 -1
  38. package/build/dex/balancer-v3/types.d.ts +1 -0
  39. package/build/dex/inception/config.d.ts +4 -0
  40. package/build/dex/inception/config.js +109 -0
  41. package/build/dex/inception/config.js.map +1 -0
  42. package/build/dex/inception/inception-event-pool.d.ts +16 -0
  43. package/build/dex/inception/inception-event-pool.js +49 -0
  44. package/build/dex/inception/inception-event-pool.js.map +1 -0
  45. package/build/dex/inception/inception.d.ts +43 -0
  46. package/build/dex/inception/inception.js +180 -0
  47. package/build/dex/inception/inception.js.map +1 -0
  48. package/build/dex/inception/tokens.d.ts +9 -0
  49. package/build/dex/inception/tokens.js +28 -0
  50. package/build/dex/inception/tokens.js.map +1 -0
  51. package/build/dex/inception/types.d.ts +22 -0
  52. package/build/dex/inception/types.js +3 -0
  53. package/build/dex/inception/types.js.map +1 -0
  54. package/build/dex/inception/utils.d.ts +7 -0
  55. package/build/dex/inception/utils.js +58 -0
  56. package/build/dex/inception/utils.js.map +1 -0
  57. package/build/dex/jarvis.d.ts +2 -1
  58. package/build/dex/jarvis.js +58 -0
  59. package/build/dex/jarvis.js.map +1 -1
  60. package/build/dex/maker-psm/scripts/gem.abi.json +136 -0
  61. package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
  62. package/build/dex/maker-psm/scripts/validate-state.js +185 -0
  63. package/build/dex/maker-psm/scripts/validate-state.js.map +1 -0
  64. package/build/dex/maker-psm/scripts/vat.abi.json +243 -0
  65. package/build/dex/platypus/platypus.d.ts +2 -1
  66. package/build/dex/platypus/platypus.js +45 -0
  67. package/build/dex/platypus/platypus.js.map +1 -1
  68. package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +1 -0
  69. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +53 -0
  70. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +1 -0
  71. package/build/dex/stable-pool.js +1 -8
  72. package/build/dex/stable-pool.js.map +1 -1
  73. package/build/dex/swaap-v1/swaap-v1.d.ts +2 -1
  74. package/build/dex/swaap-v1/swaap-v1.js +14 -0
  75. package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
  76. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +17 -0
  77. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +64 -0
  78. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +1 -0
  79. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +17 -0
  80. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +79 -0
  81. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +1 -0
  82. package/build/dex/uniswap-v3/uniswap-v3-pricing.d.ts +4 -0
  83. package/build/dex/uniswap-v3/uniswap-v3-pricing.js +43 -0
  84. package/build/dex/uniswap-v3/uniswap-v3-pricing.js.map +1 -0
  85. package/build/dex/uniswap-v3/uniswap-v3-worker.d.ts +1 -0
  86. package/build/dex/uniswap-v3/uniswap-v3-worker.js +10 -0
  87. package/build/dex/uniswap-v3/uniswap-v3-worker.js.map +1 -0
  88. package/build/dex/usual/types.d.ts +13 -0
  89. package/build/dex/usual/types.js +3 -0
  90. package/build/dex/usual/types.js.map +1 -0
  91. package/build/dex/usual/usual-bond.d.ts +18 -0
  92. package/build/dex/usual/usual-bond.js +52 -0
  93. package/build/dex/usual/usual-bond.js.map +1 -0
  94. package/build/dex/usual/usual-m-smart-m.d.ts +17 -0
  95. package/build/dex/usual/usual-m-smart-m.js +50 -0
  96. package/build/dex/usual/usual-m-smart-m.js.map +1 -0
  97. package/build/dex/usual/usual-m-usd0.d.ts +17 -0
  98. package/build/dex/usual/usual-m-usd0.js +51 -0
  99. package/build/dex/usual/usual-m-usd0.js.map +1 -0
  100. package/build/dex/usual/usual-m-wrapped-m.d.ts +17 -0
  101. package/build/dex/usual/usual-m-wrapped-m.js +50 -0
  102. package/build/dex/usual/usual-m-wrapped-m.js.map +1 -0
  103. package/build/dex/usual/usual.d.ts +27 -0
  104. package/build/dex/usual/usual.js +125 -0
  105. package/build/dex/usual/usual.js.map +1 -0
  106. package/build/dex/usual-m-smart-m/config.d.ts +3 -0
  107. package/build/dex/usual-m-smart-m/config.js +13 -0
  108. package/build/dex/usual-m-smart-m/config.js.map +1 -0
  109. package/build/dex/usual-m-smart-m/types.d.ts +7 -0
  110. package/build/dex/usual-m-smart-m/types.js +3 -0
  111. package/build/dex/usual-m-smart-m/types.js.map +1 -0
  112. package/build/dex/usual-m-smart-m/usual-m-smart-m.d.ts +35 -0
  113. package/build/dex/usual-m-smart-m/usual-m-smart-m.js +161 -0
  114. package/build/dex/usual-m-smart-m/usual-m-smart-m.js.map +1 -0
  115. package/build/dex/usual-m-usd0/config.d.ts +3 -0
  116. package/build/dex/usual-m-usd0/config.js +14 -0
  117. package/build/dex/usual-m-usd0/config.js.map +1 -0
  118. package/build/dex/usual-m-usd0/types.d.ts +8 -0
  119. package/build/dex/usual-m-usd0/types.js +3 -0
  120. package/build/dex/usual-m-usd0/types.js.map +1 -0
  121. package/build/dex/usual-m-usd0/usual-m-usd0.d.ts +35 -0
  122. package/build/dex/usual-m-usd0/usual-m-usd0.js +159 -0
  123. package/build/dex/usual-m-usd0/usual-m-usd0.js.map +1 -0
  124. package/build/dex/zerox/index.d.ts +4 -26
  125. package/build/dex/zerox/index.js +50 -42
  126. package/build/dex/zerox/index.js.map +1 -1
  127. package/build/dex/zerox/types.d.ts +29 -0
  128. package/build/dex/zerox/types.js +8 -1
  129. package/build/dex/zerox/types.js.map +1 -1
  130. package/build/lib/pub-sub.d.ts +35 -0
  131. package/build/lib/pub-sub.js +106 -0
  132. package/build/lib/pub-sub.js.map +1 -0
  133. package/package.json +1 -1
  134. package/src/dex/balancer-v3/balancer-v3-e2e.test.ts +30 -6
  135. package/src/dex/balancer-v3/balancer-v3-integration.test.ts +229 -1
  136. package/src/dex/balancer-v3/balancer-v3-pool.ts +52 -10
  137. package/src/dex/balancer-v3/config.ts +1 -5
  138. package/src/dex/balancer-v3/getOnChainState.ts +80 -6
  139. package/src/dex/balancer-v3/types.ts +1 -0
  140. package/tests/constants-e2e.ts +11 -0
  141. package/.idea/aws.xml +0 -17
  142. package/.idea/codeStyles/Project.xml +0 -19
  143. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  144. package/.idea/misc.xml +0 -6
  145. package/.idea/modules.xml +0 -8
  146. package/.idea/paraswap-dex-lib.iml +0 -9
  147. package/.idea/prettier.xml +0 -7
  148. package/.idea/vcs.xml +0 -6
  149. package/build/abi/integral/factory.json +0 -333
  150. package/build/abi/integral/oracle.json +0 -501
  151. package/build/dex/fluid-dex/fluid-dex-generate-pool.d.ts +0 -49
  152. package/build/dex/fluid-dex/fluid-dex-generate-pool.js +0 -104
  153. package/build/dex/fluid-dex/fluid-dex-generate-pool.js.map +0 -1
  154. package/build/dex/integral/config.d.ts +0 -4
  155. package/build/dex/integral/config.js +0 -20
  156. package/build/dex/integral/config.js.map +0 -1
  157. package/build/dex/integral/context.d.ts +0 -40
  158. package/build/dex/integral/context.js +0 -158
  159. package/build/dex/integral/context.js.map +0 -1
  160. package/build/dex/integral/integral-factory.d.ts +0 -24
  161. package/build/dex/integral/integral-factory.js +0 -95
  162. package/build/dex/integral/integral-factory.js.map +0 -1
  163. package/build/dex/integral/integral-pool.d.ts +0 -50
  164. package/build/dex/integral/integral-pool.js +0 -149
  165. package/build/dex/integral/integral-pool.js.map +0 -1
  166. package/build/dex/integral/integral-pricing.d.ts +0 -18
  167. package/build/dex/integral/integral-pricing.js +0 -114
  168. package/build/dex/integral/integral-pricing.js.map +0 -1
  169. package/build/dex/integral/integral-relayer.d.ts +0 -42
  170. package/build/dex/integral/integral-relayer.js +0 -192
  171. package/build/dex/integral/integral-relayer.js.map +0 -1
  172. package/build/dex/integral/integral-token.d.ts +0 -27
  173. package/build/dex/integral/integral-token.js +0 -59
  174. package/build/dex/integral/integral-token.js.map +0 -1
  175. package/build/dex/integral/integral.d.ts +0 -41
  176. package/build/dex/integral/integral.js +0 -376
  177. package/build/dex/integral/integral.js.map +0 -1
  178. package/build/dex/integral/types.d.ts +0 -85
  179. package/build/dex/integral/types.js +0 -9
  180. package/build/dex/integral/types.js.map +0 -1
  181. package/build/dex/integral/utils-e2e.d.ts +0 -9
  182. package/build/dex/integral/utils-e2e.js +0 -131
  183. package/build/dex/integral/utils-e2e.js.map +0 -1
  184. package/build/dex/integral/utils.d.ts +0 -17
  185. package/build/dex/integral/utils.js +0 -94
  186. package/build/dex/integral/utils.js.map +0 -1
  187. package/build/dex/trader-joe-v2.1/optimizer.d.ts +0 -2
  188. package/build/dex/trader-joe-v2.1/optimizer.js +0 -47
  189. package/build/dex/trader-joe-v2.1/optimizer.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { Address } from '@paraswap/sdk';
1
2
  import { NumberAsString } from '../../types';
2
3
  export declare enum OrderStatus {
3
4
  INVALID = 0,
@@ -41,4 +42,32 @@ export interface ZeroXSignedOrderV4 {
41
42
  signature: any;
42
43
  }
43
44
  export declare type ZeroXSignedOrder = ZeroXSignedOrderV2 | ZeroXSignedOrderV4;
45
+ export declare enum ZeroXFunctions {
46
+ swapOnZeroXv2 = "swapOnZeroXv2",
47
+ swapOnZeroXv4 = "swapOnZeroXv4",
48
+ swapOnZeroXv2WithPermit = "swapOnZeroXv2WithPermit",
49
+ swapOnZeroXv4WithPermit = "swapOnZeroXv4WithPermit"
50
+ }
51
+ export declare type ZeroXData = {
52
+ version: number;
53
+ order: ZeroXSignedOrder;
54
+ };
55
+ export declare type SwapOnZeroXParam = [
56
+ srcToken: Address,
57
+ destToken: Address,
58
+ srcAmount: NumberAsString,
59
+ destAmount: NumberAsString,
60
+ exchange: Address,
61
+ payload: string
62
+ ];
63
+ export declare type SwapOnZeroXWithPermitParam = [
64
+ srcToken: Address,
65
+ destToken: Address,
66
+ srcAmount: NumberAsString,
67
+ destAmount: NumberAsString,
68
+ exchange: Address,
69
+ payload: string,
70
+ permit: string
71
+ ];
72
+ export declare type ZeroXParam = SwapOnZeroXParam | SwapOnZeroXWithPermitParam;
44
73
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OrderStatus = void 0;
3
+ exports.ZeroXFunctions = exports.OrderStatus = void 0;
4
4
  var OrderStatus;
5
5
  (function (OrderStatus) {
6
6
  OrderStatus[OrderStatus["INVALID"] = 0] = "INVALID";
@@ -11,4 +11,11 @@ var OrderStatus;
11
11
  OrderStatus[OrderStatus["FULLY_FILLED"] = 5] = "FULLY_FILLED";
12
12
  OrderStatus[OrderStatus["CANCELLED"] = 6] = "CANCELLED";
13
13
  })(OrderStatus = exports.OrderStatus || (exports.OrderStatus = {}));
14
+ var ZeroXFunctions;
15
+ (function (ZeroXFunctions) {
16
+ ZeroXFunctions["swapOnZeroXv2"] = "swapOnZeroXv2";
17
+ ZeroXFunctions["swapOnZeroXv4"] = "swapOnZeroXv4";
18
+ ZeroXFunctions["swapOnZeroXv2WithPermit"] = "swapOnZeroXv2WithPermit";
19
+ ZeroXFunctions["swapOnZeroXv4WithPermit"] = "swapOnZeroXv4WithPermit";
20
+ })(ZeroXFunctions = exports.ZeroXFunctions || (exports.ZeroXFunctions = {}));
14
21
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dex/zerox/types.ts"],"names":[],"mappings":";;;AAEA,IAAY,WAQX;AARD,WAAY,WAAW;IACrB,mDAAO,CAAA;IACP,yFAA0B,CAAA;IAC1B,yFAA0B,CAAA;IAC1B,qDAAQ,CAAA;IACR,mDAAO,CAAA;IACP,6DAAY,CAAA;IACZ,uDAAS,CAAA;AACX,CAAC,EARW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAQtB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dex/zerox/types.ts"],"names":[],"mappings":";;;AAGA,IAAY,WAQX;AARD,WAAY,WAAW;IACrB,mDAAO,CAAA;IACP,yFAA0B,CAAA;IAC1B,yFAA0B,CAAA;IAC1B,qDAAQ,CAAA;IACR,mDAAO,CAAA;IACP,6DAAY,CAAA;IACZ,uDAAS,CAAA;AACX,CAAC,EARW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAQtB;AAuCD,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,iDAA+B,CAAA;IAC/B,iDAA+B,CAAA;IAC/B,qEAAmD,CAAA;IACnD,qEAAmD,CAAA;AACrD,CAAC,EALW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAKzB"}
@@ -0,0 +1,35 @@
1
+ import NodeCache from 'node-cache';
2
+ import { Network } from '../constants';
3
+ import { IDexHelper } from '../dex-helper';
4
+ type JsonPubSubMsg = {
5
+ expiresAt: number;
6
+ data: Record<string, unknown>;
7
+ };
8
+ type SetPubSubMsg = string[];
9
+ export declare class JsonPubSub {
10
+ private dexHelper;
11
+ private dexKey;
12
+ channel: string;
13
+ network: Network;
14
+ localCache: NodeCache;
15
+ constructor(dexHelper: IDexHelper, dexKey: string, channel: string);
16
+ initialize(): void;
17
+ subscribe(): void;
18
+ publish(data: Record<string, unknown>, ttl: number): void;
19
+ handleSubscription(json: JsonPubSubMsg): void;
20
+ getAndCache<T>(key: string): Promise<T | null>;
21
+ }
22
+ export declare class SetPubSub {
23
+ private dexHelper;
24
+ private dexKey;
25
+ channel: string;
26
+ network: Network;
27
+ set: Set<string>;
28
+ constructor(dexHelper: IDexHelper, dexKey: string, channel: string);
29
+ initialize(key: string): Promise<void>;
30
+ subscribe(): void;
31
+ publish(set: SetPubSubMsg): void;
32
+ handleSubscription(set: SetPubSubMsg): void;
33
+ has(key: string): Promise<boolean>;
34
+ }
35
+ export {};
@@ -0,0 +1,106 @@
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.SetPubSub = exports.JsonPubSub = void 0;
7
+ const node_cache_1 = __importDefault(require("node-cache"));
8
+ class JsonPubSub {
9
+ dexHelper;
10
+ dexKey;
11
+ channel;
12
+ network;
13
+ localCache = new node_cache_1.default();
14
+ constructor(dexHelper, dexKey, channel) {
15
+ this.dexHelper = dexHelper;
16
+ this.dexKey = dexKey;
17
+ this.network = this.dexHelper.config.data.network;
18
+ this.channel = `${this.network}_${this.dexKey}_${channel}`;
19
+ }
20
+ initialize() {
21
+ this.subscribe();
22
+ }
23
+ subscribe() {
24
+ this.dexHelper.cache.subscribe(this.channel, (_, msg) => {
25
+ const decodedMsg = JSON.parse(msg);
26
+ this.handleSubscription(decodedMsg);
27
+ });
28
+ }
29
+ publish(data, ttl) {
30
+ const expiresAt = Math.round(Date.now() / 1000) + ttl;
31
+ this.dexHelper.cache.publish(this.channel, JSON.stringify({ expiresAt, data }));
32
+ }
33
+ handleSubscription(json) {
34
+ const { expiresAt, data } = json;
35
+ const now = Math.round(Date.now() / 1000);
36
+ // calculating ttl as message might come with the delay
37
+ const ttl = expiresAt - now;
38
+ const keys = Object.keys(data);
39
+ for (const key of keys) {
40
+ this.localCache.set(key, data[key], ttl);
41
+ }
42
+ }
43
+ async getAndCache(key) {
44
+ const localValue = this.localCache.get(key);
45
+ if (localValue) {
46
+ return localValue;
47
+ }
48
+ const [value, ttl] = await Promise.all([
49
+ this.dexHelper.cache.get(this.dexKey, this.network, key),
50
+ this.dexHelper.cache.ttl(this.dexKey, this.network, key),
51
+ ]);
52
+ if (value) {
53
+ // setting ttl same as in cache
54
+ // TODO-ps: check if ttl is not null
55
+ const parsedValue = JSON.parse(value);
56
+ this.localCache.set(key, parsedValue, Number(ttl));
57
+ return parsedValue;
58
+ }
59
+ return null;
60
+ }
61
+ }
62
+ exports.JsonPubSub = JsonPubSub;
63
+ class SetPubSub {
64
+ dexHelper;
65
+ dexKey;
66
+ channel;
67
+ network;
68
+ set = new Set();
69
+ constructor(dexHelper, dexKey, channel) {
70
+ this.dexHelper = dexHelper;
71
+ this.dexKey = dexKey;
72
+ this.network = this.dexHelper.config.data.network;
73
+ this.channel = `${this.network}_${this.dexKey}_${channel}`;
74
+ }
75
+ async initialize(key) {
76
+ // as there's no lazy load, we need to initialize the set
77
+ const initSet = await this.dexHelper.cache.smembers(key);
78
+ for (const member of initSet) {
79
+ this.set.add(member);
80
+ }
81
+ this.subscribe();
82
+ }
83
+ subscribe() {
84
+ this.dexHelper.cache.subscribe(this.channel, (_, msg) => {
85
+ const decodedMsg = JSON.parse(msg);
86
+ this.handleSubscription(decodedMsg);
87
+ });
88
+ }
89
+ publish(set) {
90
+ // as there's no lazy load, also store locally
91
+ for (const key of set) {
92
+ this.set.add(key);
93
+ }
94
+ this.dexHelper.cache.publish(this.channel, JSON.stringify(set));
95
+ }
96
+ handleSubscription(set) {
97
+ for (const key of set) {
98
+ this.set.add(key);
99
+ }
100
+ }
101
+ async has(key) {
102
+ return this.set.has(key);
103
+ }
104
+ }
105
+ exports.SetPubSub = SetPubSub;
106
+ //# sourceMappingURL=pub-sub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pub-sub.js","sourceRoot":"","sources":["../../src/lib/pub-sub.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraswap/dex-lib",
3
- "version": "4.0.4",
3
+ "version": "4.0.5-balancer-v3.0",
4
4
  "main": "build/index.js",
5
5
  "types": "build/index.d.ts",
6
6
  "repository": "https://github.com/paraswap/paraswap-dex-lib",
@@ -216,8 +216,8 @@ describe('BalancerV3 E2E', () => {
216
216
  const tokenASymbol: string = 'WXDAI';
217
217
  const tokenBSymbol: string = 'COW';
218
218
 
219
- const tokenAAmount: string = '1000000000000000000';
220
- const tokenBAmount: string = '1000000000000000000';
219
+ const tokenAAmount: string = '100000000000000000';
220
+ const tokenBAmount: string = '100000000000000000';
221
221
  const nativeTokenAmount = '100000000000000';
222
222
 
223
223
  testForNetwork(
@@ -233,12 +233,12 @@ describe('BalancerV3 E2E', () => {
233
233
  });
234
234
 
235
235
  describe('Weighed Path', () => {
236
- const tokenASymbol: string = 'USDCe';
237
- const tokenBSymbol: string = 'sDAI';
236
+ const tokenASymbol: string = 'sDAI';
237
+ const tokenBSymbol: string = 'XDAI';
238
238
 
239
- const tokenAAmount: string = '1000000';
239
+ const tokenAAmount: string = '100000000000000000';
240
240
  const tokenBAmount: string = '100000000000000000';
241
- const nativeTokenAmount = '0';
241
+ const nativeTokenAmount = '100000000000000000';
242
242
 
243
243
  testForNetwork(
244
244
  network,
@@ -272,4 +272,28 @@ describe('BalancerV3 E2E', () => {
272
272
  );
273
273
  });
274
274
  });
275
+
276
+ describe('Mainnet', () => {
277
+ const network = Network.MAINNET;
278
+
279
+ describe('Stable Path', () => {
280
+ const tokenASymbol: string = 'wUSDL';
281
+ const tokenBSymbol: string = 'USDC';
282
+
283
+ const tokenAAmount: string = '1000000000000000000';
284
+ const tokenBAmount: string = '10000000';
285
+ const nativeTokenAmount = '0';
286
+
287
+ testForNetwork(
288
+ network,
289
+ dexKey,
290
+ tokenASymbol,
291
+ tokenBSymbol,
292
+ tokenAAmount,
293
+ tokenBAmount,
294
+ nativeTokenAmount,
295
+ false,
296
+ );
297
+ });
298
+ });
275
299
  });
@@ -187,7 +187,7 @@ async function checkOnChainPricingNonMulti(
187
187
  // test match for each returned price
188
188
  for (const price of prices) {
189
189
  let expectedPrices: bigint[] = [];
190
- if (price.data.steps.length === 1)
190
+ if (price.data.steps.length === 1 && !price.data.steps[0].isBuffer)
191
191
  expectedPrices = await querySinglePathPrices(
192
192
  network,
193
193
  side,
@@ -831,6 +831,234 @@ describe('BalancerV3', function () {
831
831
  }
832
832
  });
833
833
  });
834
+
835
+ describe('Buffer, Nested Rate', () => {
836
+ /*
837
+ The Gnosis pool, 0x272d6be442e30d7c87390edeb9b96f1e84cecd8d uses a rate provider that is nested.
838
+ So unwrap rate does not equal rate between aave wsteth and eth.
839
+ This particular case the rate provider accounts for growth of wsteth in terms of weth and the additional aave yield.
840
+ This highlighted that rateProvider can not be used for buffer wrap/unwrap which instead should use erc4626 rate.
841
+ */
842
+ const dexHelper = new DummyDexHelper(network);
843
+
844
+ const tokens = Tokens[network];
845
+ const srcTokenSymbol = 'wstETH';
846
+ const destTokenSymbol = 'waGnowstETH';
847
+
848
+ const amountsForSell = [
849
+ 0n,
850
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
851
+ 100n * BI_POWS[tokens[srcTokenSymbol].decimals],
852
+ ];
853
+
854
+ const amountsForBuy = [
855
+ 0n,
856
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
857
+ 100n * BI_POWS[tokens[destTokenSymbol].decimals],
858
+ ];
859
+
860
+ beforeAll(async () => {
861
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
862
+ balancerV3 = new BalancerV3(network, dexKey, dexHelper);
863
+ if (balancerV3.initializePricing) {
864
+ await balancerV3.initializePricing(blockNumber);
865
+ }
866
+ });
867
+
868
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
869
+ await testPricingOnNetwork(
870
+ balancerV3,
871
+ network,
872
+ dexKey,
873
+ blockNumber,
874
+ srcTokenSymbol,
875
+ destTokenSymbol,
876
+ SwapSide.SELL,
877
+ amountsForSell,
878
+ );
879
+ });
880
+
881
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
882
+ await testPricingOnNetwork(
883
+ balancerV3,
884
+ network,
885
+ dexKey,
886
+ blockNumber,
887
+ srcTokenSymbol,
888
+ destTokenSymbol,
889
+ SwapSide.BUY,
890
+ amountsForBuy,
891
+ );
892
+ });
893
+ });
894
+ });
895
+
896
+ describe('Mainnet', () => {
897
+ const network = Network.MAINNET;
898
+ describe('Token/Underlying With Different Decimals', () => {
899
+ /*
900
+ Mainnet Pool, 0x5dd88b3aa3143173eb26552923922bdf33f50949 has an ERC4626 token with 18 decimals that uses a 6 decimal underlying.
901
+ Note for maths: Instead of manually adding support for each ERC4626 implementation (e.g. stata with Ray maths) we always use an
902
+ 18 decimal scaled rate and do 18 decimal maths to convert. We may end up loosing 100% accuracy but thats deemed acceptable.
903
+ */
904
+ describe.only('Buffer wrap 6decimal>18decimal', () => {
905
+ const dexHelper = new DummyDexHelper(network);
906
+
907
+ const tokens = Tokens[network];
908
+ const srcTokenSymbol = 'USDC';
909
+ const destTokenSymbol = 'steakUSDC';
910
+
911
+ const amountsForSell = [
912
+ 0n,
913
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
914
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
915
+ ];
916
+
917
+ const amountsForBuy = [
918
+ 0n,
919
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
920
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
921
+ ];
922
+
923
+ beforeAll(async () => {
924
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
925
+ balancerV3 = new BalancerV3(network, dexKey, dexHelper);
926
+ if (balancerV3.initializePricing) {
927
+ await balancerV3.initializePricing(blockNumber);
928
+ }
929
+ });
930
+
931
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
932
+ await testPricingOnNetwork(
933
+ balancerV3,
934
+ network,
935
+ dexKey,
936
+ blockNumber,
937
+ srcTokenSymbol,
938
+ destTokenSymbol,
939
+ SwapSide.SELL,
940
+ amountsForSell,
941
+ );
942
+ });
943
+
944
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
945
+ await testPricingOnNetwork(
946
+ balancerV3,
947
+ network,
948
+ dexKey,
949
+ blockNumber,
950
+ srcTokenSymbol,
951
+ destTokenSymbol,
952
+ SwapSide.BUY,
953
+ amountsForBuy,
954
+ );
955
+ });
956
+ });
957
+ describe('Buffer unwrap 18decimal>6decimal', () => {
958
+ const dexHelper = new DummyDexHelper(network);
959
+
960
+ const tokens = Tokens[network];
961
+ const srcTokenSymbol = 'steakUSDC';
962
+ const destTokenSymbol = 'USDC';
963
+
964
+ const amountsForSell = [
965
+ 0n,
966
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
967
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
968
+ ];
969
+
970
+ const amountsForBuy = [
971
+ 0n,
972
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
973
+ 10n * BI_POWS[tokens[destTokenSymbol].decimals],
974
+ ];
975
+
976
+ beforeAll(async () => {
977
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
978
+ balancerV3 = new BalancerV3(network, dexKey, dexHelper);
979
+ if (balancerV3.initializePricing) {
980
+ await balancerV3.initializePricing(blockNumber);
981
+ }
982
+ });
983
+
984
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
985
+ await testPricingOnNetwork(
986
+ balancerV3,
987
+ network,
988
+ dexKey,
989
+ blockNumber,
990
+ srcTokenSymbol,
991
+ destTokenSymbol,
992
+ SwapSide.SELL,
993
+ amountsForSell,
994
+ );
995
+ });
996
+
997
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
998
+ await testPricingOnNetwork(
999
+ balancerV3,
1000
+ network,
1001
+ dexKey,
1002
+ blockNumber,
1003
+ srcTokenSymbol,
1004
+ destTokenSymbol,
1005
+ SwapSide.BUY,
1006
+ amountsForBuy,
1007
+ );
1008
+ });
1009
+ });
1010
+ describe('Full boosted path', () => {
1011
+ const dexHelper = new DummyDexHelper(network);
1012
+
1013
+ const tokens = Tokens[network];
1014
+ const srcTokenSymbol = 'wUSDL';
1015
+ const destTokenSymbol = 'USDC';
1016
+
1017
+ const amountsForSell = [
1018
+ 0n,
1019
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
1020
+ ];
1021
+
1022
+ const amountsForBuy = [
1023
+ 0n,
1024
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
1025
+ ];
1026
+
1027
+ beforeAll(async () => {
1028
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
1029
+ balancerV3 = new BalancerV3(network, dexKey, dexHelper);
1030
+ if (balancerV3.initializePricing) {
1031
+ await balancerV3.initializePricing(blockNumber);
1032
+ }
1033
+ });
1034
+
1035
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
1036
+ await testPricingOnNetwork(
1037
+ balancerV3,
1038
+ network,
1039
+ dexKey,
1040
+ blockNumber,
1041
+ srcTokenSymbol,
1042
+ destTokenSymbol,
1043
+ SwapSide.SELL,
1044
+ amountsForSell,
1045
+ );
1046
+ });
1047
+
1048
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
1049
+ await testPricingOnNetwork(
1050
+ balancerV3,
1051
+ network,
1052
+ dexKey,
1053
+ blockNumber,
1054
+ srcTokenSymbol,
1055
+ destTokenSymbol,
1056
+ SwapSide.BUY,
1057
+ amountsForBuy,
1058
+ );
1059
+ });
1060
+ });
1061
+ });
834
1062
  });
835
1063
  });
836
1064
 
@@ -14,7 +14,12 @@ import {
14
14
  } from './types';
15
15
  import { getPoolsApi } from './getPoolsApi';
16
16
  import vaultExtensionAbi_V3 from '../../abi/balancer-v3/vault-extension.json';
17
- import { decodeThrowError, getOnChainState } from './getOnChainState';
17
+ import {
18
+ decodeErc4626MultiCallData,
19
+ decodeThrowError,
20
+ getErc4626MultiCallData,
21
+ getOnChainState,
22
+ } from './getOnChainState';
18
23
  import { BalancerV3Config } from './config';
19
24
  import { SwapKind, Vault } from '@balancer-labs/balancer-maths';
20
25
  import {
@@ -25,7 +30,7 @@ import {
25
30
  } from './stablePool';
26
31
  import { BI_POWS } from '../../bigint-constants';
27
32
 
28
- const WAD = BI_POWS[18];
33
+ export const WAD = BI_POWS[18];
29
34
 
30
35
  export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
31
36
  handlers: {
@@ -65,6 +70,9 @@ export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
65
70
  'function getAmplificationParameter() external view returns (uint256 value, bool isUpdating, uint256 precision)',
66
71
  'function getAmplificationState() external view returns (tuple(uint64 startValue, uint64 endValue, uint32 startTime, uint32 endTime) amplificationState, uint256 precision)',
67
72
  ]),
73
+ ['ERC4626']: new Interface([
74
+ 'function convertToAssets(uint256 shares) external view returns (uint256 assets)',
75
+ ]),
68
76
  };
69
77
 
70
78
  this.logDecoder = (log: Log) => this.interfaces['VAULT'].parseLog(log);
@@ -445,11 +453,12 @@ export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
445
453
  if (!poolState) return;
446
454
 
447
455
  // Fetch onchain pool rates
448
- const poolRates = await this.getPoolRates(Object.keys(poolState));
456
+ const poolRates = await this.getPoolRates(poolState);
449
457
 
450
458
  // Update each pools rate
451
- poolRates.forEach(({ poolAddress, tokenRates }, i) => {
459
+ poolRates.forEach(({ poolAddress, tokenRates, erc4626Rates }, i) => {
452
460
  poolState[poolAddress].tokenRates = tokenRates;
461
+ poolState[poolAddress].erc4626Rates = erc4626Rates;
453
462
  });
454
463
 
455
464
  // Update state
@@ -457,9 +466,15 @@ export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
457
466
  this.setState(poolState, blockNumber);
458
467
  }
459
468
 
460
- private async getPoolRates(poolAddresses: string[]) {
469
+ private async getPoolRates(poolState: PoolStateMap) {
470
+ const erc4626MultiCallData = getErc4626MultiCallData(
471
+ this.interfaces['ERC4626'],
472
+ poolState,
473
+ );
474
+
475
+ const poolAddresses = Object.keys(poolState);
461
476
  // For each pool make the getPoolTokenRates call
462
- const multiCallData = poolAddresses.map(address => {
477
+ const poolsMultiCallData = poolAddresses.map(address => {
463
478
  return {
464
479
  target: BalancerV3Config.BalancerV3[this.network].vaultAddress,
465
480
  callData: this.interfaces['VAULT'].encodeFunctionData(
@@ -469,10 +484,13 @@ export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
469
484
  };
470
485
  });
471
486
  // 500 is an arbitrary number chosen based on the blockGasLimit
472
- const slicedMultiCallData = _.chunk(multiCallData, 500);
487
+ const slicedMultiCallData = _.chunk(
488
+ [...erc4626MultiCallData, ...poolsMultiCallData],
489
+ 500,
490
+ );
473
491
 
474
492
  // Make the multicall
475
- const multicallData = (
493
+ const multicallDataResult = (
476
494
  await Promise.all(
477
495
  slicedMultiCallData.map(async _multiCallData =>
478
496
  this.dexHelper.multiContract.methods
@@ -482,16 +500,34 @@ export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
482
500
  )
483
501
  ).flat();
484
502
 
503
+ const dataResultErc4626 = multicallDataResult.slice(
504
+ 0,
505
+ erc4626MultiCallData.length,
506
+ );
507
+ const dataResultPools = multicallDataResult.slice(
508
+ erc4626MultiCallData.length,
509
+ );
510
+
511
+ const tokensWithRates = decodeErc4626MultiCallData(
512
+ this.interfaces['ERC4626'],
513
+ erc4626MultiCallData,
514
+ dataResultErc4626,
515
+ );
516
+
485
517
  return poolAddresses.map((address, i) => {
486
518
  const tokenRateResult = decodeThrowError(
487
519
  this.interfaces['VAULT'],
488
520
  'getPoolTokenRates',
489
- multicallData[i],
521
+ dataResultPools[i],
490
522
  address,
491
523
  );
492
524
  return {
493
525
  poolAddress: address,
494
526
  tokenRates: tokenRateResult.tokenRates.map((r: string) => BigInt(r)),
527
+ erc4626Rates: poolState[address].tokens.map(t => {
528
+ if (!tokensWithRates[t]) return null;
529
+ return tokensWithRates[t];
530
+ }),
495
531
  };
496
532
  });
497
533
  }
@@ -522,12 +558,18 @@ export class BalancerV3EventPool extends StatefulEventSubscriber<PoolStateMap> {
522
558
  address && address.toLowerCase() === tokenAddress.toLowerCase(),
523
559
  );
524
560
  if (tokenIndex !== -1) {
561
+ if (poolState.erc4626Rates[tokenIndex] === null) {
562
+ this.logger.error(
563
+ `missing erc4626 token rate ${poolState.tokens[tokenIndex]}`,
564
+ );
565
+ return null;
566
+ }
525
567
  return {
526
568
  isBoosted: true,
527
569
  mainToken: poolState.tokens[tokenIndex],
528
570
  underlyingToken: tokenAddress,
529
571
  index: tokenIndex,
530
- rate: poolState.tokenRates[tokenIndex],
572
+ rate: poolState.erc4626Rates[tokenIndex]!,
531
573
  };
532
574
  }
533
575
  }
@@ -10,11 +10,7 @@ export enum SUPPORTED_POOLS {
10
10
 
11
11
  export const disabledPoolIds: Record<string, Record<number, string[]>> = {
12
12
  BalancerV3: {
13
- [Network.GNOSIS]: [
14
- // pools with rate provider that returns nested rate instead of wrap/unwrap rate
15
- '0x6e6bb18449fcf15b79efa2cfa70acf7593088029',
16
- '0x272d6be442e30d7c87390edeb9b96f1e84cecd8d',
17
- ],
13
+ [Network.GNOSIS]: [],
18
14
  },
19
15
  };
20
16