@strkfarm/sdk 1.0.38 → 1.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -76,6 +76,43 @@ var import_axios = __toESM(require("axios"));
76
76
  // src/dataTypes/bignumber.node.ts
77
77
  var import_util = __toESM(require("util"));
78
78
 
79
+ // src/utils/logger.node.ts
80
+ var import_winston = __toESM(require("winston"));
81
+ var colors = {
82
+ error: "red",
83
+ warn: "yellow",
84
+ info: "blue",
85
+ verbose: "white",
86
+ debug: "white"
87
+ };
88
+ import_winston.default.addColors(colors);
89
+ var logger = import_winston.default.createLogger({
90
+ level: "verbose",
91
+ // Set the minimum logging level
92
+ format: import_winston.format.combine(
93
+ import_winston.format.colorize({ all: true }),
94
+ // Apply custom colors
95
+ import_winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
96
+ // Add timestamp to log messages
97
+ import_winston.format.printf(({ timestamp, level, message, ...meta }) => {
98
+ let msg = `${timestamp} ${level}: ${message}`;
99
+ if (meta && meta[Symbol.for("splat")]) {
100
+ for (const arg of meta[Symbol.for("splat")]) {
101
+ if (arg instanceof Error) {
102
+ msg += `
103
+ ${arg.stack}`;
104
+ }
105
+ }
106
+ }
107
+ return msg;
108
+ })
109
+ ),
110
+ transports: [
111
+ new import_winston.default.transports.Console()
112
+ // Output logs to the console
113
+ ]
114
+ });
115
+
79
116
  // src/dataTypes/_bignumber.ts
80
117
  var import_bignumber = __toESM(require("bignumber.js"));
