@ichidao/ichi-vaults-sdk 0.1.42 → 2.0.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 (215) hide show
  1. package/README.md +61 -208
  2. package/dist/abis/types/AlgebraIntegralPool.d.ts +702 -793
  3. package/dist/abis/types/AlgebraPool.d.ts +693 -730
  4. package/dist/abis/types/ClPool.d.ts +789 -871
  5. package/dist/abis/types/DepositGuard.d.ts +193 -178
  6. package/dist/abis/types/DepositGuardWithHtsWrapping.d.ts +300 -297
  7. package/dist/abis/types/ERC20.d.ts +120 -147
  8. package/dist/abis/types/ERC20Wrapper.d.ts +147 -155
  9. package/dist/abis/types/IchiVault.d.ts +598 -728
  10. package/dist/abis/types/MultiFeeDistributer.d.ts +314 -423
  11. package/dist/abis/types/Multicall.d.ts +58 -73
  12. package/dist/abis/types/UniswapV3Pool.d.ts +654 -693
  13. package/dist/abis/types/common.d.ts +40 -12
  14. package/dist/abis/types/factories/AlgebraIntegralPool__factory.d.ts +2 -3
  15. package/dist/abis/types/factories/AlgebraIntegralPool__factory.js +10 -13
  16. package/dist/abis/types/factories/AlgebraIntegralPool__factory.js.map +1 -1
  17. package/dist/abis/types/factories/AlgebraPool__factory.d.ts +2 -3
  18. package/dist/abis/types/factories/AlgebraPool__factory.js +10 -13
  19. package/dist/abis/types/factories/AlgebraPool__factory.js.map +1 -1
  20. package/dist/abis/types/factories/ClPool__factory.d.ts +2 -3
  21. package/dist/abis/types/factories/ClPool__factory.js +10 -13
  22. package/dist/abis/types/factories/ClPool__factory.js.map +1 -1
  23. package/dist/abis/types/factories/DepositGuardWithHtsWrapping__factory.d.ts +2 -3
  24. package/dist/abis/types/factories/DepositGuardWithHtsWrapping__factory.js +10 -13
  25. package/dist/abis/types/factories/DepositGuardWithHtsWrapping__factory.js.map +1 -1
  26. package/dist/abis/types/factories/DepositGuard__factory.d.ts +2 -3
  27. package/dist/abis/types/factories/DepositGuard__factory.js +10 -13
  28. package/dist/abis/types/factories/DepositGuard__factory.js.map +1 -1
  29. package/dist/abis/types/factories/ERC20Wrapper__factory.d.ts +2 -3
  30. package/dist/abis/types/factories/ERC20Wrapper__factory.js +10 -13
  31. package/dist/abis/types/factories/ERC20Wrapper__factory.js.map +1 -1
  32. package/dist/abis/types/factories/ERC20__factory.d.ts +2 -3
  33. package/dist/abis/types/factories/ERC20__factory.js +10 -13
  34. package/dist/abis/types/factories/ERC20__factory.js.map +1 -1
  35. package/dist/abis/types/factories/IchiVault__factory.d.ts +2 -3
  36. package/dist/abis/types/factories/IchiVault__factory.js +10 -13
  37. package/dist/abis/types/factories/IchiVault__factory.js.map +1 -1
  38. package/dist/abis/types/factories/MultiFeeDistributer__factory.d.ts +2 -3
  39. package/dist/abis/types/factories/MultiFeeDistributer__factory.js +10 -13
  40. package/dist/abis/types/factories/MultiFeeDistributer__factory.js.map +1 -1
  41. package/dist/abis/types/factories/Multicall__factory.d.ts +2 -3
  42. package/dist/abis/types/factories/Multicall__factory.js +10 -13
  43. package/dist/abis/types/factories/Multicall__factory.js.map +1 -1
  44. package/dist/abis/types/factories/UniswapV3Pool__factory.d.ts +2 -3
  45. package/dist/abis/types/factories/UniswapV3Pool__factory.js +10 -13
  46. package/dist/abis/types/factories/UniswapV3Pool__factory.js.map +1 -1
  47. package/dist/src/__tests__/index.test.js +376 -700
  48. package/dist/src/__tests__/index.test.js.map +1 -1
  49. package/dist/src/abis/types/AlgebraIntegralPool.d.ts +702 -793
  50. package/dist/src/abis/types/AlgebraPool.d.ts +693 -730
  51. package/dist/src/abis/types/ClPool.d.ts +789 -871
  52. package/dist/src/abis/types/DepositGuard.d.ts +193 -178
  53. package/dist/src/abis/types/DepositGuardWithHtsWrapping.d.ts +300 -297
  54. package/dist/src/abis/types/ERC20.d.ts +120 -147
  55. package/dist/src/abis/types/ERC20Wrapper.d.ts +147 -155
  56. package/dist/src/abis/types/IchiVault.d.ts +598 -728
  57. package/dist/src/abis/types/MultiFeeDistributer.d.ts +314 -423
  58. package/dist/src/abis/types/Multicall.d.ts +58 -73
  59. package/dist/src/abis/types/UniswapV3Pool.d.ts +654 -693
  60. package/dist/src/abis/types/common.d.ts +40 -12
  61. package/dist/src/abis/types/factories/AlgebraIntegralPool__factory.d.ts +2 -3
  62. package/dist/src/abis/types/factories/AlgebraPool__factory.d.ts +2 -3
  63. package/dist/src/abis/types/factories/ClPool__factory.d.ts +2 -3
  64. package/dist/src/abis/types/factories/DepositGuardWithHtsWrapping__factory.d.ts +2 -3
  65. package/dist/src/abis/types/factories/DepositGuard__factory.d.ts +2 -3
  66. package/dist/src/abis/types/factories/ERC20Wrapper__factory.d.ts +2 -3
  67. package/dist/src/abis/types/factories/ERC20__factory.d.ts +2 -3
  68. package/dist/src/abis/types/factories/IchiVault__factory.d.ts +2 -3
  69. package/dist/src/abis/types/factories/MultiFeeDistributer__factory.d.ts +2 -3
  70. package/dist/src/abis/types/factories/Multicall__factory.d.ts +2 -3
  71. package/dist/src/abis/types/factories/UniswapV3Pool__factory.d.ts +2 -3
  72. package/dist/src/contracts/index.d.ts +1 -1
  73. package/dist/src/contracts/index.js +12 -12
  74. package/dist/src/contracts/index.js.map +1 -1
  75. package/dist/src/functions/_totalBalances.d.ts +2 -3
  76. package/dist/src/functions/_totalBalances.js +46 -117
  77. package/dist/src/functions/_totalBalances.js.map +1 -1
  78. package/dist/src/functions/_vaultEvents.js +347 -488
  79. package/dist/src/functions/_vaultEvents.js.map +1 -1
  80. package/dist/src/functions/_withdrawHelpers.d.ts +2 -3
  81. package/dist/src/functions/_withdrawHelpers.js +13 -62
  82. package/dist/src/functions/_withdrawHelpers.js.map +1 -1
  83. package/dist/src/functions/calculateApr.d.ts +1 -1
  84. package/dist/src/functions/calculateApr.js +77 -150
  85. package/dist/src/functions/calculateApr.js.map +1 -1
  86. package/dist/src/functions/calculateDtr.d.ts +1 -1
  87. package/dist/src/functions/calculateDtr.js +84 -169
  88. package/dist/src/functions/calculateDtr.js.map +1 -1
  89. package/dist/src/functions/calculateFees.d.ts +1 -1
  90. package/dist/src/functions/calculateFees.js +97 -172
  91. package/dist/src/functions/calculateFees.js.map +1 -1
  92. package/dist/src/functions/chains.js +6 -6
  93. package/dist/src/functions/chains.js.map +1 -1
  94. package/dist/src/functions/claimRewards.d.ts +3 -4
  95. package/dist/src/functions/claimRewards.js +29 -92
  96. package/dist/src/functions/claimRewards.js.map +1 -1
  97. package/dist/src/functions/deposit.d.ts +7 -9
  98. package/dist/src/functions/deposit.js +199 -364
  99. package/dist/src/functions/deposit.js.map +1 -1
  100. package/dist/src/functions/depositWithHtsWrapping.d.ts +4 -6
  101. package/dist/src/functions/depositWithHtsWrapping.js +109 -226
  102. package/dist/src/functions/depositWithHtsWrapping.js.map +1 -1
  103. package/dist/src/functions/getFeeAprs.d.ts +1 -1
  104. package/dist/src/functions/getFeeAprs.js +55 -111
  105. package/dist/src/functions/getFeeAprs.js.map +1 -1
  106. package/dist/src/functions/priceFromPool.d.ts +3 -4
  107. package/dist/src/functions/priceFromPool.js +99 -208
  108. package/dist/src/functions/priceFromPool.js.map +1 -1
  109. package/dist/src/functions/rewardInfo.js +79 -159
  110. package/dist/src/functions/rewardInfo.js.map +1 -1
  111. package/dist/src/functions/totalBalances.d.ts +2 -3
  112. package/dist/src/functions/totalBalances.js +14 -67
  113. package/dist/src/functions/totalBalances.js.map +1 -1
  114. package/dist/src/functions/userBalances.d.ts +2 -3
  115. package/dist/src/functions/userBalances.js +244 -368
  116. package/dist/src/functions/userBalances.js.map +1 -1
  117. package/dist/src/functions/userRewards.d.ts +1 -1
  118. package/dist/src/functions/userRewards.js +87 -145
  119. package/dist/src/functions/userRewards.js.map +1 -1
  120. package/dist/src/functions/vault.d.ts +1 -1
  121. package/dist/src/functions/vault.js +203 -383
  122. package/dist/src/functions/vault.js.map +1 -1
  123. package/dist/src/functions/vaultBasics.js +6 -7
  124. package/dist/src/functions/vaultBasics.js.map +1 -1
  125. package/dist/src/functions/vaultMetrics.d.ts +1 -1
  126. package/dist/src/functions/vaultMetrics.js +111 -189
  127. package/dist/src/functions/vaultMetrics.js.map +1 -1
  128. package/dist/src/functions/vaultPositions.d.ts +1 -1
  129. package/dist/src/functions/vaultPositions.js +69 -134
  130. package/dist/src/functions/vaultPositions.js.map +1 -1
  131. package/dist/src/functions/vaultTvl.d.ts +1 -1
  132. package/dist/src/functions/vaultTvl.js +80 -165
  133. package/dist/src/functions/vaultTvl.js.map +1 -1
  134. package/dist/src/functions/withdraw.d.ts +6 -8
  135. package/dist/src/functions/withdraw.js +165 -295
  136. package/dist/src/functions/withdraw.js.map +1 -1
  137. package/dist/src/functions/withdrawWithErc20Wrapping.d.ts +2 -4
  138. package/dist/src/functions/withdrawWithErc20Wrapping.js +59 -126
  139. package/dist/src/functions/withdrawWithErc20Wrapping.js.map +1 -1
  140. package/dist/src/graphql/constants.js +211 -212
  141. package/dist/src/graphql/constants.js.map +1 -1
  142. package/dist/src/graphql/functions.js +30 -102
  143. package/dist/src/graphql/functions.js.map +1 -1
  144. package/dist/src/graphql/queries.js +407 -42
  145. package/dist/src/graphql/queries.js.map +1 -1
  146. package/dist/src/index.cjs.js +3 -2
  147. package/dist/src/index.d.ts +1 -0
  148. package/dist/src/index.esm.js +3 -2
  149. package/dist/src/index.js +1 -0
  150. package/dist/src/index.js.map +1 -1
  151. package/dist/src/src/contracts/index.d.ts +1 -1
  152. package/dist/src/src/functions/_totalBalances.d.ts +2 -3
  153. package/dist/src/src/functions/_withdrawHelpers.d.ts +2 -3
  154. package/dist/src/src/functions/calculateApr.d.ts +1 -1
  155. package/dist/src/src/functions/calculateDtr.d.ts +1 -1
  156. package/dist/src/src/functions/calculateFees.d.ts +1 -1
  157. package/dist/src/src/functions/claimRewards.d.ts +3 -4
  158. package/dist/src/src/functions/deposit.d.ts +7 -9
  159. package/dist/src/src/functions/depositWithHtsWrapping.d.ts +4 -6
  160. package/dist/src/src/functions/getFeeAprs.d.ts +1 -1
  161. package/dist/src/src/functions/priceFromPool.d.ts +3 -4
  162. package/dist/src/src/functions/totalBalances.d.ts +2 -3
  163. package/dist/src/src/functions/userBalances.d.ts +2 -3
  164. package/dist/src/src/functions/userRewards.d.ts +1 -1
  165. package/dist/src/src/functions/vault.d.ts +1 -1
  166. package/dist/src/src/functions/vaultMetrics.d.ts +1 -1
  167. package/dist/src/src/functions/vaultPositions.d.ts +1 -1
  168. package/dist/src/src/functions/vaultTvl.d.ts +1 -1
  169. package/dist/src/src/functions/withdraw.d.ts +6 -8
  170. package/dist/src/src/functions/withdrawWithErc20Wrapping.d.ts +2 -4
  171. package/dist/src/src/index.d.ts +1 -0
  172. package/dist/src/src/types/calculateGasMargin.d.ts +1 -2
  173. package/dist/src/src/types/index.d.ts +11 -13
  174. package/dist/src/src/utils/amountWithSlippage.d.ts +1 -2
  175. package/dist/src/src/utils/config/addresses.d.ts +1 -1
  176. package/dist/src/src/utils/formatBigInt.d.ts +1 -2
  177. package/dist/src/src/utils/getConfigByFactory.d.ts +33 -0
  178. package/dist/src/src/utils/getPrice.d.ts +1 -2
  179. package/dist/src/src/utils/multicallUtils.d.ts +9 -10
  180. package/dist/src/src/utils/parseBigInt.d.ts +1 -2
  181. package/dist/src/types/calculateGasMargin.d.ts +1 -2
  182. package/dist/src/types/calculateGasMargin.js +4 -5
  183. package/dist/src/types/calculateGasMargin.js.map +1 -1
  184. package/dist/src/types/index.d.ts +11 -13
  185. package/dist/src/types/index.js.map +1 -1
  186. package/dist/src/utils/amountWithSlippage.d.ts +1 -2
  187. package/dist/src/utils/amountWithSlippage.js +1 -1
  188. package/dist/src/utils/amountWithSlippage.js.map +1 -1
  189. package/dist/src/utils/cache.js +2 -2
  190. package/dist/src/utils/cache.js.map +1 -1
  191. package/dist/src/utils/config/addresses.d.ts +1 -1
  192. package/dist/src/utils/config/addresses.js +267 -268
  193. package/dist/src/utils/config/addresses.js.map +1 -1
  194. package/dist/src/utils/formatBigInt.d.ts +1 -2
  195. package/dist/src/utils/formatBigInt.js +4 -5
  196. package/dist/src/utils/formatBigInt.js.map +1 -1
  197. package/dist/src/utils/getConfigByFactory.d.ts +33 -0
  198. package/dist/src/utils/getConfigByFactory.js +79 -0
  199. package/dist/src/utils/getConfigByFactory.js.map +1 -0
  200. package/dist/src/utils/getGraphUrls.js +8 -12
  201. package/dist/src/utils/getGraphUrls.js.map +1 -1
  202. package/dist/src/utils/getPrice.d.ts +1 -2
  203. package/dist/src/utils/getPrice.js +5 -6
  204. package/dist/src/utils/getPrice.js.map +1 -1
  205. package/dist/src/utils/isVelodrome.js +2 -3
  206. package/dist/src/utils/isVelodrome.js.map +1 -1
  207. package/dist/src/utils/multicallUtils.d.ts +9 -10
  208. package/dist/src/utils/multicallUtils.js +38 -93
  209. package/dist/src/utils/multicallUtils.js.map +1 -1
  210. package/dist/src/utils/parseBigInt.d.ts +1 -2
  211. package/dist/src/utils/parseBigInt.js +5 -7
  212. package/dist/src/utils/parseBigInt.js.map +1 -1
  213. package/dist/src/utils/positionKey.js +2 -4
  214. package/dist/src/utils/positionKey.js.map +1 -1
  215. package/package.json +5 -17
