@strkfarm/sdk 1.0.37 → 1.0.38
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 +236 -112
- package/dist/cli.mjs +241 -113
- package/dist/index.browser.global.js +869 -312
- package/dist/index.browser.mjs +870 -309
- package/dist/index.d.ts +9 -4
- package/dist/index.js +865 -308
- package/dist/index.mjs +870 -309
- package/package.json +1 -1
- package/src/interfaces/common.ts +111 -98
- package/src/strategies/ekubo-cl-vault.tsx +1434 -923
- package/src/strategies/vesu-rebalance.tsx +937 -610
package/dist/cli.js
CHANGED
|
@@ -508,7 +508,9 @@ var RiskType = /* @__PURE__ */ ((RiskType2) => {
|
|
|
508
508
|
})(RiskType || {});
|
|
509
509
|
var getNoRiskTags = (risks) => {
|
|
510
510
|
const noRisks1 = risks.filter((risk) => risk.value === 0).map((risk) => risk.type);
|
|
511
|
-
const noRisks2 = Object.values(RiskType).filter(
|
|
511
|
+
const noRisks2 = Object.values(RiskType).filter(
|
|
512
|
+
(risk) => !risks.map((risk2) => risk2.type).includes(risk)
|
|
513
|
+
);
|
|
512
514
|
const mergedUnique = [.../* @__PURE__ */ new Set([...noRisks1, ...noRisks2])];
|
|
513
515
|
return mergedUnique.map((risk) => `No ${risk}`);
|
|
514
516
|
};
|
|
@@ -526,141 +528,263 @@ var import_axios5 = __toESM(require("axios"));
|
|
|
526
528
|
var import_starknet7 = require("starknet");
|
|
527
529
|
|
|
528
530
|
// src/strategies/vesu-rebalance.tsx
|
|
531
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
529
532
|
var _description = "Automatically diversify {{TOKEN}} holdings into different Vesu pools while reducing risk and maximizing yield. Defi spring STRK Rewards are auto-compounded as well.";
|
|
530
|
-
var _protocol = {
|
|
533
|
+
var _protocol = {
|
|
534
|
+
name: "Vesu",
|
|
535
|
+
logo: "https://static-assets-8zct.onrender.com/integrations/vesu/logo.png"
|
|
536
|
+
};
|
|
531
537
|
var _riskFactor = [
|
|
532
538
|
{ type: "Smart Contract Risk" /* SMART_CONTRACT_RISK */, value: 0.5, weight: 25 },
|
|
533
539
|
{ type: "Counterparty Risk" /* COUNTERPARTY_RISK */, value: 1, weight: 50 },
|
|
534
540
|
{ type: "Oracle Risk" /* ORACLE_RISK */, value: 0.5, weight: 25 }
|
|
535
541
|
];
|
|
536
542
|
var AUDIT_URL = "https://assets.strkfarm.com/strkfarm/audit_report_vesu_and_ekubo_strats.pdf";
|
|
537
|
-
var
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
type: "ERC4626",
|
|
542
|
-
depositTokens: [Global.getDefaultTokens().find((t) => t.symbol === "STRK")],
|
|
543
|
-
protocols: [_protocol],
|
|
544
|
-
auditUrl: AUDIT_URL,
|
|
545
|
-
maxTVL: Web3Number.fromWei("0", 18),
|
|
546
|
-
risk: {
|
|
547
|
-
riskFactor: _riskFactor,
|
|
548
|
-
netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
549
|
-
notARisks: getNoRiskTags(_riskFactor)
|
|
543
|
+
var faqs = [
|
|
544
|
+
{
|
|
545
|
+
question: "What is the Vesu Rebalancing Strategy?",
|
|
546
|
+
answer: "The Vesu Rebalancing Strategy is an automated investment strategy that diversifies your holdings across multiple Vesu pools. It optimizes yield by rebalancing assets based on pool performance while adhering to risk constraints."
|
|
550
547
|
},
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
}, {
|
|
555
|
-
name: "Vesu Fusion ETH",
|
|
556
|
-
description: _description.replace("{{TOKEN}}", "ETH"),
|
|
557
|
-
address: ContractAddr.from("0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"),
|
|
558
|
-
type: "ERC4626",
|
|
559
|
-
auditUrl: AUDIT_URL,
|
|
560
|
-
depositTokens: [Global.getDefaultTokens().find((t) => t.symbol === "ETH")],
|
|
561
|
-
protocols: [_protocol],
|
|
562
|
-
maxTVL: Web3Number.fromWei("0", 18),
|
|
563
|
-
risk: {
|
|
564
|
-
riskFactor: _riskFactor,
|
|
565
|
-
netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
566
|
-
notARisks: getNoRiskTags(_riskFactor)
|
|
548
|
+
{
|
|
549
|
+
question: "Will I earn Vesu points?",
|
|
550
|
+
answer: "Yes, of course! You will earn Vesu points for your deposits."
|
|
567
551
|
},
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
},
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
552
|
+
{
|
|
553
|
+
question: "How does the strategy optimize yield?",
|
|
554
|
+
answer: "The strategy calculates the weighted average APY across all pools and reallocates assets to maximize returns. It prioritizes high-performing pools while ensuring compliance with maximum weight constraints."
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
question: "What are the risks associated with this strategy?",
|
|
558
|
+
answer: "The strategy involves usual DeFi risks such as smart contract vulnerabilities, counterparty risks, and oracle inaccuracies. However, we try our best to reduce these risks through audits and careful pool selection."
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
question: "How are fees calculated and deducted?",
|
|
562
|
+
answer: "Fees are calculated based on the performance of the strategy and deducted proportionally from the total assets. We charge a 10% performance fee and is already accounted in the APY shown."
|
|
563
|
+
},
|
|
564
|
+
{
|
|
565
|
+
question: "What happens if a pool exceeds its maximum weight?",
|
|
566
|
+
answer: "If a pool exceeds its maximum weight, the strategy rebalances by withdrawing excess funds and reallocating them to other pools with available capacity."
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
question: "Can I withdraw my assets at any time?",
|
|
570
|
+
answer: "Yes, you can withdraw your assets at any time. In rare circumstances, if debt utilisation is high for certain pools on Vesu, it may not be possible to withdraw until markets restore balance."
|
|
584
571
|
},
|
|
585
|
-
|
|
586
|
-
|
|
572
|
+
{
|
|
573
|
+
question: "What happens to my Defi Spring STRK rewards?",
|
|
574
|
+
answer: "STRK rewards are automatically harvested and reinvested into the strategy every week to maximize compounding returns."
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
question: "Is the strategy audited?",
|
|
578
|
+
answer: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
579
|
+
"Yes, the strategy has been audited. You can review the audit report in our docs ",
|
|
580
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: "https://docs.strkfarm.com/p/strategies/vesu-fusion-rebalancing-vaults#technical-details", style: { textDecoration: "underline", marginLeft: "5px" }, children: "Here" }),
|
|
581
|
+
"."
|
|
582
|
+
] })
|
|
587
583
|
}
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
584
|
+
];
|
|
585
|
+
var VesuRebalanceStrategies = [
|
|
586
|
+
{
|
|
587
|
+
name: "Vesu Fusion STRK",
|
|
588
|
+
description: _description.replace("{{TOKEN}}", "STRK"),
|
|
589
|
+
address: ContractAddr.from(
|
|
590
|
+
"0x7fb5bcb8525954a60fde4e8fb8220477696ce7117ef264775a1770e23571929"
|
|
591
|
+
),
|
|
592
|
+
type: "ERC4626",
|
|
593
|
+
depositTokens: [
|
|
594
|
+
Global.getDefaultTokens().find((t) => t.symbol === "STRK")
|
|
595
|
+
],
|
|
596
|
+
protocols: [_protocol],
|
|
597
|
+
auditUrl: AUDIT_URL,
|
|
598
|
+
maxTVL: Web3Number.fromWei("0", 18),
|
|
599
|
+
risk: {
|
|
600
|
+
riskFactor: _riskFactor,
|
|
601
|
+
netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
602
|
+
notARisks: getNoRiskTags(_riskFactor)
|
|
603
|
+
},
|
|
604
|
+
additionalInfo: {
|
|
605
|
+
feeBps: 1e3
|
|
606
|
+
},
|
|
607
|
+
faqs
|
|
601
608
|
},
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
609
|
+
{
|
|
610
|
+
name: "Vesu Fusion ETH",
|
|
611
|
+
description: _description.replace("{{TOKEN}}", "ETH"),
|
|
612
|
+
address: ContractAddr.from(
|
|
613
|
+
"0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"
|
|
614
|
+
),
|
|
615
|
+
type: "ERC4626",
|
|
616
|
+
auditUrl: AUDIT_URL,
|
|
617
|
+
depositTokens: [
|
|
618
|
+
Global.getDefaultTokens().find((t) => t.symbol === "ETH")
|
|
619
|
+
],
|
|
620
|
+
protocols: [_protocol],
|
|
621
|
+
maxTVL: Web3Number.fromWei("0", 18),
|
|
622
|
+
risk: {
|
|
623
|
+
riskFactor: _riskFactor,
|
|
624
|
+
netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
625
|
+
notARisks: getNoRiskTags(_riskFactor)
|
|
626
|
+
},
|
|
627
|
+
additionalInfo: {
|
|
628
|
+
feeBps: 1e3
|
|
629
|
+
},
|
|
630
|
+
faqs
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
name: "Vesu Fusion USDC",
|
|
634
|
+
description: _description.replace("{{TOKEN}}", "USDC"),
|
|
635
|
+
address: ContractAddr.from(
|
|
636
|
+
"0xa858c97e9454f407d1bd7c57472fc8d8d8449a777c822b41d18e387816f29c"
|
|
637
|
+
),
|
|
638
|
+
type: "ERC4626",
|
|
639
|
+
auditUrl: AUDIT_URL,
|
|
640
|
+
depositTokens: [
|
|
641
|
+
Global.getDefaultTokens().find((t) => t.symbol === "USDC")
|
|
642
|
+
],
|
|
643
|
+
protocols: [_protocol],
|
|
644
|
+
maxTVL: Web3Number.fromWei("0", 6),
|
|
645
|
+
risk: {
|
|
646
|
+
riskFactor: _riskFactor,
|
|
647
|
+
netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
648
|
+
notARisks: getNoRiskTags(_riskFactor)
|
|
649
|
+
},
|
|
650
|
+
additionalInfo: {
|
|
651
|
+
feeBps: 1e3
|
|
652
|
+
},
|
|
653
|
+
faqs
|
|
654
|
+
},
|
|
655
|
+
{
|
|
656
|
+
name: "Vesu Fusion USDT",
|
|
657
|
+
description: _description.replace("{{TOKEN}}", "USDT"),
|
|
658
|
+
address: ContractAddr.from(
|
|
659
|
+
"0x115e94e722cfc4c77a2f15c4aefb0928c1c0029e5a57570df24c650cb7cec2c"
|
|
660
|
+
),
|
|
661
|
+
type: "ERC4626",
|
|
662
|
+
depositTokens: [
|
|
663
|
+
Global.getDefaultTokens().find((t) => t.symbol === "USDT")
|
|
664
|
+
],
|
|
665
|
+
auditUrl: AUDIT_URL,
|
|
666
|
+
protocols: [_protocol],
|
|
667
|
+
maxTVL: Web3Number.fromWei("0", 6),
|
|
668
|
+
risk: {
|
|
669
|
+
riskFactor: _riskFactor,
|
|
670
|
+
netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
671
|
+
notARisks: getNoRiskTags(_riskFactor)
|
|
672
|
+
},
|
|
673
|
+
additionalInfo: {
|
|
674
|
+
feeBps: 1e3
|
|
675
|
+
},
|
|
676
|
+
faqs
|
|
677
|
+
// }, {
|
|
678
|
+
// name: 'Vesu Fusion WBTC',
|
|
679
|
+
// description: _description.replace('{{TOKEN}}', 'WBTC'),
|
|
680
|
+
// address: ContractAddr.from('0x778007f8136a5b827325d21613803e796bda4d676fbe1e34aeab0b2a2ec027f'),
|
|
681
|
+
// type: 'ERC4626',
|
|
682
|
+
// depositTokens: [Global.getDefaultTokens().find(t => t.symbol === 'WBTC')!],
|
|
683
|
+
// auditUrl: AUDIT_URL,
|
|
684
|
+
// protocols: [_protocol],
|
|
685
|
+
// maxTVL: Web3Number.fromWei('0', 8),
|
|
686
|
+
// risk: {
|
|
687
|
+
// riskFactor: _riskFactor,
|
|
688
|
+
// netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
689
|
+
// },
|
|
690
|
+
// additionalInfo: {
|
|
691
|
+
// feeBps: 1000,
|
|
692
|
+
// },
|
|
693
|
+
}
|
|
694
|
+
];
|
|
622
695
|
|
|
623
696
|
// src/strategies/ekubo-cl-vault.tsx
|
|
624
697
|
var import_starknet9 = require("starknet");
|
|
625
|
-
var
|
|
698
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
626
699
|
var _description2 = "Deploys your {{POOL_NAME}} into an Ekubo liquidity pool, automatically rebalancing positions around the current price to optimize yield and reduce the need for manual adjustments. Trading fees and DeFi Spring rewards are automatically compounded back into the strategy. In return, you receive an ERC-20 token representing your share of the strategy. The APY is calculated based on 7-day historical performance.";
|
|
627
|
-
var _protocol2 = {
|
|
700
|
+
var _protocol2 = {
|
|
701
|
+
name: "Ekubo",
|
|
702
|
+
logo: "https://app.ekubo.org/favicon.ico"
|
|
703
|
+
};
|
|
628
704
|
var _riskFactor2 = [
|
|
629
705
|
{ type: "Smart Contract Risk" /* SMART_CONTRACT_RISK */, value: 0.5, weight: 25 },
|
|
630
706
|
{ type: "Impermanent Loss Risk" /* IMPERMANENT_LOSS */, value: 1, weight: 75 }
|
|
631
707
|
];
|
|
632
708
|
var AUDIT_URL2 = "https://assets.strkfarm.com/strkfarm/audit_report_vesu_and_ekubo_strats.pdf";
|
|
633
|
-
var
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ul", { style: { marginLeft: "20px", listStyle: "circle", fontSize: "12px" }, children: [
|
|
638
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { style: { marginTop: "10px" }, children: "During withdrawal, you may receive either or both tokens depending on market conditions and prevailing prices." }),
|
|
639
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { style: { marginTop: "10px" }, children: "Sometimes you might see a negative APY \u2014 this is usually not a big deal. It happens when xSTRK's price drops on DEXes, but things typically bounce back within a few days or a week." })
|
|
640
|
-
] })
|
|
641
|
-
] }),
|
|
642
|
-
address: ContractAddr.from("0x01f083b98674bc21effee29ef443a00c7b9a500fd92cf30341a3da12c73f2324"),
|
|
643
|
-
type: "Other",
|
|
644
|
-
// must be same order as poolKey token0 and token1
|
|
645
|
-
depositTokens: [Global.getDefaultTokens().find((t) => t.symbol === "xSTRK"), Global.getDefaultTokens().find((t) => t.symbol === "STRK")],
|
|
646
|
-
protocols: [_protocol2],
|
|
647
|
-
auditUrl: AUDIT_URL2,
|
|
648
|
-
maxTVL: Web3Number.fromWei("0", 18),
|
|
649
|
-
risk: {
|
|
650
|
-
riskFactor: _riskFactor2,
|
|
651
|
-
netRisk: _riskFactor2.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor2.reduce((acc, curr) => acc + curr.weight, 0),
|
|
652
|
-
notARisks: getNoRiskTags(_riskFactor2)
|
|
709
|
+
var faqs2 = [
|
|
710
|
+
{
|
|
711
|
+
question: "What is the Ekubo CL Vault strategy?",
|
|
712
|
+
answer: "The Ekubo CL Vault strategy deploys your assets into an Ekubo liquidity pool, automatically rebalancing positions around the current price to optimize yield and reduce manual adjustments."
|
|
653
713
|
},
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
714
|
+
{
|
|
715
|
+
question: "How are trading fees and rewards handled?",
|
|
716
|
+
answer: "Trading fees and DeFi Spring rewards are automatically compounded back into the strategy, increasing your overall returns."
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
question: "What happens during withdrawal?",
|
|
720
|
+
answer: "During withdrawal, you may receive either or both tokens depending on market conditions and prevailing prices."
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
question: "Is the strategy audited?",
|
|
724
|
+
answer: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
725
|
+
"Yes, the strategy has been audited. You can review the audit report in our docs ",
|
|
726
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("a", { href: "https://docs.strkfarm.com/p/ekubo-cl-vaults#technical-details", style: { textDecoration: "underline", marginLeft: "5px" }, children: "Here" }),
|
|
727
|
+
"."
|
|
728
|
+
] })
|
|
729
|
+
}
|
|
730
|
+
];
|
|
731
|
+
var EkuboCLVaultStrategies = [
|
|
732
|
+
{
|
|
733
|
+
name: "Ekubo xSTRK/STRK",
|
|
734
|
+
description: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
735
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: _description2.replace("{{POOL_NAME}}", "xSTRK/STRK") }),
|
|
736
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
737
|
+
"ul",
|
|
738
|
+
{
|
|
739
|
+
style: {
|
|
740
|
+
marginLeft: "20px",
|
|
741
|
+
listStyle: "circle",
|
|
742
|
+
fontSize: "12px"
|
|
743
|
+
},
|
|
744
|
+
children: [
|
|
745
|
+
/* @__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." }),
|
|
746
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { style: { marginTop: "10px" }, children: "Sometimes you might see a negative APY \u2014 this is usually not a big deal. It happens when xSTRK's price drops on DEXes, but things typically bounce back within a few days or a week." })
|
|
747
|
+
]
|
|
748
|
+
}
|
|
749
|
+
)
|
|
750
|
+
] }),
|
|
751
|
+
address: ContractAddr.from(
|
|
752
|
+
"0x01f083b98674bc21effee29ef443a00c7b9a500fd92cf30341a3da12c73f2324"
|
|
753
|
+
),
|
|
754
|
+
type: "Other",
|
|
755
|
+
// must be same order as poolKey token0 and token1
|
|
756
|
+
depositTokens: [
|
|
757
|
+
Global.getDefaultTokens().find((t) => t.symbol === "xSTRK"),
|
|
758
|
+
Global.getDefaultTokens().find((t) => t.symbol === "STRK")
|
|
759
|
+
],
|
|
760
|
+
protocols: [_protocol2],
|
|
761
|
+
auditUrl: AUDIT_URL2,
|
|
762
|
+
maxTVL: Web3Number.fromWei("0", 18),
|
|
763
|
+
risk: {
|
|
764
|
+
riskFactor: _riskFactor2,
|
|
765
|
+
netRisk: _riskFactor2.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor2.reduce((acc, curr) => acc + curr.weight, 0),
|
|
766
|
+
notARisks: getNoRiskTags(_riskFactor2)
|
|
767
|
+
},
|
|
768
|
+
apyMethodology: "APY based on 7-day historical performance, including fees and rewards.",
|
|
769
|
+
additionalInfo: {
|
|
770
|
+
newBounds: {
|
|
771
|
+
lower: -1,
|
|
772
|
+
upper: 1
|
|
773
|
+
},
|
|
774
|
+
lstContract: ContractAddr.from(
|
|
775
|
+
"0x028d709c875c0ceac3dce7065bec5328186dc89fe254527084d1689910954b0a"
|
|
776
|
+
),
|
|
777
|
+
feeBps: 1e3
|
|
659
778
|
},
|
|
660
|
-
|
|
661
|
-
|
|
779
|
+
faqs: [
|
|
780
|
+
...faqs2,
|
|
781
|
+
{
|
|
782
|
+
question: "Why might I see a negative APY?",
|
|
783
|
+
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."
|
|
784
|
+
}
|
|
785
|
+
]
|
|
662
786
|
}
|
|
663
|
-
|
|
787
|
+
];
|
|
664
788
|
|
|
665
789
|
// src/notifs/telegram.ts
|
|
666
790
|
var import_node_telegram_bot_api = __toESM(require("node-telegram-bot-api"));
|