81
118
  var _Web3Number = class extends import_bignumber.default {
@@ -92,6 +129,7 @@ var _Web3Number = class extends import_bignumber.default {
92
129
  }
93
130
  dividedBy(value) {
94
131
  const _value = this.getStandardString(value);
132
+ console.log("dividedBy", _value);
95
133
  return this.construct(this.div(_value).toString(), this.decimals);
96
134
  }
97
135
  plus(value) {
@@ -105,13 +143,15 @@ var _Web3Number = class extends import_bignumber.default {
105
143
  construct(value, decimals) {
106
144
  return new this.constructor(value, decimals);
107
145
  }
108
- toString(decimals = this.maxToFixedDecimals()) {
109
- return super.toFixed(decimals);
146
+ toString() {
147
+ return super.toString();
110
148
  }
111
149
  toJSON() {
150
+ logger.verbose(`converting to json with decimals`);
112
151
  return this.toString();
113
152
  }
114
153
  valueOf() {
154
+ logger.verbose(`converting to valueOf with decimals`);
115
155
  return this.toString();
116
156
  }
117
157
  maxToFixedDecimals() {
@@ -176,12 +216,6 @@ var ContractAddr = class _ContractAddr {
176
216
  };
177
217
 
178
218
  // src/global.ts
179
- var logger = {
180
- ...console,
181
- verbose(message) {
182
- console.log(`[VERBOSE] ${message}`);
183
- }
184
- };
185
219
  var FatalError = class extends Error {
186
220
  constructor(message, err) {
187
221
  super(message);
@@ -775,7 +809,7 @@ var PricerFromApi = class extends PricerBase {
775
809
  } catch (e) {
776
810
  logger.warn("getPriceFromMyAPI error", JSON.stringify(e.message || e));
777
811
  }
778
- logger.log("getPrice coinbase", tokenSymbol);
812
+ logger.info("getPrice coinbase", tokenSymbol);
779
813
  let retry = 0;
780
814
  const MAX_RETRIES = 5;
781
815
  for (retry = 1; retry < MAX_RETRIES + 1; retry++) {
@@ -1956,6 +1990,11 @@ var ERC20 = class {
1956
1990
  const balance = await contract.call("balanceOf", [address.toString()]);
1957
1991
  return Web3Number.fromWei(balance.toString(), tokenDecimals);
1958
1992
  }
1993
+ async allowance(token, owner, spender, tokenDecimals) {
1994
+ const contract = this.contract(token);
1995
+ const allowance = await contract.call("allowance", [owner.toString(), spender.toString()]);
1996
+ return Web3Number.fromWei(allowance.toString(), tokenDecimals);
1997
+ }
1959
1998
  };
1960
1999
 
1961
2000
  // src/modules/avnu.ts
@@ -13484,6 +13523,7 @@ var VesuRebalanceStrategies = [
13484
13523
  address: ContractAddr.from(
13485
13524
  "0x7fb5bcb8525954a60fde4e8fb8220477696ce7117ef264775a1770e23571929"
13486
13525
  ),
13526
+ launchBlock: 0,
13487
13527
  type: "ERC4626",
13488
13528
  depositTokens: [
13489
13529
  Global.getDefaultTokens().find((t) => t.symbol === "STRK")
@@ -13507,6 +13547,7 @@ var VesuRebalanceStrategies = [
13507
13547
  address: ContractAddr.from(
13508
13548
  "0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"
13509
13549
  ),
13550
+ launchBlock: 0,
13510
13551
  type: "ERC4626",
13511
13552
  auditUrl: AUDIT_URL,
13512
13553
  depositTokens: [
@@ -13530,6 +13571,7 @@ var VesuRebalanceStrategies = [
13530
13571
  address: ContractAddr.from(
13531
13572
  "0xa858c97e9454f407d1bd7c57472fc8d8d8449a777c822b41d18e387816f29c"
13532
13573
  ),
13574
+ launchBlock: 0,
13533
13575
  type: "ERC4626",
13534
13576
  auditUrl: AUDIT_URL,
13535
13577
  depositTokens: [
@@ -13553,6 +13595,7 @@ var VesuRebalanceStrategies = [
13553
13595
  address: ContractAddr.from(
13554
13596
  "0x115e94e722cfc4c77a2f15c4aefb0928c1c0029e5a57570df24c650cb7cec2c"
13555
13597
  ),
13598
+ launchBlock: 0,
13556
13599
  type: "ERC4626",
13557
13600
  depositTokens: [
13558
13601
  Global.getDefaultTokens().find((t) => t.symbol === "USDT")
@@ -18515,11 +18558,15 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18515
18558
  this.address.address,
18516
18559
  this.config.provider
18517
18560
  );
18518
- this.lstContract = new import_starknet9.Contract(
18519
- erc4626_abi_default,
18520
- this.metadata.additionalInfo.lstContract.address,
18521
- this.config.provider
18522
- );
18561
+ if (this.metadata.additionalInfo.lstContract) {
18562
+ this.lstContract = new import_starknet9.Contract(
18563
+ erc4626_abi_default,
18564
+ this.metadata.additionalInfo.lstContract.address,
18565
+ this.config.provider
18566
+ );
18567
+ } else {
18568
+ this.lstContract = null;
18569
+ }
18523
18570
  const EKUBO_POSITION = "0x02e0af29598b407c8716b17f6d2795eca1b471413fa03fb145a5e33722184067";
18524
18571
  this.ekuboPositionsContract = new import_starknet9.Contract(
18525
18572
  ekubo_positions_abi_default,
@@ -18653,7 +18700,7 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18653
18700
  const priceNow = await this.getCurrentPrice(blockIdentifier);
18654
18701
  let blockNow = typeof blockIdentifier == "number" ? blockIdentifier : (await this.config.provider.getBlockLatestAccepted()).block_number;
18655
18702
  const blockNowTime = typeof blockIdentifier == "number" ? (await this.config.provider.getBlockWithTxs(blockIdentifier)).timestamp : (/* @__PURE__ */ new Date()).getTime() / 1e3;
18656
- const blockBefore = blockNow - sinceBlocks;
18703
+ const blockBefore = Math.max(blockNow - sinceBlocks, this.metadata.launchBlock);
18657
18704
  const adjustedSupplyNow = supplyNow.minus(
18658
18705
  await this.getHarvestRewardShares(blockBefore, blockNow)
18659
18706
  );
@@ -18664,9 +18711,9 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18664
18711
  const supplyBefore = await this.totalSupply(blockBefore);
18665
18712
  const priceBefore = await this.getCurrentPrice(blockBefore);
18666
18713
  const tvlInToken0Now = tvlNow.amount0.multipliedBy(priceNow.price).plus(tvlNow.amount1);
18667
- const tvlPerShareNow = tvlInToken0Now.multipliedBy(1e18).dividedBy(adjustedSupplyNow);
18714
+ const tvlPerShareNow = tvlInToken0Now.multipliedBy(1e18).dividedBy(adjustedSupplyNow.toString());
18668
18715
  const tvlInToken0Bf = tvlBefore.amount0.multipliedBy(priceBefore.price).plus(tvlBefore.amount1);
18669
- const tvlPerShareBf = tvlInToken0Bf.multipliedBy(1e18).dividedBy(supplyBefore);
18716
+ const tvlPerShareBf = tvlInToken0Bf.multipliedBy(1e18).dividedBy(supplyBefore.toString());
18670
18717
  const timeDiffSeconds = blockNowTime - blockBeforeInfo.timestamp;
18671
18718
  logger.verbose(`tvlInToken0Now: ${tvlInToken0Now.toString()}`);
18672
18719
  logger.verbose(`tvlInToken0Bf: ${tvlInToken0Bf.toString()}`);
@@ -18704,7 +18751,9 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18704
18751
  return shares;
18705
18752
  }
18706
18753
  async balanceOf(user, blockIdentifier = "pending") {
18707
- let bal = await this.contract.call("balance_of", [user.address]);
18754
+ let bal = await this.contract.call("balance_of", [user.address], {
18755
+ blockIdentifier
18756
+ });
18708
18757
  return Web3Number.fromWei(bal.toString(), 18);
18709
18758
  }
18710
18759
  async getUserTVL(user, blockIdentifier = "pending") {
@@ -18852,11 +18901,16 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18852
18901
  return Number(result.salt.toString());
18853
18902
  }
18854
18903
  async truePrice() {
18855
- const result = await this.lstContract.call("convert_to_assets", [
18856
- import_starknet9.uint256.bnToUint256(BigInt(1e18).toString())
18857
- ]);
18858
- const truePrice = Number(BigInt(result.toString()) * BigInt(1e9) / BigInt(1e18)) / 1e9;
18859
- return truePrice;
18904
+ if (this.metadata.additionalInfo.truePrice) {
18905
+ return this.metadata.additionalInfo.truePrice;
18906
+ } else if (this.lstContract) {
18907
+ const result = await this.lstContract.call("convert_to_assets", [
18908
+ import_starknet9.uint256.bnToUint256(BigInt(1e18).toString())
18909
+ ]);
18910
+ const truePrice = Number(BigInt(result.toString()) * BigInt(1e9) / BigInt(1e18)) / 1e9;
18911
+ return truePrice;
18912
+ }
18913
+ throw new Error("No true price available");
18860
18914
  }
18861
18915
  async getCurrentPrice(blockIdentifier = "pending") {
18862
18916
  const poolKey = await this.getPoolKey(blockIdentifier);
@@ -19410,6 +19464,7 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
19410
19464
  const swap1Amount = Web3Number.fromWei(
19411
19465
  import_starknet9.uint256.uint256ToBN(swapInfo1.token_from_amount).toString(),
19412
19466
  18
19467
+ // cause its always STRK?
19413
19468
  );
19414
19469
  const remainingAmount = postFeeAmount.minus(swap1Amount);
19415
19470
  const swapInfo2 = {
@@ -19500,6 +19555,9 @@ var _riskFactor2 = [
19500
19555
  { type: "Smart Contract Risk" /* SMART_CONTRACT_RISK */, value: 0.5, weight: 25 },
19501
19556
  { type: "Impermanent Loss Risk" /* IMPERMANENT_LOSS */, value: 1, weight: 75 }
19502
19557
  ];
19558
+ var _riskFactorStable = [
19559
+ { type: "Smart Contract Risk" /* SMART_CONTRACT_RISK */, value: 0.5, weight: 25 }
19560
+ ];
19503
19561
  var AUDIT_URL2 = "https://assets.strkfarm.com/strkfarm/audit_report_vesu_and_ekubo_strats.pdf";
19504
19562
  var faqs2 = [
19505
19563
  {
@@ -19546,6 +19604,7 @@ var EkuboCLVaultStrategies = [
19546
19604
  address: ContractAddr.from(
19547
19605
  "0x01f083b98674bc21effee29ef443a00c7b9a500fd92cf30341a3da12c73f2324"
19548
19606
  ),
19607
+ launchBlock: 1209881,
19549
19608
  type: "Other",
19550
19609
  // must be same order as poolKey token0 and token1
19551
19610
  depositTokens: [
@@ -19578,6 +19637,53 @@ var EkuboCLVaultStrategies = [
19578
19637
  answer: "A negative APY can occur when xSTRK's price drops on DEXes. This is usually temporary and tends to recover within a few days or a week."
19579
19638
  }
19580
19639
  ]
19640
+ },
19641
+ {
19642
+ name: "Ekubo USDC/USDT",
19643
+ description: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
19644
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: _description2.replace("{{POOL_NAME}}", "USDC/USDT") }),
19645
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
19646
+ "ul",
19647
+ {
19648
+ style: {
19649
+ marginLeft: "20px",
19650
+ listStyle: "circle",
19651
+ fontSize: "12px"
19652
+ },
19653
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { style: { marginTop: "10px" }, children: "During withdrawal, you may receive either or both tokens depending on market conditions and prevailing prices." })
19654
+ }
19655
+ )
19656
+ ] }),
19657
+ address: ContractAddr.from(
19658
+ "0xd647ed735f0db52f2a5502b6e06ed21dc4284a43a36af4b60d3c80fbc56c91"
19659
+ ),
19660
+ launchBlock: 1385576,
19661
+ type: "Other",
19662
+ // must be same order as poolKey token0 and token1
19663
+ depositTokens: [
19664
+ Global.getDefaultTokens().find((t) => t.symbol === "USDC"),
19665
+ Global.getDefaultTokens().find((t) => t.symbol === "USDT")
19666
+ ],
19667
+ protocols: [_protocol2],
19668
+ auditUrl: AUDIT_URL2,
19669
+ maxTVL: Web3Number.fromWei("0", 6),
19670
+ risk: {
19671
+ riskFactor: _riskFactorStable,
19672
+ netRisk: _riskFactorStable.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactorStable.reduce((acc, curr) => acc + curr.weight, 0),
19673
+ notARisks: getNoRiskTags(_riskFactorStable)
19674
+ },
19675
+ apyMethodology: "APY based on 7-day historical performance, including fees and rewards.",
19676
+ additionalInfo: {
19677
+ newBounds: {
19678
+ lower: -1,
19679
+ upper: 1
19680
+ },
19681
+ truePrice: 1,
19682
+ feeBps: 1e3
19683
+ },
19684
+ faqs: [
19685
+ ...faqs2
19686
+ ]
19581
19687
  }
19582
19688
  ];
19583
19689
 
package/dist/index.mjs CHANGED
@@ -7,6 +7,43 @@ import axios from "axios";
7
7
  // src/dataTypes/bignumber.node.ts
8
8
  import util from "util";
9
9
 
10
+ // src/utils/logger.node.ts
11
+ import winston, { format } from "winston";
12
+ var colors = {
13
+ error: "red",
14
+ warn: "yellow",
15
+ info: "blue",
16
+ verbose: "white",
17
+ debug: "white"
18
+ };
19
+ winston.addColors(colors);
20
+ var logger = winston.createLogger({
21
+ level: "verbose",
22
+ // Set the minimum logging level
23
+ format: format.combine(
24
+ format.colorize({ all: true }),
25
+ // Apply custom colors
26
+ format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
27
+ // Add timestamp to log messages
28
+ format.printf(({ timestamp, level, message, ...meta }) => {
29
+ let msg = `${timestamp} ${level}: ${message}`;
30
+ if (meta && meta[Symbol.for("splat")]) {
31
+ for (const arg of meta[Symbol.for("splat")]) {
32
+ if (arg instanceof Error) {
33
+ msg += `
34
+ ${arg.stack}`;
35
+ }
36
+ }
37
+ }
38
+ return msg;
39
+ })
40
+ ),
41
+ transports: [
42
+ new winston.transports.Console()
43
+ // Output logs to the console
44
+ ]
45
+ });
46
+
10
47
  // src/dataTypes/_bignumber.ts
11
48
  import BigNumber from "bignumber.js";
12
49
  var _Web3Number = class extends BigNumber {
@@ -23,6 +60,7 @@ var _Web3Number = class extends BigNumber {
23
60
  }
24
61
  dividedBy(value) {
25
62
  const _value = this.getStandardString(value);
63
+ console.log("dividedBy", _value);
26
64
  return this.construct(this.div(_value).toString(), this.decimals);
27
65
  }
28
66
  plus(value) {
@@ -36,13 +74,15 @@ var _Web3Number = class extends BigNumber {
36
74
  construct(value, decimals) {
37
75
  return new this.constructor(value, decimals);
38
76
  }
39
- toString(decimals = this.maxToFixedDecimals()) {
40
- return super.toFixed(decimals);
77
+ toString() {
78
+ return super.toString();
41
79
  }
42
80
  toJSON() {
81
+ logger.verbose(`converting to json with decimals`);
43
82
  return this.toString();
44
83
  }
45
84
  valueOf() {
85
+ logger.verbose(`converting to valueOf with decimals`);
46
86
  return this.toString();
47
87
  }
48
88
  maxToFixedDecimals() {
@@ -107,12 +147,6 @@ var ContractAddr = class _ContractAddr {
107
147
  };
108
148
 
109
149
  // src/global.ts
110
- var logger = {
111
- ...console,
112
- verbose(message) {
113
- console.log(`[VERBOSE] ${message}`);
114
- }
115
- };
116
150
  var FatalError = class extends Error {
117
151
  constructor(message, err) {
118
152
  super(message);
@@ -706,7 +740,7 @@ var PricerFromApi = class extends PricerBase {
706
740
  } catch (e) {
707
741
  logger.warn("getPriceFromMyAPI error", JSON.stringify(e.message || e));
708
742
  }
709
- logger.log("getPrice coinbase", tokenSymbol);
743
+ logger.info("getPrice coinbase", tokenSymbol);
710
744
  let retry = 0;
711
745
  const MAX_RETRIES = 5;
712
746
  for (retry = 1; retry < MAX_RETRIES + 1; retry++) {
@@ -1887,6 +1921,11 @@ var ERC20 = class {
1887
1921
  const balance = await contract.call("balanceOf", [address.toString()]);
1888
1922
  return Web3Number.fromWei(balance.toString(), tokenDecimals);
1889
1923
  }
1924
+ async allowance(token, owner, spender, tokenDecimals) {
1925
+ const contract = this.contract(token);
1926
+ const allowance = await contract.call("allowance", [owner.toString(), spender.toString()]);
1927
+ return Web3Number.fromWei(allowance.toString(), tokenDecimals);
1928
+ }
1890
1929
  };
1891
1930
 
1892
1931
  // src/modules/avnu.ts
@@ -13415,6 +13454,7 @@ var VesuRebalanceStrategies = [
13415
13454
  address: ContractAddr.from(
13416
13455
  "0x7fb5bcb8525954a60fde4e8fb8220477696ce7117ef264775a1770e23571929"
13417
13456
  ),
13457
+ launchBlock: 0,
13418
13458
  type: "ERC4626",
13419
13459
  depositTokens: [
13420
13460
  Global.getDefaultTokens().find((t) => t.symbol === "STRK")
@@ -13438,6 +13478,7 @@ var VesuRebalanceStrategies = [
13438
13478
  address: ContractAddr.from(
13439
13479
  "0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"
13440
13480
  ),
13481
+ launchBlock: 0,
13441
13482
  type: "ERC4626",
13442
13483
  auditUrl: AUDIT_URL,
13443
13484
  depositTokens: [
@@ -13461,6 +13502,7 @@ var VesuRebalanceStrategies = [
13461
13502
  address: ContractAddr.from(
13462
13503
  "0xa858c97e9454f407d1bd7c57472fc8d8d8449a777c822b41d18e387816f29c"
13463
13504
  ),
13505
+ launchBlock: 0,
13464
13506
  type: "ERC4626",
13465
13507
  auditUrl: AUDIT_URL,
13466
13508
  depositTokens: [
@@ -13484,6 +13526,7 @@ var VesuRebalanceStrategies = [
13484
13526
  address: ContractAddr.from(
13485
13527
  "0x115e94e722cfc4c77a2f15c4aefb0928c1c0029e5a57570df24c650cb7cec2c"
13486
13528
  ),
13529
+ launchBlock: 0,
13487
13530
  type: "ERC4626",
13488
13531
  depositTokens: [
13489
13532
  Global.getDefaultTokens().find((t) => t.symbol === "USDT")
@@ -18450,11 +18493,15 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18450
18493
  this.address.address,
18451
18494
  this.config.provider
18452
18495
  );
18453
- this.lstContract = new Contract6(
18454
- erc4626_abi_default,
18455
- this.metadata.additionalInfo.lstContract.address,
18456
- this.config.provider
18457
- );
18496
+ if (this.metadata.additionalInfo.lstContract) {
18497
+ this.lstContract = new Contract6(
18498
+ erc4626_abi_default,
18499
+ this.metadata.additionalInfo.lstContract.address,
18500
+ this.config.provider
18501
+ );
18502
+ } else {
18503
+ this.lstContract = null;
18504
+ }
18458
18505
  const EKUBO_POSITION = "0x02e0af29598b407c8716b17f6d2795eca1b471413fa03fb145a5e33722184067";
18459
18506
  this.ekuboPositionsContract = new Contract6(
18460
18507
  ekubo_positions_abi_default,
@@ -18588,7 +18635,7 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18588
18635
  const priceNow = await this.getCurrentPrice(blockIdentifier);
18589
18636
  let blockNow = typeof blockIdentifier == "number" ? blockIdentifier : (await this.config.provider.getBlockLatestAccepted()).block_number;
18590
18637
  const blockNowTime = typeof blockIdentifier == "number" ? (await this.config.provider.getBlockWithTxs(blockIdentifier)).timestamp : (/* @__PURE__ */ new Date()).getTime() / 1e3;
18591
- const blockBefore = blockNow - sinceBlocks;
18638
+ const blockBefore = Math.max(blockNow - sinceBlocks, this.metadata.launchBlock);
18592
18639
  const adjustedSupplyNow = supplyNow.minus(
18593
18640
  await this.getHarvestRewardShares(blockBefore, blockNow)
18594
18641
  );
@@ -18599,9 +18646,9 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18599
18646
  const supplyBefore = await this.totalSupply(blockBefore);
18600
18647
  const priceBefore = await this.getCurrentPrice(blockBefore);
18601
18648
  const tvlInToken0Now = tvlNow.amount0.multipliedBy(priceNow.price).plus(tvlNow.amount1);
18602
- const tvlPerShareNow = tvlInToken0Now.multipliedBy(1e18).dividedBy(adjustedSupplyNow);
18649
+ const tvlPerShareNow = tvlInToken0Now.multipliedBy(1e18).dividedBy(adjustedSupplyNow.toString());
18603
18650
  const tvlInToken0Bf = tvlBefore.amount0.multipliedBy(priceBefore.price).plus(tvlBefore.amount1);
18604
- const tvlPerShareBf = tvlInToken0Bf.multipliedBy(1e18).dividedBy(supplyBefore);
18651
+ const tvlPerShareBf = tvlInToken0Bf.multipliedBy(1e18).dividedBy(supplyBefore.toString());
18605
18652
  const timeDiffSeconds = blockNowTime - blockBeforeInfo.timestamp;
18606
18653
  logger.verbose(`tvlInToken0Now: ${tvlInToken0Now.toString()}`);
18607
18654
  logger.verbose(`tvlInToken0Bf: ${tvlInToken0Bf.toString()}`);
@@ -18639,7 +18686,9 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18639
18686
  return shares;
18640
18687
  }
18641
18688
  async balanceOf(user, blockIdentifier = "pending") {
18642
- let bal = await this.contract.call("balance_of", [user.address]);
18689
+ let bal = await this.contract.call("balance_of", [user.address], {
18690
+ blockIdentifier
18691
+ });
18643
18692
  return Web3Number.fromWei(bal.toString(), 18);
18644
18693
  }
18645
18694
  async getUserTVL(user, blockIdentifier = "pending") {
@@ -18787,11 +18836,16 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
18787
18836
  return Number(result.salt.toString());
18788
18837
  }
18789
18838
  async truePrice() {
18790
- const result = await this.lstContract.call("convert_to_assets", [
18791
- uint2564.bnToUint256(BigInt(1e18).toString())
18792
- ]);
18793
- const truePrice = Number(BigInt(result.toString()) * BigInt(1e9) / BigInt(1e18)) / 1e9;
18794
- return truePrice;
18839
+ if (this.metadata.additionalInfo.truePrice) {
18840
+ return this.metadata.additionalInfo.truePrice;
18841
+ } else if (this.lstContract) {
18842
+ const result = await this.lstContract.call("convert_to_assets", [
18843
+ uint2564.bnToUint256(BigInt(1e18).toString())
18844
+ ]);
18845
+ const truePrice = Number(BigInt(result.toString()) * BigInt(1e9) / BigInt(1e18)) / 1e9;
18846
+ return truePrice;
18847
+ }
18848
+ throw new Error("No true price available");
18795
18849
  }
18796
18850
  async getCurrentPrice(blockIdentifier = "pending") {
18797
18851
  const poolKey = await this.getPoolKey(blockIdentifier);
@@ -19345,6 +19399,7 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
19345
19399
  const swap1Amount = Web3Number.fromWei(
19346
19400
  uint2564.uint256ToBN(swapInfo1.token_from_amount).toString(),
19347
19401
  18
19402
+ // cause its always STRK?
19348
19403
  );
19349
19404
  const remainingAmount = postFeeAmount.minus(swap1Amount);
19350
19405
  const swapInfo2 = {
@@ -19435,6 +19490,9 @@ var _riskFactor2 = [
19435
19490
  { type: "Smart Contract Risk" /* SMART_CONTRACT_RISK */, value: 0.5, weight: 25 },
19436
19491
  { type: "Impermanent Loss Risk" /* IMPERMANENT_LOSS */, value: 1, weight: 75 }
19437
19492
  ];
19493
+ var _riskFactorStable = [
19494
+ { type: "Smart Contract Risk" /* SMART_CONTRACT_RISK */, value: 0.5, weight: 25 }
19495
+ ];
19438
19496
  var AUDIT_URL2 = "https://assets.strkfarm.com/strkfarm/audit_report_vesu_and_ekubo_strats.pdf";
19439
19497
  var faqs2 = [
19440
19498
  {
@@ -19481,6 +19539,7 @@ var EkuboCLVaultStrategies = [
19481
19539
  address: ContractAddr.from(
19482
19540
  "0x01f083b98674bc21effee29ef443a00c7b9a500fd92cf30341a3da12c73f2324"
19483
19541
  ),
19542
+ launchBlock: 1209881,
19484
19543
  type: "Other",
19485
19544
  // must be same order as poolKey token0 and token1
19486
19545
  depositTokens: [
@@ -19513,6 +19572,53 @@ var EkuboCLVaultStrategies = [
19513
19572
  answer: "A negative APY can occur when xSTRK's price drops on DEXes. This is usually temporary and tends to recover within a few days or a week."
19514
19573
  }
19515
19574
  ]
19575
+ },
19576
+ {
19577
+ name: "Ekubo USDC/USDT",
19578
+ description: /* @__PURE__ */ jsxs2("div", { children: [
19579
+ /* @__PURE__ */ jsx2("p", { children: _description2.replace("{{POOL_NAME}}", "USDC/USDT") }),
19580
+ /* @__PURE__ */ jsx2(
19581
+ "ul",
19582
+ {
19583
+ style: {
19584
+ marginLeft: "20px",
19585
+ listStyle: "circle",
19586
+ fontSize: "12px"
19587
+ },
19588
+ children: /* @__PURE__ */ jsx2("li", { style: { marginTop: "10px" }, children: "During withdrawal, you may receive either or both tokens depending on market conditions and prevailing prices." })
19589
+ }
19590
+ )
19591
+ ] }),
19592
+ address: ContractAddr.from(
19593
+ "0xd647ed735f0db52f2a5502b6e06ed21dc4284a43a36af4b60d3c80fbc56c91"
19594
+ ),
19595
+ launchBlock: 1385576,
19596
+ type: "Other",
19597
+ // must be same order as poolKey token0 and token1
19598
+ depositTokens: [
19599
+ Global.getDefaultTokens().find((t) => t.symbol === "USDC"),
19600
+ Global.getDefaultTokens().find((t) => t.symbol === "USDT")
19601
+ ],
19602
+ protocols: [_protocol2],
19603
+ auditUrl: AUDIT_URL2,
19604
+ maxTVL: Web3Number.fromWei("0", 6),
19605
+ risk: {
19606
+ riskFactor: _riskFactorStable,
19607
+ netRisk: _riskFactorStable.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactorStable.reduce((acc, curr) => acc + curr.weight, 0),
19608
+ notARisks: getNoRiskTags(_riskFactorStable)
19609
+ },
19610
+ apyMethodology: "APY based on 7-day historical performance, including fees and rewards.",
19611
+ additionalInfo: {
19612
+ newBounds: {
19613
+ lower: -1,
19614
+ upper: 1
19615
+ },
19616
+ truePrice: 1,
19617
+ feeBps: 1e3
19618
+ },
19619
+ faqs: [
19620
+ ...faqs2
19621
+ ]
19516
19622
  }
19517
19623
  ];
19518
19624
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strkfarm/sdk",
3
- "version": "1.0.38",
3
+ "version": "1.0.39",
4
4
  "description": "STRKFarm TS SDK (Meant for our internal use, but feel free to use it)",
5
5
  "typings": "dist/index.d.ts",
6
6
  "types": "dist/index.d.ts",
@@ -51,7 +51,8 @@
51
51
  "typescript": "^5.5.3"
52
52
  },
53
53
  "peerDependencies": {
54
- "react": "19.1.0"
54
+ "react": "19.1.0",
55
+ "starknet": "^6.11.0"
55
56
  },
56
57
  "dependencies": {
57
58
  "@avnu/avnu-sdk": "^3.0.2",
@@ -67,7 +68,6 @@
67
68
  "proxy-from-env": "^1.1.0",
68
69
  "redis": "^4.7.0",
69
70
  "stacktrace-js": "^2.0.2",
70
- "starknet": "^6.11.0",
71
71
  "winston": "^3.13.0"
72
72
  }
73
73
  }