@@ -1,391 +1,226 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
50
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
51
4
  };
52
5
  Object.defineProperty(exports, "__esModule", { value: true });
53
6
  exports.depositNativeToken = exports.deposit = exports.getMaxDepositAmount = exports._getMaxDepositAmount = exports.approveDepositToken = exports.isDepositTokenApproved = exports.isTokenAllowed = void 0;
54
- var constants_1 = require("@ethersproject/constants");
55
- var ethers_1 = require("ethers");
56
- var contracts_1 = require("../contracts");
57
- var parseBigInt_1 = __importDefault(require("../utils/parseBigInt"));
58
- var types_1 = require("../types");
59
- var calculateGasMargin_1 = require("../types/calculateGasMargin");
7
+ const ethers_1 = require("ethers");
8
+ const contracts_1 = require("../contracts");
9
+ const parseBigInt_1 = __importDefault(require("../utils/parseBigInt"));
10
+ const types_1 = require("../types");
11
+ const calculateGasMargin_1 = require("../types/calculateGasMargin");
60
12
  // eslint-disable-next-line import/no-cycle
61
- var vault_1 = require("./vault");
62
- var addresses_1 = require("../utils/config/addresses");
63
- var amountWithSlippage_1 = __importDefault(require("../utils/amountWithSlippage"));
64
- var vaultBasics_1 = __importDefault(require("./vaultBasics"));
65
- var _totalBalances_1 = require("./_totalBalances");
66
- function isTokenAllowed(tokenIdx, vaultAddress, jsonProvider, dex) {
67
- return __awaiter(this, void 0, void 0, function () {
68
- var chainId, vault, tokenAllowed;
69
- return __generator(this, function (_a) {
70
- switch (_a.label) {
71
- case 0: return [4 /*yield*/, jsonProvider.getNetwork()];
72
- case 1:
73
- chainId = (_a.sent()).chainId;
74
- if (!Object.values(types_1.SupportedChainId).includes(chainId)) {
75
- throw new Error("Unsupported chainId: ".concat(chainId));
76
- }
77
- return [4 /*yield*/, (0, vault_1.getIchiVaultInfo)(chainId, dex, vaultAddress, jsonProvider)];
78
- case 2:
79
- vault = _a.sent();
80
- if (!vault)
81
- throw new Error("Vault ".concat(vaultAddress, " not found on chain ").concat(chainId, " and dex ").concat(dex));
82
- tokenAllowed = vault[tokenIdx === 0 ? 'allowTokenA' : 'allowTokenB'];
83
- return [2 /*return*/, tokenAllowed];
84
- }
85
- });
86
- });
13
+ const vault_1 = require("./vault");
14
+ const addresses_1 = require("../utils/config/addresses");
15
+ const amountWithSlippage_1 = __importDefault(require("../utils/amountWithSlippage"));
16
+ const vaultBasics_1 = __importDefault(require("./vaultBasics"));
17
+ const _totalBalances_1 = require("./_totalBalances");
18
+ async function isTokenAllowed(tokenIdx, vaultAddress, jsonProvider, dex) {
19
+ const network = await jsonProvider.getNetwork();
20
+ const chainId = Number(network.chainId);
21
+ if (!Object.values(types_1.SupportedChainId).includes(chainId)) {
22
+ throw new Error(`Unsupported chainId: ${chainId}`);
23
+ }
24
+ const vault = await (0, vault_1.getIchiVaultInfo)(chainId, dex, vaultAddress, jsonProvider);
25
+ if (!vault)
26
+ throw new Error(`Vault ${vaultAddress} not found on chain ${chainId} and dex ${dex}`);
27
+ const tokenAllowed = vault[tokenIdx === 0 ? 'allowTokenA' : 'allowTokenB'];
28
+ return tokenAllowed;
87
29
  }
88
30
  exports.isTokenAllowed = isTokenAllowed;
89
31
  // eslint-disable-next-line no-underscore-dangle
90
- function _isDepositTokenApproved(accountAddress, tokenIdx, amount, vault, chainId, jsonProvider, dex) {
91
- var _a, _b;
92
- return __awaiter(this, void 0, void 0, function () {
93
- var token, tokenContract, depositGuardAddress, currentAllowanceBN, tokenDecimals, amountBN;
94
- return __generator(this, function (_c) {
95
- switch (_c.label) {
96
- case 0:
97
- token = vault[tokenIdx === 0 ? 'tokenA' : 'tokenB'];
98
- tokenContract = (0, contracts_1.getERC20Contract)(token, jsonProvider);
99
- depositGuardAddress = (_b = (_a = addresses_1.addressConfig[chainId][dex]) === null || _a === void 0 ? void 0 : _a.depositGuard.address) !== null && _b !== void 0 ? _b : '';
100
- return [4 /*yield*/, tokenContract.allowance(accountAddress, depositGuardAddress)];
101
- case 1:
102
- currentAllowanceBN = _c.sent();
103
- return [4 /*yield*/, tokenContract.decimals()];
104
- case 2:
105
- tokenDecimals = _c.sent();
106
- amountBN = amount instanceof ethers_1.BigNumber ? amount : (0, parseBigInt_1.default)(amount, tokenDecimals);
107
- return [2 /*return*/, currentAllowanceBN.gt(ethers_1.BigNumber.from(0)) && currentAllowanceBN.gte(amountBN)];
108
- }
109
- });
110
- });
32
+ async function _isDepositTokenApproved(accountAddress, tokenIdx, amount, vault, chainId, jsonProvider, dex) {
33
+ const token = vault[tokenIdx === 0 ? 'tokenA' : 'tokenB'];
34
+ const tokenContract = (0, contracts_1.getERC20Contract)(token, jsonProvider);
35
+ const depositGuardAddress = addresses_1.addressConfig[chainId][dex]?.depositGuard.address ?? '';
36
+ const currentAllowanceBN = await tokenContract.allowance(accountAddress, depositGuardAddress);
37
+ const tokenDecimals = Number(await tokenContract.decimals());
38
+ const amountBN = typeof amount === 'bigint' ? amount : (0, parseBigInt_1.default)(amount, tokenDecimals);
39
+ return currentAllowanceBN > 0n && currentAllowanceBN >= amountBN;
111
40
  }
112
- function isDepositTokenApproved(accountAddress, tokenIdx, amount, vaultAddress, jsonProvider, dex) {
113
- return __awaiter(this, void 0, void 0, function () {
114
- var _a, vault, chainId;
115
- return __generator(this, function (_b) {
116
- switch (_b.label) {
117
- case 0: return [4 /*yield*/, (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex)];
118
- case 1:
119
- _a = _b.sent(), vault = _a.vault, chainId = _a.chainId;
120
- return [2 /*return*/, _isDepositTokenApproved(accountAddress, tokenIdx, amount, vault, chainId, jsonProvider, dex)];
121
- }
122
- });
123
- });
41
+ async function isDepositTokenApproved(accountAddress, tokenIdx, amount, vaultAddress, jsonProvider, dex) {
42
+ const { vault, chainId } = await (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex);
43
+ return _isDepositTokenApproved(accountAddress, tokenIdx, amount, vault, chainId, jsonProvider, dex);
124
44
  }
125
45
  exports.isDepositTokenApproved = isDepositTokenApproved;
126
- function approveDepositToken(accountAddress, tokenIdx, vaultAddress, jsonProvider, dex, amount, overrides) {
127
- var _a, _b, _c;
128
- return __awaiter(this, void 0, void 0, function () {
129
- var _d, chainId, vault, signer, token, tokenContract, tokenDecimals, amountBN, depositGuardAddress, gasLimit, _e, _f;
130
- return __generator(this, function (_g) {
131
- switch (_g.label) {
132
- case 0: return [4 /*yield*/, (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex)];
133
- case 1:
134
- _d = _g.sent(), chainId = _d.chainId, vault = _d.vault;
135
- signer = jsonProvider.getSigner(accountAddress);
136
- token = vault[tokenIdx === 0 ? 'tokenA' : 'tokenB'];
137
- tokenContract = (0, contracts_1.getERC20Contract)(token, signer);
138
- return [4 /*yield*/, tokenContract.decimals()];
139
- case 2:
140
- tokenDecimals = _g.sent();
141
- amountBN = amount
142
- ? amount instanceof ethers_1.BigNumber
143
- ? amount
144
- : (0, parseBigInt_1.default)(amount, +tokenDecimals || 18)
145
- : constants_1.MaxUint256;
146
- depositGuardAddress = (_b = (_a = addresses_1.addressConfig[chainId][dex]) === null || _a === void 0 ? void 0 : _a.depositGuard.address) !== null && _b !== void 0 ? _b : '';
147
- if (!((_c = overrides === null || overrides === void 0 ? void 0 : overrides.gasLimit) !== null && _c !== void 0)) return [3 /*break*/, 3];
148
- _e = _c;
149
- return [3 /*break*/, 5];
150
- case 3:
151
- _f = calculateGasMargin_1.calculateGasMargin;
152
- return [4 /*yield*/, tokenContract.estimateGas.approve(depositGuardAddress, amountBN)];
153
- case 4:
154
- _e = _f.apply(void 0, [_g.sent()]);
155
- _g.label = 5;
156
- case 5:
157
- gasLimit = _e;
158
- return [2 /*return*/, tokenContract.approve(depositGuardAddress, amountBN, { gasLimit: gasLimit })];
159
- }
160
- });
161
- });
46
+ async function approveDepositToken(accountAddress, tokenIdx, vaultAddress, signer, dex, amount, overrides) {
47
+ if (!signer.provider) {
48
+ throw new Error('Signer must be connected to a provider');
49
+ }
50
+ const jsonProvider = signer.provider;
51
+ const { chainId, vault } = await (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex);
52
+ const token = vault[tokenIdx === 0 ? 'tokenA' : 'tokenB'];
53
+ const tokenContract = (0, contracts_1.getERC20Contract)(token, signer);
54
+ const tokenDecimals = Number(await tokenContract.decimals());
55
+ // eslint-disable-next-line no-nested-ternary
56
+ const amountBN = amount
57
+ ? typeof amount === 'bigint'
58
+ ? amount
59
+ : (0, parseBigInt_1.default)(amount, tokenDecimals || 18)
60
+ : ethers_1.MaxUint256;
61
+ const depositGuardAddress = addresses_1.addressConfig[chainId][dex]?.depositGuard.address ?? '';
62
+ const gasLimit = overrides?.gasLimit ?? (0, calculateGasMargin_1.calculateGasMargin)(await tokenContract.approve.estimateGas(depositGuardAddress, amountBN));
63
+ return tokenContract.approve(depositGuardAddress, amountBN, { gasLimit });
162
64
  }
163
65
  exports.approveDepositToken = approveDepositToken;
164
66
  // eslint-disable-next-line no-underscore-dangle
165
- function _getMaxDepositAmount(tokenIdx, vaultAddress, jsonProvider) {
166
- return __awaiter(this, void 0, void 0, function () {
167
- var vaultContract, maxDepositAmount;
168
- return __generator(this, function (_a) {
169
- vaultContract = (0, contracts_1.getIchiVaultContract)(vaultAddress, jsonProvider);
170
- maxDepositAmount = tokenIdx === 0 ? vaultContract.deposit0Max() : vaultContract.deposit1Max();
171
- return [2 /*return*/, maxDepositAmount];
172
- });
173
- });
67
+ async function _getMaxDepositAmount(tokenIdx, vaultAddress, jsonProvider) {
68
+ const vaultContract = (0, contracts_1.getIchiVaultContract)(vaultAddress, jsonProvider);
69
+ const maxDepositAmount = tokenIdx === 0 ? vaultContract.deposit0Max() : vaultContract.deposit1Max();
70
+ return maxDepositAmount;
174
71
  }
175
72
  exports._getMaxDepositAmount = _getMaxDepositAmount;
176
- function getMaxDepositAmount(tokenIdx, vaultAddress, jsonProvider, dex) {
177
- return __awaiter(this, void 0, void 0, function () {
178
- var maxDepositAmount;
179
- return __generator(this, function (_a) {
180
- switch (_a.label) {
181
- case 0: return [4 /*yield*/, (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex)];
182
- case 1:
183
- _a.sent();
184
- maxDepositAmount = _getMaxDepositAmount(tokenIdx, vaultAddress, jsonProvider);
185
- return [2 /*return*/, maxDepositAmount];
186
- }
187
- });
188
- });
73
+ async function getMaxDepositAmount(tokenIdx, vaultAddress, jsonProvider, dex) {
74
+ await (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex);
75
+ const maxDepositAmount = _getMaxDepositAmount(tokenIdx, vaultAddress, jsonProvider);
76
+ return maxDepositAmount;
189
77
  }
190
78
  exports.getMaxDepositAmount = getMaxDepositAmount;
191
- function deposit(accountAddress, amount0, amount1, vaultAddress, jsonProvider, dex, percentSlippage, overrides) {
192
- var _a, _b, _c;
193
- if (percentSlippage === void 0) { percentSlippage = 1; }
194
- return __awaiter(this, void 0, void 0, function () {
195
- var _d, chainId, vault, signer, vaultDeployerAddress, token0, token1, isToken0Allowed, isToken1Allowed, token0Decimals, token1Decimals, amount0BN, amount1BN, depositAmount, depositToken, tokenIndex, amountBN, isApproved, tokenContract, userTokenBalance, maxDeposit0, maxDeposit1, depositGuardAddress, depositGuardContract, maxGasLimit, lpAmount, gasLimit, _e, _f, tx;
196
- return __generator(this, function (_g) {
197
- switch (_g.label) {
198
- case 0: return [4 /*yield*/, (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex)];
199
- case 1:
200
- _d = _g.sent(), chainId = _d.chainId, vault = _d.vault;
201
- signer = jsonProvider.getSigner(accountAddress);
202
- vaultDeployerAddress = (0, vaultBasics_1.default)(vaultAddress, chainId, dex);
203
- token0 = vault.tokenA;
204
- token1 = vault.tokenB;
205
- isToken0Allowed = vault.allowTokenA;
206
- isToken1Allowed = vault.allowTokenB;
207
- return [4 /*yield*/, (0, _totalBalances_1.getTokenDecimals)(token0, jsonProvider, chainId)];
208
- case 2:
209
- token0Decimals = _g.sent();
210
- return [4 /*yield*/, (0, _totalBalances_1.getTokenDecimals)(token1, jsonProvider, chainId)];
211
- case 3:
212
- token1Decimals = _g.sent();
213
- amount0BN = amount0 instanceof ethers_1.BigNumber ? amount0 : (0, parseBigInt_1.default)(amount0, +token0Decimals);
214
- amount1BN = amount1 instanceof ethers_1.BigNumber ? amount1 : (0, parseBigInt_1.default)(amount1, +token1Decimals);
215
- if (!isToken0Allowed && amount0BN.gt(ethers_1.BigNumber.from(0))) {
216
- throw new Error("Deposit of token0 is not allowed: ".concat(chainId, ", ").concat(vaultAddress));
217
- }
218
- if (!isToken1Allowed && amount1BN.gt(ethers_1.BigNumber.from(0))) {
219
- throw new Error("Deposit of token1 is not allowed: chain ".concat(chainId, ", vault ").concat(vaultAddress));
220
- }
221
- depositAmount = amount0BN;
222
- depositToken = token0;
223
- tokenIndex = 0;
224
- if (amount1BN.gt(ethers_1.BigNumber.from(0))) {
225
- depositAmount = amount1BN;
226
- depositToken = token1;
227
- tokenIndex = 1;
228
- }
229
- amountBN = isToken0Allowed ? amount0BN : amount1BN;
230
- return [4 /*yield*/, _isDepositTokenApproved(accountAddress, tokenIndex, amountBN, vault, chainId, jsonProvider, dex)];
231
- case 4:
232
- isApproved = _g.sent();
233
- if (!isApproved) {
234
- throw new Error("Deposit is not approved for token: ".concat(depositToken, ", chain ").concat(chainId, ", vault ").concat(vaultAddress));
235
- }
236
- tokenContract = (0, contracts_1.getERC20Contract)(depositToken, jsonProvider);
237
- return [4 /*yield*/, tokenContract.balanceOf(accountAddress)];
238
- case 5:
239
- userTokenBalance = _g.sent();
240
- if (userTokenBalance.lt(depositAmount)) {
241
- throw new Error("Deposit amount exceeds user token amount for token: ".concat(depositToken, ", chain ").concat(chainId));
242
- }
243
- return [4 /*yield*/, _getMaxDepositAmount(0, vaultAddress, jsonProvider)];
244
- case 6:
245
- maxDeposit0 = _g.sent();
246
- return [4 /*yield*/, _getMaxDepositAmount(1, vaultAddress, jsonProvider)];
247
- case 7:
248
- maxDeposit1 = _g.sent();
249
- if (amount0BN.gt(maxDeposit0) || amount0BN.gt(maxDeposit1)) {
250
- throw new Error("Deposit amount exceeds max deposit amount: vault ".concat(vaultAddress, ", chain ").concat(chainId));
251
- }
252
- depositGuardAddress = (_b = (_a = addresses_1.addressConfig[chainId][dex]) === null || _a === void 0 ? void 0 : _a.depositGuard.address) !== null && _b !== void 0 ? _b : '';
253
- depositGuardContract = (0, contracts_1.getDepositGuardContract)(depositGuardAddress, signer);
254
- maxGasLimit = (0, calculateGasMargin_1.getGasLimit)(chainId);
255
- return [4 /*yield*/, depositGuardContract.callStatic.forwardDepositToICHIVault(vaultAddress, vaultDeployerAddress, depositToken, depositAmount, ethers_1.BigNumber.from(0), accountAddress, {
256
- gasLimit: maxGasLimit,
257
- })];
258
- case 8:
259
- lpAmount = _g.sent();
260
- // reduce the estimated LP amount by an acceptable slippage %, for example 1%
261
- if (percentSlippage < 0.01)
262
- throw new Error('Slippage parameter is less than 0.01%.');
263
- if (percentSlippage > 100)
264
- throw new Error('Slippage parameter is more than 100%.');
265
- lpAmount = lpAmount.mul(Math.floor((100 - percentSlippage) * 1000)).div(100000);
266
- if (!((_c = overrides === null || overrides === void 0 ? void 0 : overrides.gasLimit) !== null && _c !== void 0)) return [3 /*break*/, 9];
267
- _e = _c;
268
- return [3 /*break*/, 11];
269
- case 9:
270
- _f = calculateGasMargin_1.calculateGasMargin;
271
- return [4 /*yield*/, depositGuardContract.estimateGas.forwardDepositToICHIVault(vaultAddress, vaultDeployerAddress, depositToken, depositAmount, lpAmount, accountAddress)];
272
- case 10:
273
- _e = _f.apply(void 0, [_g.sent()]);
274
- _g.label = 11;
275
- case 11:
276
- gasLimit = _e;
277
- return [4 /*yield*/, depositGuardContract.forwardDepositToICHIVault(vaultAddress, vaultDeployerAddress, depositToken, depositAmount, lpAmount, accountAddress, __assign(__assign({}, overrides), { gasLimit: gasLimit }))];
278
- case 12:
279
- tx = _g.sent();
280
- return [2 /*return*/, tx];
281
- }
282
- });
79
+ async function deposit(accountAddress, amount0, amount1, vaultAddress, signer, dex, percentSlippage = 1, overrides) {
80
+ if (!signer.provider) {
81
+ throw new Error('Signer must be connected to a provider');
82
+ }
83
+ const jsonProvider = signer.provider;
84
+ const { chainId, vault } = await (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex);
85
+ const vaultDeployerAddress = (0, vaultBasics_1.default)(vaultAddress, chainId, dex);
86
+ const token0 = vault.tokenA;
87
+ const token1 = vault.tokenB;
88
+ const isToken0Allowed = vault.allowTokenA;
89
+ const isToken1Allowed = vault.allowTokenB;
90
+ const token0Decimals = await (0, _totalBalances_1.getTokenDecimals)(token0, jsonProvider, chainId);
91
+ const token1Decimals = await (0, _totalBalances_1.getTokenDecimals)(token1, jsonProvider, chainId);
92
+ const amount0BN = typeof amount0 === 'bigint' ? amount0 : (0, parseBigInt_1.default)(amount0, token0Decimals);
93
+ const amount1BN = typeof amount1 === 'bigint' ? amount1 : (0, parseBigInt_1.default)(amount1, token1Decimals);
94
+ if (!isToken0Allowed && amount0BN > 0n) {
95
+ throw new Error(`Deposit of token0 is not allowed: ${chainId}, ${vaultAddress}`);
96
+ }
97
+ if (!isToken1Allowed && amount1BN > 0n) {
98
+ throw new Error(`Deposit of token1 is not allowed: chain ${chainId}, vault ${vaultAddress}`);
99
+ }
100
+ let depositAmount = amount0BN;
101
+ let depositToken = token0;
102
+ let tokenIndex = 0;
103
+ if (amount1BN > 0n) {
104
+ depositAmount = amount1BN;
105
+ depositToken = token1;
106
+ tokenIndex = 1;
107
+ }
108
+ const amountBN = isToken0Allowed ? amount0BN : amount1BN;
109
+ const isApproved = await _isDepositTokenApproved(accountAddress, tokenIndex, amountBN, vault, chainId, jsonProvider, dex);
110
+ if (!isApproved) {
111
+ throw new Error(`Deposit is not approved for token: ${depositToken}, chain ${chainId}, vault ${vaultAddress}`);
112
+ }
113
+ const tokenContract = (0, contracts_1.getERC20Contract)(depositToken, jsonProvider);
114
+ const userTokenBalance = await tokenContract.balanceOf(accountAddress);
115
+ if (userTokenBalance < depositAmount) {
116
+ throw new Error(`Deposit amount exceeds user token amount for token: ${depositToken}, chain ${chainId}`);
117
+ }
118
+ const maxDeposit0 = await _getMaxDepositAmount(0, vaultAddress, jsonProvider);
119
+ const maxDeposit1 = await _getMaxDepositAmount(1, vaultAddress, jsonProvider);
120
+ if (amount0BN > maxDeposit0 || amount0BN > maxDeposit1) {
121
+ throw new Error(`Deposit amount exceeds max deposit amount: vault ${vaultAddress}, chain ${chainId}`);
122
+ }
123
+ // obtain Deposit Guard contract
124
+ const depositGuardAddress = addresses_1.addressConfig[chainId][dex]?.depositGuard.address ?? '';
125
+ const depositGuardContract = (0, contracts_1.getDepositGuardContract)(depositGuardAddress, signer);
126
+ const maxGasLimit = (0, calculateGasMargin_1.getGasLimit)(chainId);
127
+ // the first call: get estimated LP amount
128
+ let lpAmount = await depositGuardContract.forwardDepositToICHIVault.staticCall(vaultAddress, vaultDeployerAddress, depositToken, depositAmount, 0n, accountAddress, {
129
+ gasLimit: maxGasLimit,
283
130
  });
131
+ // reduce the estimated LP amount by an acceptable slippage %, for example 1%
132
+ if (percentSlippage < 0.01)
133
+ throw new Error('Slippage parameter is less than 0.01%.');
134
+ if (percentSlippage > 100)
135
+ throw new Error('Slippage parameter is more than 100%.');
136
+ lpAmount = (0, amountWithSlippage_1.default)(lpAmount, percentSlippage);
137
+ const gasLimit = overrides?.gasLimit ??
138
+ (0, calculateGasMargin_1.calculateGasMargin)(await depositGuardContract.forwardDepositToICHIVault.estimateGas(vaultAddress, vaultDeployerAddress, depositToken, depositAmount, lpAmount, accountAddress));
139
+ // the second call: actual deposit transaction
140
+ const tx = await depositGuardContract.forwardDepositToICHIVault(vaultAddress, vaultDeployerAddress, depositToken, depositAmount, lpAmount, accountAddress, {
141
+ ...overrides,
142
+ gasLimit,
143
+ });
144
+ return tx;
284
145
  }
285
146
  exports.deposit = deposit;
286
- function depositNativeToken(accountAddress, amount0, amount1, vaultAddress, jsonProvider, dex, percentSlippage, overrides) {
287
- var _a, _b, _c;
288
- if (percentSlippage === void 0) { percentSlippage = 1; }
289
- return __awaiter(this, void 0, void 0, function () {
290
- var _d, chainId, vault, signer, vaultDeployerAddress, token0, token1, isToken0Allowed, isToken1Allowed, token0Contract, token1Contract, token0Decimals, token1Decimals, amount0BN, amount1BN, depositAmount, depositToken, depositGuardAddress, depositGuardContract, wrappedNative, _e, userNativeTokenBalance, maxGasLimit, lpAmount, gasLimit, _f, _g, tx;
291
- return __generator(this, function (_h) {
292
- switch (_h.label) {
293
- case 0: return [4 /*yield*/, (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex)];
294
- case 1:
295
- _d = _h.sent(), chainId = _d.chainId, vault = _d.vault;
296
- if (chainId === types_1.SupportedChainId.celo) {
297
- throw new Error("This function is not supported on chain ".concat(chainId));
298
- }
299
- if (((_a = addresses_1.addressConfig[chainId][dex]) === null || _a === void 0 ? void 0 : _a.depositGuard.version) !== 2) {
300
- throw new Error("Unsupported function for vault ".concat(vaultAddress, " on chain ").concat(chainId, " and dex ").concat(dex));
301
- }
302
- signer = jsonProvider.getSigner(accountAddress);
303
- vaultDeployerAddress = (0, vaultBasics_1.default)(vaultAddress, chainId, dex);
304
- token0 = vault.tokenA;
305
- token1 = vault.tokenB;
306
- isToken0Allowed = vault.allowTokenA;
307
- isToken1Allowed = vault.allowTokenB;
308
- token0Contract = (0, contracts_1.getERC20Contract)(token0, signer);
309
- token1Contract = (0, contracts_1.getERC20Contract)(token1, signer);
310
- return [4 /*yield*/, token0Contract.decimals()];
311
- case 2:
312
- token0Decimals = _h.sent();
313
- return [4 /*yield*/, token1Contract.decimals()];
314
- case 3:
315
- token1Decimals = _h.sent();
316
- amount0BN = amount0 instanceof ethers_1.BigNumber ? amount0 : (0, parseBigInt_1.default)(amount0, +token0Decimals);
317
- amount1BN = amount1 instanceof ethers_1.BigNumber ? amount1 : (0, parseBigInt_1.default)(amount1, +token1Decimals);
318
- if (!isToken0Allowed && amount0BN > ethers_1.BigNumber.from(0)) {
319
- throw new Error("Deposit of token0 is not allowed: ".concat(chainId, ", ").concat(vaultAddress));
320
- }
321
- if (!isToken1Allowed && amount1BN > ethers_1.BigNumber.from(0)) {
322
- throw new Error("Deposit of token1 is not allowed: ".concat(chainId, ", ").concat(vaultAddress));
323
- }
324
- depositAmount = amount0BN;
325
- depositToken = token0;
326
- if (amount1BN > ethers_1.BigNumber.from(0)) {
327
- depositAmount = amount1BN;
328
- depositToken = token1;
329
- }
330
- depositGuardAddress = (_b = addresses_1.addressConfig[chainId][dex]) === null || _b === void 0 ? void 0 : _b.depositGuard.address;
331
- if (!depositGuardAddress) {
332
- throw new Error("Deposit Guard not found for vault ".concat(vaultAddress, " on chain ").concat(chainId, " and dex ").concat(dex));
333
- }
334
- depositGuardContract = (0, contracts_1.getDepositGuardContract)(depositGuardAddress, signer);
335
- if (!(chainId === types_1.SupportedChainId.hedera)) return [3 /*break*/, 4];
336
- _e = '0x0000000000000000000000000000000000163b5a';
337
- return [3 /*break*/, 6];
338
- case 4: return [4 /*yield*/, depositGuardContract.WRAPPED_NATIVE()];
339
- case 5:
340
- _e = _h.sent();
341
- _h.label = 6;
342
- case 6:
343
- wrappedNative = _e;
344
- if (wrappedNative.toLowerCase() !== depositToken.toLowerCase()) {
345
- throw new Error('Deposit token is not wrapped native token');
346
- }
347
- return [4 /*yield*/, jsonProvider.getBalance(accountAddress)];
348
- case 7:
349
- userNativeTokenBalance = _h.sent();
350
- if (userNativeTokenBalance.lt(depositAmount)) {
351
- throw new Error("Deposit amount exceeds user native token amount on chain ".concat(chainId));
352
- }
353
- maxGasLimit = (0, calculateGasMargin_1.getGasLimit)(chainId);
354
- if (chainId === types_1.SupportedChainId.hedera) {
355
- depositAmount = depositAmount.mul(ethers_1.BigNumber.from(1e10));
356
- }
357
- return [4 /*yield*/, depositGuardContract.callStatic.forwardNativeDepositToICHIVault(vaultAddress, vaultDeployerAddress, ethers_1.BigNumber.from(0), accountAddress, {
358
- value: depositAmount,
359
- gasLimit: maxGasLimit,
360
- })];
361
- case 8:
362
- lpAmount = _h.sent();
363
- // reduce the estimated LP amount by an acceptable slippage %, for example 1%
364
- if (percentSlippage < 0.01)
365
- throw new Error('Slippage parameter is less than 0.01%.');
366
- if (percentSlippage > 100)
367
- throw new Error('Slippage parameter is more than 100%.');
368
- lpAmount = (0, amountWithSlippage_1.default)(lpAmount, percentSlippage);
369
- if (!((_c = overrides === null || overrides === void 0 ? void 0 : overrides.gasLimit) !== null && _c !== void 0)) return [3 /*break*/, 9];
370
- _f = _c;
371
- return [3 /*break*/, 11];
372
- case 9:
373
- _g = calculateGasMargin_1.calculateGasMargin;
374
- return [4 /*yield*/, depositGuardContract.estimateGas.forwardNativeDepositToICHIVault(vaultAddress, vaultDeployerAddress, lpAmount, accountAddress, {
375
- value: depositAmount,
376
- })];
377
- case 10:
378
- _f = _g.apply(void 0, [_h.sent()]);
379
- _h.label = 11;
380
- case 11:
381
- gasLimit = _f;
382
- return [4 /*yield*/, depositGuardContract.forwardNativeDepositToICHIVault(vaultAddress, vaultDeployerAddress, lpAmount, accountAddress, __assign(__assign({ value: depositAmount }, overrides), { gasLimit: gasLimit }))];
383
- case 12:
384
- tx = _h.sent();
385
- return [2 /*return*/, tx];
386
- }
387
- });
147
+ async function depositNativeToken(accountAddress, amount0, amount1, vaultAddress, signer, dex, percentSlippage = 1, overrides) {
148
+ if (!signer.provider) {
149
+ throw new Error('Signer must be connected to a provider');
150
+ }
151
+ const jsonProvider = signer.provider;
152
+ const { chainId, vault } = await (0, vault_1.validateVaultData)(vaultAddress, jsonProvider, dex);
153
+ if (chainId === types_1.SupportedChainId.celo) {
154
+ throw new Error(`This function is not supported on chain ${chainId}`);
155
+ }
156
+ if (addresses_1.addressConfig[chainId][dex]?.depositGuard.version !== 2) {
157
+ throw new Error(`Unsupported function for vault ${vaultAddress} on chain ${chainId} and dex ${dex}`);
158
+ }
159
+ const vaultDeployerAddress = (0, vaultBasics_1.default)(vaultAddress, chainId, dex);
160
+ const token0 = vault.tokenA;
161
+ const token1 = vault.tokenB;
162
+ const isToken0Allowed = vault.allowTokenA;
163
+ const isToken1Allowed = vault.allowTokenB;
164
+ const token0Contract = (0, contracts_1.getERC20Contract)(token0, signer);
165
+ const token1Contract = (0, contracts_1.getERC20Contract)(token1, signer);
166
+ const token0Decimals = Number(await token0Contract.decimals());
167
+ const token1Decimals = Number(await token1Contract.decimals());
168
+ const amount0BN = typeof amount0 === 'bigint' ? amount0 : (0, parseBigInt_1.default)(amount0, token0Decimals);
169
+ const amount1BN = typeof amount1 === 'bigint' ? amount1 : (0, parseBigInt_1.default)(amount1, token1Decimals);
170
+ if (!isToken0Allowed && amount0BN > 0n) {
171
+ throw new Error(`Deposit of token0 is not allowed: ${chainId}, ${vaultAddress}`);
172
+ }
173
+ if (!isToken1Allowed && amount1BN > 0n) {
174
+ throw new Error(`Deposit of token1 is not allowed: ${chainId}, ${vaultAddress}`);
175
+ }
176
+ let depositAmount = amount0BN;
177
+ let depositToken = token0;
178
+ if (amount1BN > 0n) {
179
+ depositAmount = amount1BN;
180
+ depositToken = token1;
181
+ }
182
+ // obtain Deposit Guard contract
183
+ const depositGuardAddress = addresses_1.addressConfig[chainId][dex]?.depositGuard.address;
184
+ if (!depositGuardAddress) {
185
+ throw new Error(`Deposit Guard not found for vault ${vaultAddress} on chain ${chainId} and dex ${dex}`);
186
+ }
187
+ const depositGuardContract = (0, contracts_1.getDepositGuardContract)(depositGuardAddress, signer);
188
+ const wrappedNative = chainId === types_1.SupportedChainId.hedera
189
+ ? '0x0000000000000000000000000000000000163b5a'
190
+ : await depositGuardContract.WRAPPED_NATIVE();
191
+ if (wrappedNative.toLowerCase() !== depositToken.toLowerCase()) {
192
+ throw new Error('Deposit token is not wrapped native token');
193
+ }
194
+ const userNativeTokenBalance = await jsonProvider.getBalance(accountAddress);
195
+ if (userNativeTokenBalance < depositAmount) {
196
+ throw new Error(`Deposit amount exceeds user native token amount on chain ${chainId}`);
197
+ }
198
+ const maxGasLimit = (0, calculateGasMargin_1.getGasLimit)(chainId);
199
+ if (chainId === types_1.SupportedChainId.hedera) {
200
+ depositAmount = depositAmount * BigInt(1e10);
201
+ }
202
+ // the first call: get estimated LP amount
203
+ let lpAmount = await depositGuardContract.forwardNativeDepositToICHIVault.staticCall(vaultAddress, vaultDeployerAddress, 0n, accountAddress, {
204
+ value: depositAmount,
205
+ gasLimit: maxGasLimit,
206
+ });
207
+ // reduce the estimated LP amount by an acceptable slippage %, for example 1%
208
+ if (percentSlippage < 0.01)
209
+ throw new Error('Slippage parameter is less than 0.01%.');
210
+ if (percentSlippage > 100)
211
+ throw new Error('Slippage parameter is more than 100%.');
212
+ lpAmount = (0, amountWithSlippage_1.default)(lpAmount, percentSlippage);
213
+ const gasLimit = overrides?.gasLimit ??
214
+ (0, calculateGasMargin_1.calculateGasMargin)(await depositGuardContract.forwardNativeDepositToICHIVault.estimateGas(vaultAddress, vaultDeployerAddress, lpAmount, accountAddress, {
215
+ value: depositAmount,
216
+ }));
217
+ // the second call: actual deposit transaction
218
+ const tx = await depositGuardContract.forwardNativeDepositToICHIVault(vaultAddress, vaultDeployerAddress, lpAmount, accountAddress, {
219
+ value: depositAmount,
220
+ ...overrides,
221
+ gasLimit,
388
222
  });
223
+ return tx;
389
224
  }
390
225
  exports.depositNativeToken = depositNativeToken;
391
226
  //# sourceMappingURL=deposit.js.map