@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/cli.js +38 -712
- package/dist/cli.mjs +37 -715
- package/dist/index.browser.global.js +101 -25
- package/dist/index.browser.mjs +101 -25
- package/dist/index.d.ts +19 -50
- package/dist/index.js +129 -23
- package/dist/index.mjs +129 -23
- package/package.json +3 -3
- package/src/dataTypes/_bignumber.ts +49 -47
- package/src/global.ts +1 -33
- package/src/interfaces/common.ts +1 -0
- package/src/interfaces/lending.ts +1 -2
- package/src/modules/avnu.ts +1 -1
- package/src/modules/erc20.ts +6 -0
- package/src/modules/harvests.ts +1 -1
- package/src/modules/pragma.ts +1 -1
- package/src/modules/pricer-from-api.ts +3 -3
- package/src/modules/pricer.ts +2 -1
- package/src/modules/zkLend.ts +2 -1
- package/src/node/pricer-redis.ts +2 -1
- package/src/notifs/telegram.ts +1 -1
- package/src/strategies/ekubo-cl-vault.tsx +91 -19
- package/src/strategies/vesu-rebalance.tsx +6 -1
- package/src/utils/index.ts +2 -0
- package/src/utils/logger.browser.ts +20 -0
- package/src/utils/logger.node.ts +35 -0
- package/src/utils/logger.ts +1 -0
- package/src/utils/store.ts +1 -1
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(
|
|
109
|
-
return super.
|
|
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.
|
|
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
|
|
18519
|
-
|
|
18520
|
-
|
|
18521
|
-
|
|
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
|
-
|
|
18856
|
-
|
|
18857
|
-
|
|
18858
|
-
|
|
18859
|
-
|
|
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(
|
|
40
|
-
return super.
|
|
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.
|
|
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
|
|
18454
|
-
|
|
18455
|
-
|
|
18456
|
-
|
|
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
|
-
|
|
18791
|
-
|
|
18792
|
-
|
|
18793
|
-
|
|
18794
|
-
|
|
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.
|
|
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
|
}
|