@strkfarm/sdk 2.0.0-dev.42 → 2.0.0-dev.44
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 +2 -2
- package/dist/cli.mjs +2 -2
- package/dist/index.browser.global.js +26409 -25535
- package/dist/index.browser.mjs +859 -581
- package/dist/index.d.ts +52 -8
- package/dist/index.js +894 -613
- package/dist/index.mjs +864 -584
- package/package.json +72 -14
- package/src/global.ts +219 -230
- package/src/interfaces/common.tsx +12 -3
- package/src/modules/ekubo-pricer.ts +2 -1
- package/src/modules/pricer.ts +27 -15
- package/src/modules/zkLend.ts +3 -2
- package/src/strategies/ekubo-cl-vault.tsx +0 -5
- package/src/strategies/svk-strategy.ts +7 -0
- package/src/strategies/token-boosted-xstrk-carry-strategy.tsx +0 -1
- package/src/strategies/universal-lst-muliplier-strategy.tsx +294 -39
- package/src/strategies/universal-strategy.tsx +0 -1
- package/src/strategies/yoloVault.ts +2 -0
package/dist/index.js
CHANGED
|
@@ -102,6 +102,7 @@ __export(index_exports, {
|
|
|
102
102
|
TRANSFER_SANITIZER: () => TRANSFER_SANITIZER,
|
|
103
103
|
TelegramGroupNotif: () => TelegramGroupNotif,
|
|
104
104
|
TelegramNotif: () => TelegramNotif,
|
|
105
|
+
TokenIndexingType: () => TokenIndexingType,
|
|
105
106
|
TokenMarketData: () => TokenMarketData,
|
|
106
107
|
TokenTransferAdapter: () => TokenTransferAdapter,
|
|
107
108
|
UNIVERSAL_ADAPTER_IDS: () => UNIVERSAL_ADAPTER_IDS,
|
|
@@ -273,7 +274,7 @@ var Web3Number = class _Web3Number2 extends _Web3Number {
|
|
|
273
274
|
[import_util.default.inspect.custom](depth, opts) {
|
|
274
275
|
return this.toString();
|
|
275
276
|
}
|
|
276
|
-
[
|
|
277
|
+
[Symbol.for("nodejs.util.inspect.custom")](depth, inspectOptions, inspect) {
|
|
277
278
|
return this.toString();
|
|
278
279
|
}
|
|
279
280
|
inspect(depth, opts) {
|
|
@@ -324,7 +325,7 @@ var ContractAddr = class _ContractAddr {
|
|
|
324
325
|
// src/dataTypes/mynumber.ts
|
|
325
326
|
var import_bignumber3 = __toESM(require("bignumber.js"));
|
|
326
327
|
var import_ethers = require("ethers");
|
|
327
|
-
var customInspectSymbol =
|
|
328
|
+
var customInspectSymbol = Symbol.for("nodejs.util.inspect.custom");
|
|
328
329
|
import_bignumber3.default.config({
|
|
329
330
|
DECIMAL_PLACES: 18
|
|
330
331
|
});
|
|
@@ -333,16 +334,16 @@ var MyNumber = class _MyNumber {
|
|
|
333
334
|
this.bigNumber = new import_bignumber3.default(bigNumber);
|
|
334
335
|
this.decimals = decimals;
|
|
335
336
|
}
|
|
336
|
-
static fromEther(
|
|
337
|
+
static fromEther(num17, decimals) {
|
|
337
338
|
try {
|
|
338
339
|
return new _MyNumber(
|
|
339
340
|
Number(
|
|
340
|
-
import_ethers.ethers.parseUnits(Number(
|
|
341
|
+
import_ethers.ethers.parseUnits(Number(num17).toFixed(10), decimals)
|
|
341
342
|
).toFixed(6),
|
|
342
343
|
decimals
|
|
343
344
|
);
|
|
344
345
|
} catch (e) {
|
|
345
|
-
console.error("fromEther", e,
|
|
346
|
+
console.error("fromEther", e, num17, decimals);
|
|
346
347
|
throw e;
|
|
347
348
|
}
|
|
348
349
|
}
|
|
@@ -542,7 +543,7 @@ var getStackFromMeta = (stack, meta) => {
|
|
|
542
543
|
if (typeof stack === "string" && stack.length > 0) {
|
|
543
544
|
return stack;
|
|
544
545
|
}
|
|
545
|
-
const splat = meta[
|
|
546
|
+
const splat = meta[Symbol.for("splat")];
|
|
546
547
|
if (Array.isArray(splat)) {
|
|
547
548
|
for (const item of splat) {
|
|
548
549
|
if (item instanceof Error && item.stack) {
|
|
@@ -616,7 +617,7 @@ function configureLogger(config = {}) {
|
|
|
616
617
|
out += ` stack="${escapeValue(stripAnsi(derivedStack))}"`;
|
|
617
618
|
}
|
|
618
619
|
const metaCopy = { ...meta };
|
|
619
|
-
delete metaCopy[
|
|
620
|
+
delete metaCopy[Symbol.for("splat")];
|
|
620
621
|
if (Object.keys(metaCopy).length > 0) {
|
|
621
622
|
out += ` meta=${escapeValue(stringifyUnknown(metaCopy))}`;
|
|
622
623
|
}
|
|
@@ -635,283 +636,510 @@ function configureLogger(config = {}) {
|
|
|
635
636
|
}
|
|
636
637
|
configureLogger();
|
|
637
638
|
|
|
639
|
+
// src/interfaces/lending.ts
|
|
640
|
+
var MarginType = /* @__PURE__ */ ((MarginType2) => {
|
|
641
|
+
MarginType2["SHARED"] = "shared";
|
|
642
|
+
MarginType2["NONE"] = "none";
|
|
643
|
+
return MarginType2;
|
|
644
|
+
})(MarginType || {});
|
|
645
|
+
var ILending = class {
|
|
646
|
+
constructor(config, metadata) {
|
|
647
|
+
this.tokens = [];
|
|
648
|
+
this.initialised = false;
|
|
649
|
+
this.metadata = metadata;
|
|
650
|
+
this.config = config;
|
|
651
|
+
this.init();
|
|
652
|
+
}
|
|
653
|
+
/** Wait for initialisation */
|
|
654
|
+
waitForInitilisation() {
|
|
655
|
+
return new Promise((resolve, reject) => {
|
|
656
|
+
const interval = setInterval(() => {
|
|
657
|
+
logger.verbose(`Waiting for ${this.metadata.name} to initialise`);
|
|
658
|
+
if (this.initialised) {
|
|
659
|
+
logger.verbose(`${this.metadata.name} initialised`);
|
|
660
|
+
clearInterval(interval);
|
|
661
|
+
resolve();
|
|
662
|
+
}
|
|
663
|
+
}, 1e3);
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
// src/interfaces/common.tsx
|
|
669
|
+
var import_starknet4 = require("starknet");
|
|
670
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
671
|
+
var RiskType = /* @__PURE__ */ ((RiskType2) => {
|
|
672
|
+
RiskType2["MARKET_RISK"] = "Market Risk";
|
|
673
|
+
RiskType2["IMPERMANENT_LOSS"] = "Impermanent Loss Risk";
|
|
674
|
+
RiskType2["LIQUIDATION_RISK"] = "Liquidation Risk";
|
|
675
|
+
RiskType2["LOW_LIQUIDITY_RISK"] = "Low Liquidity Risk";
|
|
676
|
+
RiskType2["SMART_CONTRACT_RISK"] = "Smart Contract Risk";
|
|
677
|
+
RiskType2["ORACLE_RISK"] = "Oracle Risk";
|
|
678
|
+
RiskType2["TECHNICAL_RISK"] = "Technical Risk";
|
|
679
|
+
RiskType2["COUNTERPARTY_RISK"] = "Counterparty Risk";
|
|
680
|
+
RiskType2["DEPEG_RISK"] = "Depeg Risk";
|
|
681
|
+
return RiskType2;
|
|
682
|
+
})(RiskType || {});
|
|
683
|
+
var TokenIndexingType = /* @__PURE__ */ ((TokenIndexingType2) => {
|
|
684
|
+
TokenIndexingType2["PEGGED"] = "pegged";
|
|
685
|
+
TokenIndexingType2["INDEXER"] = "indexer";
|
|
686
|
+
TokenIndexingType2["LST_SCRIPT"] = "lstScript";
|
|
687
|
+
TokenIndexingType2["IGNORE"] = "ignore";
|
|
688
|
+
return TokenIndexingType2;
|
|
689
|
+
})(TokenIndexingType || {});
|
|
690
|
+
var Network = /* @__PURE__ */ ((Network2) => {
|
|
691
|
+
Network2["mainnet"] = "mainnet";
|
|
692
|
+
Network2["sepolia"] = "sepolia";
|
|
693
|
+
Network2["devnet"] = "devnet";
|
|
694
|
+
return Network2;
|
|
695
|
+
})(Network || {});
|
|
696
|
+
var StrategyTag = /* @__PURE__ */ ((StrategyTag3) => {
|
|
697
|
+
StrategyTag3["META_VAULT"] = "Meta Vaults";
|
|
698
|
+
StrategyTag3["LEVERED"] = "Maxx";
|
|
699
|
+
StrategyTag3["AUTOMATED_LP"] = "Ekubo";
|
|
700
|
+
StrategyTag3["BTC"] = "BTC";
|
|
701
|
+
return StrategyTag3;
|
|
702
|
+
})(StrategyTag || {});
|
|
703
|
+
var VaultType = /* @__PURE__ */ ((VaultType2) => {
|
|
704
|
+
VaultType2["LOOPING"] = "Looping";
|
|
705
|
+
VaultType2["META_VAULT"] = "Meta Vault";
|
|
706
|
+
VaultType2["DELTA_NEUTRAL"] = "Delta Neutral";
|
|
707
|
+
VaultType2["AUTOMATED_LP"] = "Automated LP";
|
|
708
|
+
VaultType2["TVA"] = "Troves Value Averaging";
|
|
709
|
+
return VaultType2;
|
|
710
|
+
})(VaultType || {});
|
|
711
|
+
var AuditStatus = /* @__PURE__ */ ((AuditStatus2) => {
|
|
712
|
+
AuditStatus2["AUDITED"] = "Audited";
|
|
713
|
+
AuditStatus2["NOT_AUDITED"] = "Not Audited";
|
|
714
|
+
return AuditStatus2;
|
|
715
|
+
})(AuditStatus || {});
|
|
716
|
+
var SourceCodeType = /* @__PURE__ */ ((SourceCodeType2) => {
|
|
717
|
+
SourceCodeType2["OPEN_SOURCE"] = "Open Source";
|
|
718
|
+
SourceCodeType2["CLOSED_SOURCE"] = "Closed Source";
|
|
719
|
+
return SourceCodeType2;
|
|
720
|
+
})(SourceCodeType || {});
|
|
721
|
+
var AccessControlType = /* @__PURE__ */ ((AccessControlType2) => {
|
|
722
|
+
AccessControlType2["MULTISIG_ACCOUNT"] = "Multisig Account";
|
|
723
|
+
AccessControlType2["STANDARD_ACCOUNT"] = "Standard Account";
|
|
724
|
+
AccessControlType2["ROLE_BASED_ACCESS"] = "Role Based Access";
|
|
725
|
+
return AccessControlType2;
|
|
726
|
+
})(AccessControlType || {});
|
|
727
|
+
var InstantWithdrawalVault = /* @__PURE__ */ ((InstantWithdrawalVault2) => {
|
|
728
|
+
InstantWithdrawalVault2["YES"] = "Yes";
|
|
729
|
+
InstantWithdrawalVault2["NO"] = "No";
|
|
730
|
+
return InstantWithdrawalVault2;
|
|
731
|
+
})(InstantWithdrawalVault || {});
|
|
732
|
+
var FlowChartColors = /* @__PURE__ */ ((FlowChartColors2) => {
|
|
733
|
+
FlowChartColors2["Green"] = "purple";
|
|
734
|
+
FlowChartColors2["Blue"] = "#35484f";
|
|
735
|
+
FlowChartColors2["Purple"] = "#6e53dc";
|
|
736
|
+
return FlowChartColors2;
|
|
737
|
+
})(FlowChartColors || {});
|
|
738
|
+
var StrategyLiveStatus = /* @__PURE__ */ ((StrategyLiveStatus2) => {
|
|
739
|
+
StrategyLiveStatus2["ACTIVE"] = "Active";
|
|
740
|
+
StrategyLiveStatus2["NEW"] = "New";
|
|
741
|
+
StrategyLiveStatus2["COMING_SOON"] = "Coming Soon";
|
|
742
|
+
StrategyLiveStatus2["DEPRECATED"] = "Deprecated";
|
|
743
|
+
StrategyLiveStatus2["RETIRED"] = "Retired";
|
|
744
|
+
StrategyLiveStatus2["HOT"] = "Hot & New \u{1F525}";
|
|
745
|
+
return StrategyLiveStatus2;
|
|
746
|
+
})(StrategyLiveStatus || {});
|
|
747
|
+
function getMainnetConfig(rpcUrl = "https://starknet-mainnet.public.blastapi.io", blockIdentifier = import_starknet4.BlockTag.LATEST) {
|
|
748
|
+
return {
|
|
749
|
+
provider: new import_starknet4.RpcProvider({
|
|
750
|
+
nodeUrl: rpcUrl,
|
|
751
|
+
blockIdentifier
|
|
752
|
+
// specVersion
|
|
753
|
+
}),
|
|
754
|
+
stage: "production",
|
|
755
|
+
network: "mainnet" /* mainnet */
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
var getStrategyTagDesciption = (tag) => {
|
|
759
|
+
switch (tag) {
|
|
760
|
+
case "Meta Vaults" /* META_VAULT */:
|
|
761
|
+
return "A meta vault is a vault that auto allocates funds to multiple vaults based on optimal yield opportunities";
|
|
762
|
+
case "Maxx" /* LEVERED */:
|
|
763
|
+
return "Looping vaults on Endur LSTs with leveraged borrowing of STRK or BTC to increase yield (2-4x higher yield than simply staking)";
|
|
764
|
+
case "Ekubo" /* AUTOMATED_LP */:
|
|
765
|
+
return "Automated LP vaults on Ekubo that rebalance position automatically, ensuring you earn fees efficiently";
|
|
766
|
+
case "BTC" /* BTC */:
|
|
767
|
+
return "BTC linked vaults";
|
|
768
|
+
}
|
|
769
|
+
};
|
|
770
|
+
var getAllStrategyTags = () => {
|
|
771
|
+
return Object.values(StrategyTag);
|
|
772
|
+
};
|
|
773
|
+
var getRiskExplaination = (riskType) => {
|
|
774
|
+
switch (riskType) {
|
|
775
|
+
case "Market Risk" /* MARKET_RISK */:
|
|
776
|
+
return "The risk of the market moving against the position.";
|
|
777
|
+
case "Impermanent Loss Risk" /* IMPERMANENT_LOSS */:
|
|
778
|
+
return "The temporary loss of value experienced by liquidity providers in AMMs when asset prices diverge compared to simply holding them.";
|
|
779
|
+
case "Liquidation Risk" /* LIQUIDATION_RISK */:
|
|
780
|
+
return "The risk of losing funds due to the position being liquidated.";
|
|
781
|
+
case "Low Liquidity Risk" /* LOW_LIQUIDITY_RISK */:
|
|
782
|
+
return "The risk of low liquidity in the pool, which can lead to high slippages or reduced in-abilities to quickly exit the position.";
|
|
783
|
+
case "Oracle Risk" /* ORACLE_RISK */:
|
|
784
|
+
return "The risk of the oracle being manipulated or incorrect.";
|
|
785
|
+
case "Smart Contract Risk" /* SMART_CONTRACT_RISK */:
|
|
786
|
+
return "The risk of the smart contract being vulnerable to attacks.";
|
|
787
|
+
case "Technical Risk" /* TECHNICAL_RISK */:
|
|
788
|
+
return "The risk of technical issues e.g. backend failure.";
|
|
789
|
+
case "Counterparty Risk" /* COUNTERPARTY_RISK */:
|
|
790
|
+
return "The risk of the counterparty defaulting e.g. bad debt on lending platforms.";
|
|
791
|
+
case "Depeg Risk" /* DEPEG_RISK */:
|
|
792
|
+
return "The risk of a token losing its peg to the underlying asset, leading to potential losses for holders.";
|
|
793
|
+
}
|
|
794
|
+
};
|
|
795
|
+
var getRiskColor = (risk) => {
|
|
796
|
+
const value = risk.value;
|
|
797
|
+
if (value <= 2) return "light_green_2";
|
|
798
|
+
if (value < 3) return "yellow";
|
|
799
|
+
return "red";
|
|
800
|
+
};
|
|
801
|
+
var getNoRiskTags = (risks) => {
|
|
802
|
+
const noRisks1 = risks.filter((risk) => risk.value === 0).map((risk) => risk.type);
|
|
803
|
+
const noRisks2 = Object.values(RiskType).filter(
|
|
804
|
+
(risk) => !risks.map((risk2) => risk2.type).includes(risk)
|
|
805
|
+
);
|
|
806
|
+
const mergedUnique = [.../* @__PURE__ */ new Set([...noRisks1, ...noRisks2])];
|
|
807
|
+
return mergedUnique;
|
|
808
|
+
};
|
|
809
|
+
function highlightTextWithLinks(put, highlights) {
|
|
810
|
+
const escapeRegExp = (text) => text.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
811
|
+
const pattern = new RegExp(
|
|
812
|
+
`(${highlights.map((m) => escapeRegExp(m.highlight)).join("|")})`,
|
|
813
|
+
"gi"
|
|
814
|
+
);
|
|
815
|
+
const parts = put.split(pattern);
|
|
816
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: parts.map((part, i) => {
|
|
817
|
+
const match = highlights.find((m) => m.highlight.toLowerCase() === part.toLowerCase());
|
|
818
|
+
return match ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: match.link, target: "_blank", style: { color: "white", background: "rgba(255, 255, 255, 0.04)" }, children: part }, i) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: part }, i);
|
|
819
|
+
}) });
|
|
820
|
+
}
|
|
821
|
+
var VesuProtocol = {
|
|
822
|
+
name: "Vesu",
|
|
823
|
+
logo: "https://static-assets-8zct.onrender.com/integrations/vesu/logo.png"
|
|
824
|
+
};
|
|
825
|
+
var AvnuProtocol = {
|
|
826
|
+
name: "Avnu",
|
|
827
|
+
logo: "https://static-assets-8zct.onrender.com/integrations/avnu/logo.png"
|
|
828
|
+
};
|
|
829
|
+
var EndurProtocol = {
|
|
830
|
+
name: "Endur",
|
|
831
|
+
logo: "http://endur.fi/logo.png"
|
|
832
|
+
};
|
|
833
|
+
var ExtendedProtocol = {
|
|
834
|
+
name: "Extended",
|
|
835
|
+
logo: "https://static-assets-8zct.onrender.com/integrations/extended/extended.svg"
|
|
836
|
+
};
|
|
837
|
+
var EkuboProtocol = {
|
|
838
|
+
name: "Ekubo",
|
|
839
|
+
logo: "https://app.ekubo.org/favicon.ico"
|
|
840
|
+
};
|
|
841
|
+
var NoneProtocol = {
|
|
842
|
+
name: "-",
|
|
843
|
+
logo: ""
|
|
844
|
+
};
|
|
845
|
+
var VaultProtocol = {
|
|
846
|
+
name: "Vault",
|
|
847
|
+
logo: ""
|
|
848
|
+
};
|
|
849
|
+
var TrovesProtocol = {
|
|
850
|
+
name: "Troves",
|
|
851
|
+
logo: "https://app.troves.fi/favicon.ico"
|
|
852
|
+
};
|
|
853
|
+
var Protocols = {
|
|
854
|
+
NONE: NoneProtocol,
|
|
855
|
+
VESU: VesuProtocol,
|
|
856
|
+
ENDUR: EndurProtocol,
|
|
857
|
+
EXTENDED: ExtendedProtocol,
|
|
858
|
+
EKUBO: EkuboProtocol,
|
|
859
|
+
AVNU: AvnuProtocol,
|
|
860
|
+
VAULT: VaultProtocol,
|
|
861
|
+
TROVES: TrovesProtocol
|
|
862
|
+
};
|
|
863
|
+
var UnwrapLabsCurator = {
|
|
864
|
+
name: "Unwrap Labs",
|
|
865
|
+
logo: "https://assets.troves.fi/integrations/unwraplabs/white.png"
|
|
866
|
+
};
|
|
867
|
+
|
|
868
|
+
// src/interfaces/initializable.ts
|
|
869
|
+
var Initializable = class {
|
|
870
|
+
constructor() {
|
|
871
|
+
this.initialized = false;
|
|
872
|
+
}
|
|
873
|
+
async waitForInitilisation() {
|
|
874
|
+
return new Promise((resolve, reject) => {
|
|
875
|
+
const interval = setInterval(() => {
|
|
876
|
+
if (this.initialized) {
|
|
877
|
+
console.log("Initialised");
|
|
878
|
+
clearInterval(interval);
|
|
879
|
+
resolve();
|
|
880
|
+
}
|
|
881
|
+
}, 1e3);
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
};
|
|
885
|
+
|
|
638
886
|
// src/global.ts
|
|
639
887
|
var FatalError = class extends Error {
|
|
640
888
|
constructor(message, err) {
|
|
641
889
|
super(message);
|
|
642
890
|
logger.error(message);
|
|
643
|
-
if (err)
|
|
891
|
+
if (err)
|
|
892
|
+
logger.error(err.message);
|
|
644
893
|
this.name = "FatalError";
|
|
645
894
|
}
|
|
646
895
|
};
|
|
647
|
-
var defaultTokens = [
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
symbol: "strkBTC",
|
|
888
|
-
logo: "https://assets.troves.fi/integrations/tokens/strkbtc.svg",
|
|
889
|
-
address: ContractAddr.from("0x0787150e306e6eae6e3f79dea881770e8bbff2c1b8eb490f969669ee945b3135"),
|
|
890
|
-
decimals: 8,
|
|
891
|
-
coingeckId: void 0,
|
|
892
|
-
displayDecimals: 6,
|
|
893
|
-
priceCheckAmount: 1e-3,
|
|
894
|
-
// 112000 * 0.0001 = $110.2
|
|
895
|
-
priceProxySymbol: "WBTC"
|
|
896
|
-
},
|
|
897
|
-
{
|
|
898
|
-
name: "xstrkBTC",
|
|
899
|
-
symbol: "xstrkBTC",
|
|
900
|
-
logo: "https://assets.troves.fi/integrations/tokens/xstrkbtc.svg",
|
|
901
|
-
address: ContractAddr.from("0x047751b3532fabca89b0f2e35ca1cb45e5a7b11d5e3d3663dfa1f4406b45fd88"),
|
|
902
|
-
decimals: 8,
|
|
903
|
-
coingeckId: void 0,
|
|
904
|
-
displayDecimals: 6,
|
|
905
|
-
priceCheckAmount: 1e-3,
|
|
906
|
-
priceProxySymbol: "WBTC"
|
|
907
|
-
}
|
|
908
|
-
];
|
|
896
|
+
var defaultTokens = [{
|
|
897
|
+
name: "Starknet",
|
|
898
|
+
symbol: "STRK",
|
|
899
|
+
logo: "https://assets.troves.fi/integrations/tokens/strk.svg",
|
|
900
|
+
address: ContractAddr.from("0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d"),
|
|
901
|
+
decimals: 18,
|
|
902
|
+
coingeckId: "starknet",
|
|
903
|
+
displayDecimals: 2,
|
|
904
|
+
priceCheckAmount: 5e3,
|
|
905
|
+
priceMethod: "Avnu",
|
|
906
|
+
indexingType: "indexer" /* INDEXER */
|
|
907
|
+
}, {
|
|
908
|
+
name: "xSTRK",
|
|
909
|
+
symbol: "xSTRK",
|
|
910
|
+
logo: "https://assets.troves.fi/integrations/tokens/xstrk.svg",
|
|
911
|
+
address: ContractAddr.from("0x028d709c875c0ceac3dce7065bec5328186dc89fe254527084d1689910954b0a"),
|
|
912
|
+
decimals: 18,
|
|
913
|
+
coingeckId: void 0,
|
|
914
|
+
priceCheckAmount: 5e3,
|
|
915
|
+
displayDecimals: 2,
|
|
916
|
+
priceMethod: "Avnu",
|
|
917
|
+
indexingType: "lstScript" /* LST_SCRIPT */
|
|
918
|
+
}, {
|
|
919
|
+
name: "ETH",
|
|
920
|
+
symbol: "ETH",
|
|
921
|
+
logo: "https://assets.troves.fi/integrations/tokens/eth.svg",
|
|
922
|
+
address: ContractAddr.from("0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"),
|
|
923
|
+
decimals: 18,
|
|
924
|
+
coingeckId: void 0,
|
|
925
|
+
priceCheckAmount: 0.1,
|
|
926
|
+
displayDecimals: 6,
|
|
927
|
+
indexingType: "indexer" /* INDEXER */
|
|
928
|
+
}, {
|
|
929
|
+
name: "USDC.e",
|
|
930
|
+
symbol: "USDC.e",
|
|
931
|
+
logo: "https://assets.troves.fi/integrations/tokens/usdc.svg",
|
|
932
|
+
address: ContractAddr.from("0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8"),
|
|
933
|
+
decimals: 6,
|
|
934
|
+
coingeckId: void 0,
|
|
935
|
+
displayDecimals: 2,
|
|
936
|
+
priceCheckAmount: 1e3,
|
|
937
|
+
priceProxySymbol: "USDC",
|
|
938
|
+
indexingType: "pegged" /* PEGGED */
|
|
939
|
+
}, {
|
|
940
|
+
name: "USDC",
|
|
941
|
+
symbol: "USDC",
|
|
942
|
+
logo: "https://assets.troves.fi/integrations/tokens/usdc.svg",
|
|
943
|
+
address: ContractAddr.from("0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb"),
|
|
944
|
+
decimals: 6,
|
|
945
|
+
coingeckId: void 0,
|
|
946
|
+
displayDecimals: 2,
|
|
947
|
+
priceCheckAmount: 1e3,
|
|
948
|
+
indexingType: "indexer" /* INDEXER */
|
|
949
|
+
}, {
|
|
950
|
+
name: "USDT",
|
|
951
|
+
symbol: "USDT",
|
|
952
|
+
logo: "https://assets.troves.fi/integrations/tokens/usdt.svg",
|
|
953
|
+
address: ContractAddr.from("0x68f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8"),
|
|
954
|
+
decimals: 6,
|
|
955
|
+
coingeckId: void 0,
|
|
956
|
+
priceCheckAmount: 1e3,
|
|
957
|
+
displayDecimals: 2,
|
|
958
|
+
indexingType: "indexer" /* INDEXER */
|
|
959
|
+
}, {
|
|
960
|
+
name: "WBTC",
|
|
961
|
+
symbol: "WBTC",
|
|
962
|
+
logo: "https://assets.troves.fi/integrations/tokens/wbtc.svg",
|
|
963
|
+
address: ContractAddr.from("0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac"),
|
|
964
|
+
decimals: 8,
|
|
965
|
+
coingeckId: void 0,
|
|
966
|
+
displayDecimals: 6,
|
|
967
|
+
priceCheckAmount: 1e-3,
|
|
968
|
+
// 112000 * 0.0001 = $110.2
|
|
969
|
+
indexingType: "indexer" /* INDEXER */
|
|
970
|
+
}, {
|
|
971
|
+
name: "tBTC",
|
|
972
|
+
symbol: "tBTC",
|
|
973
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/tbtc.svg",
|
|
974
|
+
address: ContractAddr.from("0x4daa17763b286d1e59b97c283c0b8c949994c361e426a28f743c67bdfe9a32f"),
|
|
975
|
+
decimals: 18,
|
|
976
|
+
coingeckId: void 0,
|
|
977
|
+
displayDecimals: 6,
|
|
978
|
+
priceCheckAmount: 1e-3,
|
|
979
|
+
// 112000 * 0.0001 = $110.2
|
|
980
|
+
priceProxySymbol: "WBTC",
|
|
981
|
+
indexingType: "pegged" /* PEGGED */
|
|
982
|
+
}, {
|
|
983
|
+
name: "solvBTC",
|
|
984
|
+
symbol: "solvBTC",
|
|
985
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/solvbtc.svg",
|
|
986
|
+
address: ContractAddr.from("0x0593e034dda23eea82d2ba9a30960ed42cf4a01502cc2351dc9b9881f9931a68"),
|
|
987
|
+
decimals: 18,
|
|
988
|
+
coingeckId: void 0,
|
|
989
|
+
priceProxySymbol: "WBTC",
|
|
990
|
+
displayDecimals: 6,
|
|
991
|
+
priceCheckAmount: 1e-4,
|
|
992
|
+
// 112000 * 0.0001 = $11.2
|
|
993
|
+
indexingType: "pegged" /* PEGGED */
|
|
994
|
+
}, {
|
|
995
|
+
name: "LBTC",
|
|
996
|
+
symbol: "LBTC",
|
|
997
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/lbtc.svg",
|
|
998
|
+
address: ContractAddr.from("0x036834a40984312f7f7de8d31e3f6305b325389eaeea5b1c0664b2fb936461a4"),
|
|
999
|
+
decimals: 8,
|
|
1000
|
+
coingeckId: void 0,
|
|
1001
|
+
displayDecimals: 6,
|
|
1002
|
+
priceProxySymbol: "WBTC",
|
|
1003
|
+
priceCheckAmount: 1e-4,
|
|
1004
|
+
// 112000 * 0.0001 = $11.2
|
|
1005
|
+
indexingType: "pegged" /* PEGGED */
|
|
1006
|
+
}, {
|
|
1007
|
+
name: "xWBTC",
|
|
1008
|
+
symbol: "xWBTC",
|
|
1009
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/xwbtc.svg",
|
|
1010
|
+
address: ContractAddr.from("0x6a567e68c805323525fe1649adb80b03cddf92c23d2629a6779f54192dffc13"),
|
|
1011
|
+
decimals: 8,
|
|
1012
|
+
coingeckId: void 0,
|
|
1013
|
+
displayDecimals: 6,
|
|
1014
|
+
priceCheckAmount: 1e-3,
|
|
1015
|
+
// 112000 * 0.0001 = $110.2
|
|
1016
|
+
priceMethod: "Avnu",
|
|
1017
|
+
indexingType: "lstScript" /* LST_SCRIPT */
|
|
1018
|
+
}, {
|
|
1019
|
+
name: "xsBTC",
|
|
1020
|
+
symbol: "xsBTC",
|
|
1021
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/xsbtc_solv.svg",
|
|
1022
|
+
address: ContractAddr.from("0x580f3dc564a7b82f21d40d404b3842d490ae7205e6ac07b1b7af2b4a5183dc9"),
|
|
1023
|
+
decimals: 18,
|
|
1024
|
+
coingeckId: void 0,
|
|
1025
|
+
displayDecimals: 6,
|
|
1026
|
+
priceCheckAmount: 1e-4,
|
|
1027
|
+
// 112000 * 0.0001 = $11.2
|
|
1028
|
+
priceMethod: "Avnu",
|
|
1029
|
+
indexingType: "lstScript" /* LST_SCRIPT */
|
|
1030
|
+
}, {
|
|
1031
|
+
name: "xtBTC",
|
|
1032
|
+
symbol: "xtBTC",
|
|
1033
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/xtbtc.svg",
|
|
1034
|
+
address: ContractAddr.from("0x43a35c1425a0125ef8c171f1a75c6f31ef8648edcc8324b55ce1917db3f9b91"),
|
|
1035
|
+
decimals: 18,
|
|
1036
|
+
coingeckId: void 0,
|
|
1037
|
+
displayDecimals: 6,
|
|
1038
|
+
priceCheckAmount: 1e-3,
|
|
1039
|
+
// 112000 * 0.0001 = $110.2
|
|
1040
|
+
priceMethod: "Avnu",
|
|
1041
|
+
indexingType: "lstScript" /* LST_SCRIPT */
|
|
1042
|
+
}, {
|
|
1043
|
+
name: "xLBTC",
|
|
1044
|
+
symbol: "xLBTC",
|
|
1045
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/xlbtc.svg",
|
|
1046
|
+
address: ContractAddr.from("0x07dd3c80de9fcc5545f0cb83678826819c79619ed7992cc06ff81fc67cd2efe0"),
|
|
1047
|
+
decimals: 8,
|
|
1048
|
+
coingeckId: void 0,
|
|
1049
|
+
displayDecimals: 6,
|
|
1050
|
+
priceCheckAmount: 1e-4,
|
|
1051
|
+
// 112000 * 0.0001 = $11.2
|
|
1052
|
+
priceMethod: "Avnu",
|
|
1053
|
+
indexingType: "lstScript" /* LST_SCRIPT */
|
|
1054
|
+
}, {
|
|
1055
|
+
name: "mRe7BTC",
|
|
1056
|
+
symbol: "mRe7BTC",
|
|
1057
|
+
logo: "https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/3a62ecee-1e58-45d3-9862-3ce90dff1900/logo",
|
|
1058
|
+
address: ContractAddr.from("0x4e4fb1a9ca7e84bae609b9dc0078ad7719e49187ae7e425bb47d131710eddac"),
|
|
1059
|
+
decimals: 18,
|
|
1060
|
+
coingeckId: void 0,
|
|
1061
|
+
displayDecimals: 6,
|
|
1062
|
+
priceCheckAmount: 1e-4,
|
|
1063
|
+
// 112000 * 0.0001 = $11.2
|
|
1064
|
+
dontPrice: true,
|
|
1065
|
+
indexingType: "ignore" /* IGNORE */
|
|
1066
|
+
}, {
|
|
1067
|
+
name: "mRe7YIELD",
|
|
1068
|
+
symbol: "mRe7YIELD",
|
|
1069
|
+
logo: "https://midas.app/assets/mre7-BcOOHm7i.svg",
|
|
1070
|
+
address: ContractAddr.from("0x4be8945e61dc3e19ebadd1579a6bd53b262f51ba89e6f8b0c4bc9a7e3c633fc"),
|
|
1071
|
+
decimals: 18,
|
|
1072
|
+
coingeckId: void 0,
|
|
1073
|
+
displayDecimals: 2,
|
|
1074
|
+
priceCheckAmount: 100,
|
|
1075
|
+
dontPrice: true,
|
|
1076
|
+
indexingType: "ignore" /* IGNORE */
|
|
1077
|
+
}, {
|
|
1078
|
+
name: "fyeWBTC",
|
|
1079
|
+
symbol: "fyeWBTC",
|
|
1080
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/wbtc.svg",
|
|
1081
|
+
address: ContractAddr.from("0x04dd39de0a588f5e1c7a8377e1bef2c49caaee49a11433429d2c48f587b3a492"),
|
|
1082
|
+
decimals: 8,
|
|
1083
|
+
coingeckId: void 0,
|
|
1084
|
+
displayDecimals: 6,
|
|
1085
|
+
priceCheckAmount: 1e-3,
|
|
1086
|
+
// 112000 * 0.0001 = $110.2
|
|
1087
|
+
dontPrice: true,
|
|
1088
|
+
indexingType: "ignore" /* IGNORE */
|
|
1089
|
+
}, {
|
|
1090
|
+
name: "fyETH",
|
|
1091
|
+
symbol: "fyETH",
|
|
1092
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/eth.svg",
|
|
1093
|
+
address: ContractAddr.from("0x050707bC3b8730022F10530C2c6f6b9467644129C50C2868Ad0036c5e4E9e616"),
|
|
1094
|
+
decimals: 18,
|
|
1095
|
+
coingeckId: void 0,
|
|
1096
|
+
displayDecimals: 4,
|
|
1097
|
+
priceCheckAmount: 0.1,
|
|
1098
|
+
dontPrice: true,
|
|
1099
|
+
indexingType: "ignore" /* IGNORE */
|
|
1100
|
+
}, {
|
|
1101
|
+
name: "fyeUSDC",
|
|
1102
|
+
symbol: "fyeUSDC",
|
|
1103
|
+
logo: "https://assets.strkfarm.com/integrations/tokens/usdc.svg",
|
|
1104
|
+
address: ContractAddr.from("0x07fdcec0cef01294c9c3d52415215949805c77bae8003702a7928fd6d2c36bc1"),
|
|
1105
|
+
decimals: 6,
|
|
1106
|
+
coingeckId: void 0,
|
|
1107
|
+
displayDecimals: 2,
|
|
1108
|
+
priceCheckAmount: 100,
|
|
1109
|
+
dontPrice: true,
|
|
1110
|
+
indexingType: "ignore" /* IGNORE */
|
|
1111
|
+
}, {
|
|
1112
|
+
name: "strkBTC",
|
|
1113
|
+
symbol: "strkBTC",
|
|
1114
|
+
logo: "https://assets.troves.fi/integrations/tokens/strkbtc.svg",
|
|
1115
|
+
address: ContractAddr.from("0x0787150e306e6eae6e3f79dea881770e8bbff2c1b8eb490f969669ee945b3135"),
|
|
1116
|
+
decimals: 8,
|
|
1117
|
+
coingeckId: void 0,
|
|
1118
|
+
displayDecimals: 6,
|
|
1119
|
+
priceCheckAmount: 1e-3,
|
|
1120
|
+
// 112000 * 0.0001 = $110.2
|
|
1121
|
+
priceMethod: "Avnu",
|
|
1122
|
+
priceProxySymbol: "WBTC",
|
|
1123
|
+
indexingType: "pegged" /* PEGGED */
|
|
1124
|
+
}, {
|
|
1125
|
+
name: "xstrkBTC",
|
|
1126
|
+
symbol: "xstrkBTC",
|
|
1127
|
+
logo: "https://assets.troves.fi/integrations/tokens/xstrkbtc.svg",
|
|
1128
|
+
address: ContractAddr.from("0x047751b3532fabca89b0f2e35ca1cb45e5a7b11d5e3d3663dfa1f4406b45fd88"),
|
|
1129
|
+
decimals: 8,
|
|
1130
|
+
coingeckId: void 0,
|
|
1131
|
+
displayDecimals: 6,
|
|
1132
|
+
priceCheckAmount: 1e-3,
|
|
1133
|
+
priceMethod: "Avnu",
|
|
1134
|
+
indexingType: "lstScript" /* LST_SCRIPT */
|
|
1135
|
+
}];
|
|
909
1136
|
var tokens = defaultTokens;
|
|
910
1137
|
var _Global = class _Global {
|
|
911
1138
|
static fatalError(message, err) {
|
|
912
1139
|
logger.error(message);
|
|
913
1140
|
console.error(message, err);
|
|
914
|
-
if (err)
|
|
1141
|
+
if (err)
|
|
1142
|
+
console.error(err);
|
|
915
1143
|
process.exit(1);
|
|
916
1144
|
}
|
|
917
1145
|
static httpError(url, err, message) {
|
|
@@ -923,9 +1151,7 @@ var _Global = class _Global {
|
|
|
923
1151
|
}
|
|
924
1152
|
static async getTokens() {
|
|
925
1153
|
if (tokens.length) return tokens;
|
|
926
|
-
const data = await import_axios.default.get(
|
|
927
|
-
"https://assets.troves.fi/integrations/tokens.json"
|
|
928
|
-
);
|
|
1154
|
+
const data = await import_axios.default.get("https://assets.troves.fi/integrations/tokens.json");
|
|
929
1155
|
const tokensData = data.data.content;
|
|
930
1156
|
tokensData.forEach((token) => {
|
|
931
1157
|
if (!token.tags.includes("AVNU") || !token.tags.includes("Verified")) {
|
|
@@ -938,7 +1164,8 @@ var _Global = class _Global {
|
|
|
938
1164
|
decimals: token.decimals,
|
|
939
1165
|
logo: token.logoUri,
|
|
940
1166
|
coingeckId: token.extensions.coingeckoId,
|
|
941
|
-
displayDecimals: 2
|
|
1167
|
+
displayDecimals: 2,
|
|
1168
|
+
indexingType: "ignore" /* IGNORE */
|
|
942
1169
|
});
|
|
943
1170
|
});
|
|
944
1171
|
console.log(tokens);
|
|
@@ -949,25 +1176,25 @@ var _Global = class _Global {
|
|
|
949
1176
|
throw new FatalError(message);
|
|
950
1177
|
}
|
|
951
1178
|
}
|
|
952
|
-
static async
|
|
1179
|
+
static async getTokenInfoFromAddr(addr) {
|
|
953
1180
|
if (tokens.length == defaultTokens.length) {
|
|
954
1181
|
await _Global.getTokens();
|
|
955
1182
|
}
|
|
956
|
-
const token = tokens.find(
|
|
957
|
-
(token2) => token2.name.toLowerCase() === tokenName.toLowerCase()
|
|
958
|
-
);
|
|
1183
|
+
const token = tokens.find((token2) => addr.eq(token2.address));
|
|
959
1184
|
if (!token) {
|
|
960
|
-
throw new FatalError(`Token not found: ${
|
|
1185
|
+
throw new FatalError(`Token not found: ${addr.address}`);
|
|
961
1186
|
}
|
|
962
1187
|
return token;
|
|
963
1188
|
}
|
|
964
|
-
static async
|
|
1189
|
+
static async getTokenInfoFromName(tokenName) {
|
|
965
1190
|
if (tokens.length == defaultTokens.length) {
|
|
966
1191
|
await _Global.getTokens();
|
|
967
1192
|
}
|
|
968
|
-
const token = tokens.find(
|
|
1193
|
+
const token = tokens.find(
|
|
1194
|
+
(token2) => token2.name.toLowerCase() === tokenName.toLowerCase()
|
|
1195
|
+
);
|
|
969
1196
|
if (!token) {
|
|
970
|
-
throw new FatalError(`Token not found: ${
|
|
1197
|
+
throw new FatalError(`Token not found: ${tokenName}`);
|
|
971
1198
|
}
|
|
972
1199
|
return token;
|
|
973
1200
|
}
|
|
@@ -996,8 +1223,8 @@ var import_bytes = require("@ericnordelo/strk-merkle-tree/dist/bytes");
|
|
|
996
1223
|
var import_core = require("@ericnordelo/strk-merkle-tree/dist/core");
|
|
997
1224
|
var import_hashes = require("@ericnordelo/strk-merkle-tree/dist/hashes");
|
|
998
1225
|
var import_merkletree = require("@ericnordelo/strk-merkle-tree/dist/merkletree");
|
|
999
|
-
var
|
|
1000
|
-
var
|
|
1226
|
+
var import_starknet5 = require("starknet");
|
|
1227
|
+
var import_starknet6 = require("@scure/starknet");
|
|
1001
1228
|
function hash_leaf(leaf) {
|
|
1002
1229
|
if (leaf.data.length < 1) {
|
|
1003
1230
|
throw new Error("Invalid leaf data");
|
|
@@ -1007,10 +1234,10 @@ function hash_leaf(leaf) {
|
|
|
1007
1234
|
for (let i = 1; i < leaf.data.length; i++) {
|
|
1008
1235
|
value = pedersen_hash(value, leaf.data[i]);
|
|
1009
1236
|
}
|
|
1010
|
-
return `0x${
|
|
1237
|
+
return `0x${import_starknet5.num.toHexString(value).replace(/^0x/, "").padStart(64, "0")}`;
|
|
1011
1238
|
}
|
|
1012
1239
|
function pedersen_hash(a, b) {
|
|
1013
|
-
return BigInt((0,
|
|
1240
|
+
return BigInt((0, import_starknet6.pedersen)(a, b).toString());
|
|
1014
1241
|
}
|
|
1015
1242
|
var StandardMerkleTree = class _StandardMerkleTree extends import_merkletree.MerkleTreeImpl {
|
|
1016
1243
|
constructor(tree, values, leafEncoding) {
|
|
@@ -1076,7 +1303,7 @@ function isDualTokenStrategy(strategy) {
|
|
|
1076
1303
|
}
|
|
1077
1304
|
|
|
1078
1305
|
// src/utils/starknet-call-parser.ts
|
|
1079
|
-
var
|
|
1306
|
+
var import_starknet7 = require("starknet");
|
|
1080
1307
|
|
|
1081
1308
|
// src/utils/logger.browser.ts
|
|
1082
1309
|
var logger2 = {
|
|
@@ -1700,7 +1927,7 @@ var _StarknetCallParser = class _StarknetCallParser {
|
|
|
1700
1927
|
}
|
|
1701
1928
|
static u256FromParts(low, high) {
|
|
1702
1929
|
try {
|
|
1703
|
-
return
|
|
1930
|
+
return import_starknet7.uint256.uint256ToBN({ low, high }).toString();
|
|
1704
1931
|
} catch {
|
|
1705
1932
|
return "0";
|
|
1706
1933
|
}
|
|
@@ -1883,7 +2110,7 @@ _StarknetCallParser.METHOD_BY_SELECTOR = new Map(
|
|
|
1883
2110
|
"manage_vault_with_merkle_verification",
|
|
1884
2111
|
"multi_route_swap"
|
|
1885
2112
|
].map((method) => [
|
|
1886
|
-
_StarknetCallParser.normalizeHex(
|
|
2113
|
+
_StarknetCallParser.normalizeHex(import_starknet7.hash.getSelectorFromName(method)),
|
|
1887
2114
|
method
|
|
1888
2115
|
])
|
|
1889
2116
|
);
|
|
@@ -2210,8 +2437,8 @@ _Midas.BASE_URL = "https://api-prod.midas.app/api/data";
|
|
|
2210
2437
|
var Midas = _Midas;
|
|
2211
2438
|
|
|
2212
2439
|
// src/modules/token-market-data.ts
|
|
2213
|
-
var import_starknet7 = require("starknet");
|
|
2214
2440
|
var import_starknet8 = require("starknet");
|
|
2441
|
+
var import_starknet9 = require("starknet");
|
|
2215
2442
|
|
|
2216
2443
|
// src/data/erc4626.abi.json
|
|
2217
2444
|
var erc4626_abi_default = [
|
|
@@ -3810,15 +4037,15 @@ var TokenMarketData = class {
|
|
|
3810
4037
|
async getTruePrice(tokenInfo) {
|
|
3811
4038
|
try {
|
|
3812
4039
|
if (LSTAPRService.isLST(tokenInfo.address)) {
|
|
3813
|
-
const lstABI = new
|
|
4040
|
+
const lstABI = new import_starknet8.Contract({
|
|
3814
4041
|
abi: erc4626_abi_default,
|
|
3815
4042
|
address: tokenInfo.address.address,
|
|
3816
4043
|
providerOrAccount: this.config.provider
|
|
3817
4044
|
});
|
|
3818
4045
|
const price2 = await lstABI.call("convert_to_assets", [
|
|
3819
|
-
|
|
4046
|
+
import_starknet9.uint256.bnToUint256(new Web3Number(1, tokenInfo.decimals).toWei())
|
|
3820
4047
|
]);
|
|
3821
|
-
const exchangeRate = Number(
|
|
4048
|
+
const exchangeRate = Number(import_starknet9.uint256.uint256ToBN(price2).toString()) / Math.pow(10, tokenInfo.decimals);
|
|
3822
4049
|
if (exchangeRate === 0) {
|
|
3823
4050
|
throw new Error(`True price is 0 for LST token ${tokenInfo.symbol}`);
|
|
3824
4051
|
}
|
|
@@ -3912,7 +4139,7 @@ var PricerBase = class {
|
|
|
3912
4139
|
};
|
|
3913
4140
|
|
|
3914
4141
|
// src/modules/avnu.ts
|
|
3915
|
-
var
|
|
4142
|
+
var import_starknet10 = require("starknet");
|
|
3916
4143
|
var import_avnu_sdk = require("@avnu/avnu-sdk");
|
|
3917
4144
|
var AvnuWrapper = class _AvnuWrapper {
|
|
3918
4145
|
async getQuotes(fromToken, toToken, amountWei, taker, retry = 0, excludeSources = ["Haiko(Solvers)"]) {
|
|
@@ -3962,10 +4189,10 @@ var AvnuWrapper = class _AvnuWrapper {
|
|
|
3962
4189
|
const _minAmount = minAmount || (quote.buyAmount * 95n / 100n).toString();
|
|
3963
4190
|
const swapInfo = {
|
|
3964
4191
|
token_from_address: quote.sellTokenAddress,
|
|
3965
|
-
token_from_amount:
|
|
4192
|
+
token_from_amount: import_starknet10.uint256.bnToUint256(quote.sellAmount),
|
|
3966
4193
|
token_to_address: quote.buyTokenAddress,
|
|
3967
|
-
token_to_amount:
|
|
3968
|
-
token_to_min_amount:
|
|
4194
|
+
token_to_amount: import_starknet10.uint256.bnToUint256(_minAmount),
|
|
4195
|
+
token_to_min_amount: import_starknet10.uint256.bnToUint256(_minAmount),
|
|
3969
4196
|
beneficiary: taker,
|
|
3970
4197
|
integrator_fee_amount_bps: integratorFeeBps,
|
|
3971
4198
|
integrator_fee_recipient: integratorFeeRecipient,
|
|
@@ -3976,10 +4203,10 @@ var AvnuWrapper = class _AvnuWrapper {
|
|
|
3976
4203
|
static buildZeroSwap(tokenToSell, beneficiary, tokenToBuy = tokenToSell) {
|
|
3977
4204
|
return {
|
|
3978
4205
|
token_from_address: tokenToSell.address,
|
|
3979
|
-
token_from_amount:
|
|
4206
|
+
token_from_amount: import_starknet10.uint256.bnToUint256(0),
|
|
3980
4207
|
token_to_address: tokenToBuy.address,
|
|
3981
|
-
token_to_amount:
|
|
3982
|
-
token_to_min_amount:
|
|
4208
|
+
token_to_amount: import_starknet10.uint256.bnToUint256(0),
|
|
4209
|
+
token_to_min_amount: import_starknet10.uint256.bnToUint256(0),
|
|
3983
4210
|
beneficiary,
|
|
3984
4211
|
integrator_fee_amount_bps: 0,
|
|
3985
4212
|
integrator_fee_recipient: beneficiary,
|
|
@@ -3994,7 +4221,7 @@ var AvnuWrapper = class _AvnuWrapper {
|
|
|
3994
4221
|
});
|
|
3995
4222
|
if (minAmount) {
|
|
3996
4223
|
logger.verbose(`AvnuWrapper: minAmount passed ${minAmount.toString()}`);
|
|
3997
|
-
const u256 =
|
|
4224
|
+
const u256 = import_starknet10.uint256.bnToUint256(minAmount.toWei());
|
|
3998
4225
|
result[0][6] = BigInt(u256.low);
|
|
3999
4226
|
result[0][7] = BigInt(u256.high);
|
|
4000
4227
|
}
|
|
@@ -4216,21 +4443,14 @@ var Pricer = class extends PricerBase {
|
|
|
4216
4443
|
}
|
|
4217
4444
|
}
|
|
4218
4445
|
async _getPrice(token) {
|
|
4219
|
-
const
|
|
4220
|
-
|
|
4221
|
-
logger.verbose(`Fetching price of ${token.symbol} using pinned ${pinned}`);
|
|
4222
|
-
try {
|
|
4223
|
-
return await this._tryPriceMethod(token, pinned);
|
|
4224
|
-
} catch (error) {
|
|
4225
|
-
console.warn(`${pinned}: pinned price failed [${token.symbol}]: `, error.message);
|
|
4226
|
-
delete this.methodToUse[token.symbol];
|
|
4227
|
-
}
|
|
4228
|
-
}
|
|
4229
|
-
for (const method of PRICE_METHOD_PRIORITY) {
|
|
4446
|
+
const methodsToTry = this._getMethodsToTry(token);
|
|
4447
|
+
for (const method of methodsToTry) {
|
|
4230
4448
|
logger.verbose(`Fetching price of ${token.symbol} using ${method}`);
|
|
4231
4449
|
try {
|
|
4232
4450
|
const result = await this._tryPriceMethod(token, method);
|
|
4233
|
-
|
|
4451
|
+
if (!token.priceMethod) {
|
|
4452
|
+
this.methodToUse[token.symbol] = method;
|
|
4453
|
+
}
|
|
4234
4454
|
return result;
|
|
4235
4455
|
} catch (error) {
|
|
4236
4456
|
console.warn(`${method}: price err [${token.symbol}]: `, error.message);
|
|
@@ -4238,6 +4458,22 @@ var Pricer = class extends PricerBase {
|
|
|
4238
4458
|
}
|
|
4239
4459
|
throw new FatalError(`Price not found for ${token.symbol}`);
|
|
4240
4460
|
}
|
|
4461
|
+
_getMethodsToTry(token) {
|
|
4462
|
+
const methods = [];
|
|
4463
|
+
if (token.priceMethod) {
|
|
4464
|
+
methods.push(token.priceMethod);
|
|
4465
|
+
}
|
|
4466
|
+
const pinned = this.methodToUse[token.symbol];
|
|
4467
|
+
if (pinned && pinned !== token.priceMethod) {
|
|
4468
|
+
methods.push(pinned);
|
|
4469
|
+
}
|
|
4470
|
+
for (const method of PRICE_METHOD_PRIORITY) {
|
|
4471
|
+
if (!methods.includes(method)) {
|
|
4472
|
+
methods.push(method);
|
|
4473
|
+
}
|
|
4474
|
+
}
|
|
4475
|
+
return methods;
|
|
4476
|
+
}
|
|
4241
4477
|
async _tryPriceMethod(token, method) {
|
|
4242
4478
|
switch (method) {
|
|
4243
4479
|
case "AvnuApi":
|
|
@@ -4306,7 +4542,7 @@ var Pricer = class extends PricerBase {
|
|
|
4306
4542
|
};
|
|
4307
4543
|
|
|
4308
4544
|
// src/modules/pragma.ts
|
|
4309
|
-
var
|
|
4545
|
+
var import_starknet11 = require("starknet");
|
|
4310
4546
|
|
|
4311
4547
|
// src/data/pragma.abi.json
|
|
4312
4548
|
var pragma_abi_default = [
|
|
@@ -4411,7 +4647,7 @@ var Pragma = class extends PricerBase {
|
|
|
4411
4647
|
constructor(config, tokens2) {
|
|
4412
4648
|
super(config, tokens2);
|
|
4413
4649
|
this.contractAddr = "0x023fb3afbff2c0e3399f896dcf7400acf1a161941cfb386e34a123f228c62832";
|
|
4414
|
-
this.contract = new
|
|
4650
|
+
this.contract = new import_starknet11.Contract({
|
|
4415
4651
|
abi: pragma_abi_default,
|
|
4416
4652
|
address: this.contractAddr,
|
|
4417
4653
|
providerOrAccount: config.provider
|
|
@@ -4439,7 +4675,7 @@ var Pragma = class extends PricerBase {
|
|
|
4439
4675
|
var import_axios5 = __toESM(require("axios"));
|
|
4440
4676
|
|
|
4441
4677
|
// src/dataTypes/bignumber.browser.ts
|
|
4442
|
-
var
|
|
4678
|
+
var import_starknet12 = require("starknet");
|
|
4443
4679
|
var Web3Number2 = class _Web3Number2 extends _Web3Number {
|
|
4444
4680
|
static fromWei(weiNumber, decimals) {
|
|
4445
4681
|
const bn = new _Web3Number2(weiNumber, decimals).dividedBy(10 ** decimals);
|
|
@@ -4449,36 +4685,7 @@ var Web3Number2 = class _Web3Number2 extends _Web3Number {
|
|
|
4449
4685
|
return new _Web3Number2(number.toString(), decimals);
|
|
4450
4686
|
}
|
|
4451
4687
|
static fromUint256(uint256Value) {
|
|
4452
|
-
return this.fromWei(
|
|
4453
|
-
}
|
|
4454
|
-
};
|
|
4455
|
-
|
|
4456
|
-
// src/interfaces/lending.ts
|
|
4457
|
-
var MarginType = /* @__PURE__ */ ((MarginType2) => {
|
|
4458
|
-
MarginType2["SHARED"] = "shared";
|
|
4459
|
-
MarginType2["NONE"] = "none";
|
|
4460
|
-
return MarginType2;
|
|
4461
|
-
})(MarginType || {});
|
|
4462
|
-
var ILending = class {
|
|
4463
|
-
constructor(config, metadata) {
|
|
4464
|
-
this.tokens = [];
|
|
4465
|
-
this.initialised = false;
|
|
4466
|
-
this.metadata = metadata;
|
|
4467
|
-
this.config = config;
|
|
4468
|
-
this.init();
|
|
4469
|
-
}
|
|
4470
|
-
/** Wait for initialisation */
|
|
4471
|
-
waitForInitilisation() {
|
|
4472
|
-
return new Promise((resolve, reject) => {
|
|
4473
|
-
const interval = setInterval(() => {
|
|
4474
|
-
logger.verbose(`Waiting for ${this.metadata.name} to initialise`);
|
|
4475
|
-
if (this.initialised) {
|
|
4476
|
-
logger.verbose(`${this.metadata.name} initialised`);
|
|
4477
|
-
clearInterval(interval);
|
|
4478
|
-
resolve();
|
|
4479
|
-
}
|
|
4480
|
-
}, 1e3);
|
|
4481
|
-
});
|
|
4688
|
+
return this.fromWei(import_starknet12.uint256.uint256ToBN(uint256Value).toString(), 18);
|
|
4482
4689
|
}
|
|
4483
4690
|
};
|
|
4484
4691
|
|
|
@@ -4512,7 +4719,8 @@ var _ZkLend = class _ZkLend extends ILending {
|
|
|
4512
4719
|
decimals: pool.token.decimals,
|
|
4513
4720
|
borrowFactor: Web3Number2.fromWei(pool.borrow_factor.value, pool.borrow_factor.decimals),
|
|
4514
4721
|
collareralFactor,
|
|
4515
|
-
displayDecimals: 2
|
|
4722
|
+
displayDecimals: 2,
|
|
4723
|
+
indexingType: "ignore" /* IGNORE */
|
|
4516
4724
|
};
|
|
4517
4725
|
this.tokens.push(token);
|
|
4518
4726
|
});
|
|
@@ -4640,7 +4848,7 @@ var apolloClient = new import_client.ApolloClient({
|
|
|
4640
4848
|
var import_client2 = require("@apollo/client");
|
|
4641
4849
|
|
|
4642
4850
|
// src/modules/ekubo-pricer.ts
|
|
4643
|
-
var
|
|
4851
|
+
var import_starknet13 = require("starknet");
|
|
4644
4852
|
|
|
4645
4853
|
// src/data/ekubo-price-fethcer.abi.json
|
|
4646
4854
|
var ekubo_price_fethcer_abi_default = [
|
|
@@ -4914,16 +5122,17 @@ var EkuboPricer = class extends PricerBase {
|
|
|
4914
5122
|
constructor(config, tokens2) {
|
|
4915
5123
|
super(config, tokens2);
|
|
4916
5124
|
this.EKUBO_PRICE_FETCHER_ADDRESS = "0x04946fb4ad5237d97bbb1256eba2080c4fe1de156da6a7f83e3b4823bb6d7da1";
|
|
4917
|
-
|
|
5125
|
+
// Updating to new USDC_ADDRESS
|
|
5126
|
+
this.USDC_ADDRESS = "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb";
|
|
4918
5127
|
this.USDC_DECIMALS = 6;
|
|
4919
|
-
this.contract = new
|
|
5128
|
+
this.contract = new import_starknet13.Contract({
|
|
4920
5129
|
abi: ekubo_price_fethcer_abi_default,
|
|
4921
5130
|
address: this.EKUBO_PRICE_FETCHER_ADDRESS,
|
|
4922
5131
|
providerOrAccount: config.provider
|
|
4923
5132
|
});
|
|
4924
5133
|
}
|
|
4925
|
-
div2Power128(
|
|
4926
|
-
return Number(
|
|
5134
|
+
div2Power128(num17) {
|
|
5135
|
+
return Number(num17 * BigInt(1e18) / BigInt(2 ** 128)) / 1e18;
|
|
4927
5136
|
}
|
|
4928
5137
|
async getPrice(tokenAddr, blockIdentifier = "latest") {
|
|
4929
5138
|
if (!tokenAddr) {
|
|
@@ -5132,7 +5341,7 @@ var PricerFromApi = class extends PricerBase {
|
|
|
5132
5341
|
};
|
|
5133
5342
|
|
|
5134
5343
|
// src/modules/erc20.ts
|
|
5135
|
-
var
|
|
5344
|
+
var import_starknet14 = require("starknet");
|
|
5136
5345
|
|
|
5137
5346
|
// src/data/erc20.abi.json
|
|
5138
5347
|
var erc20_abi_default = [
|
|
@@ -6265,7 +6474,7 @@ var ERC20 = class {
|
|
|
6265
6474
|
}
|
|
6266
6475
|
contract(addr) {
|
|
6267
6476
|
const _addr = typeof addr === "string" ? addr : addr.address;
|
|
6268
|
-
return new
|
|
6477
|
+
return new import_starknet14.Contract({
|
|
6269
6478
|
abi: erc20_abi_default,
|
|
6270
6479
|
address: _addr,
|
|
6271
6480
|
providerOrAccount: this.config.provider
|
|
@@ -6286,7 +6495,7 @@ var ERC20 = class {
|
|
|
6286
6495
|
}
|
|
6287
6496
|
transfer(token, to, amount) {
|
|
6288
6497
|
const contract = this.contract(token);
|
|
6289
|
-
const amountUint256 =
|
|
6498
|
+
const amountUint256 = import_starknet14.uint256.bnToUint256(amount.toWei());
|
|
6290
6499
|
const transferCall = contract.populate("transfer", [
|
|
6291
6500
|
to.toString(),
|
|
6292
6501
|
amountUint256.low.toString(),
|
|
@@ -6296,7 +6505,7 @@ var ERC20 = class {
|
|
|
6296
6505
|
}
|
|
6297
6506
|
transferFrom(token, from2, to, amount) {
|
|
6298
6507
|
const contract = this.contract(token);
|
|
6299
|
-
const amountUint256 =
|
|
6508
|
+
const amountUint256 = import_starknet14.uint256.bnToUint256(amount.toWei());
|
|
6300
6509
|
const transferFromCall = contract.populate("transferFrom", [
|
|
6301
6510
|
from2.toString(),
|
|
6302
6511
|
to.toString(),
|
|
@@ -6307,7 +6516,7 @@ var ERC20 = class {
|
|
|
6307
6516
|
}
|
|
6308
6517
|
approve(token, spender, amount) {
|
|
6309
6518
|
const contract = this.contract(token);
|
|
6310
|
-
const amountUint256 =
|
|
6519
|
+
const amountUint256 = import_starknet14.uint256.bnToUint256(amount.toWei());
|
|
6311
6520
|
const approveCall = contract.populate("approve", [
|
|
6312
6521
|
spender.toString(),
|
|
6313
6522
|
amountUint256.low.toString(),
|
|
@@ -6319,8 +6528,8 @@ var ERC20 = class {
|
|
|
6319
6528
|
|
|
6320
6529
|
// src/modules/ekubo-quoter.ts
|
|
6321
6530
|
var import_axios7 = __toESM(require("axios"));
|
|
6322
|
-
var import_starknet14 = require("starknet");
|
|
6323
6531
|
var import_starknet15 = require("starknet");
|
|
6532
|
+
var import_starknet16 = require("starknet");
|
|
6324
6533
|
var EkuboQuoter = class _EkuboQuoter {
|
|
6325
6534
|
constructor(config, pricer) {
|
|
6326
6535
|
this.config = config;
|
|
@@ -6384,13 +6593,13 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
6384
6593
|
}
|
|
6385
6594
|
async getLSTTrueExchangeRate(baseToken, quoteToken, amount) {
|
|
6386
6595
|
const lstTokenInfo = baseToken;
|
|
6387
|
-
const lstABI = new
|
|
6596
|
+
const lstABI = new import_starknet16.Contract({
|
|
6388
6597
|
abi: erc4626_abi_default,
|
|
6389
6598
|
address: lstTokenInfo.address.address,
|
|
6390
6599
|
providerOrAccount: this.config.provider
|
|
6391
6600
|
});
|
|
6392
|
-
const price = await lstABI.call("convert_to_assets", [
|
|
6393
|
-
const exchangeRate = Number(
|
|
6601
|
+
const price = await lstABI.call("convert_to_assets", [import_starknet15.uint256.bnToUint256(new Web3Number(1, lstTokenInfo.decimals).toWei())]);
|
|
6602
|
+
const exchangeRate = Number(import_starknet15.uint256.uint256ToBN(price).toString()) / Math.pow(10, lstTokenInfo.decimals);
|
|
6394
6603
|
logger.verbose(`${_EkuboQuoter.name}:: LST true Exchange Rate: ${exchangeRate}`);
|
|
6395
6604
|
return exchangeRate;
|
|
6396
6605
|
}
|
|
@@ -6453,217 +6662,6 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
6453
6662
|
}
|
|
6454
6663
|
};
|
|
6455
6664
|
|
|
6456
|
-
// src/interfaces/common.tsx
|
|
6457
|
-
var import_starknet16 = require("starknet");
|
|
6458
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
6459
|
-
var RiskType = /* @__PURE__ */ ((RiskType2) => {
|
|
6460
|
-
RiskType2["MARKET_RISK"] = "Market Risk";
|
|
6461
|
-
RiskType2["IMPERMANENT_LOSS"] = "Impermanent Loss Risk";
|
|
6462
|
-
RiskType2["LIQUIDATION_RISK"] = "Liquidation Risk";
|
|
6463
|
-
RiskType2["LOW_LIQUIDITY_RISK"] = "Low Liquidity Risk";
|
|
6464
|
-
RiskType2["SMART_CONTRACT_RISK"] = "Smart Contract Risk";
|
|
6465
|
-
RiskType2["ORACLE_RISK"] = "Oracle Risk";
|
|
6466
|
-
RiskType2["TECHNICAL_RISK"] = "Technical Risk";
|
|
6467
|
-
RiskType2["COUNTERPARTY_RISK"] = "Counterparty Risk";
|
|
6468
|
-
RiskType2["DEPEG_RISK"] = "Depeg Risk";
|
|
6469
|
-
return RiskType2;
|
|
6470
|
-
})(RiskType || {});
|
|
6471
|
-
var Network = /* @__PURE__ */ ((Network2) => {
|
|
6472
|
-
Network2["mainnet"] = "mainnet";
|
|
6473
|
-
Network2["sepolia"] = "sepolia";
|
|
6474
|
-
Network2["devnet"] = "devnet";
|
|
6475
|
-
return Network2;
|
|
6476
|
-
})(Network || {});
|
|
6477
|
-
var StrategyTag = /* @__PURE__ */ ((StrategyTag3) => {
|
|
6478
|
-
StrategyTag3["META_VAULT"] = "Meta Vaults";
|
|
6479
|
-
StrategyTag3["LEVERED"] = "Maxx";
|
|
6480
|
-
StrategyTag3["AUTOMATED_LP"] = "Ekubo";
|
|
6481
|
-
StrategyTag3["BTC"] = "BTC";
|
|
6482
|
-
return StrategyTag3;
|
|
6483
|
-
})(StrategyTag || {});
|
|
6484
|
-
var VaultType = /* @__PURE__ */ ((VaultType2) => {
|
|
6485
|
-
VaultType2["LOOPING"] = "Looping";
|
|
6486
|
-
VaultType2["META_VAULT"] = "Meta Vault";
|
|
6487
|
-
VaultType2["DELTA_NEUTRAL"] = "Delta Neutral";
|
|
6488
|
-
VaultType2["AUTOMATED_LP"] = "Automated LP";
|
|
6489
|
-
VaultType2["TVA"] = "Troves Value Averaging";
|
|
6490
|
-
return VaultType2;
|
|
6491
|
-
})(VaultType || {});
|
|
6492
|
-
var AuditStatus = /* @__PURE__ */ ((AuditStatus2) => {
|
|
6493
|
-
AuditStatus2["AUDITED"] = "Audited";
|
|
6494
|
-
AuditStatus2["NOT_AUDITED"] = "Not Audited";
|
|
6495
|
-
return AuditStatus2;
|
|
6496
|
-
})(AuditStatus || {});
|
|
6497
|
-
var SourceCodeType = /* @__PURE__ */ ((SourceCodeType2) => {
|
|
6498
|
-
SourceCodeType2["OPEN_SOURCE"] = "Open Source";
|
|
6499
|
-
SourceCodeType2["CLOSED_SOURCE"] = "Closed Source";
|
|
6500
|
-
return SourceCodeType2;
|
|
6501
|
-
})(SourceCodeType || {});
|
|
6502
|
-
var AccessControlType = /* @__PURE__ */ ((AccessControlType2) => {
|
|
6503
|
-
AccessControlType2["MULTISIG_ACCOUNT"] = "Multisig Account";
|
|
6504
|
-
AccessControlType2["STANDARD_ACCOUNT"] = "Standard Account";
|
|
6505
|
-
AccessControlType2["ROLE_BASED_ACCESS"] = "Role Based Access";
|
|
6506
|
-
return AccessControlType2;
|
|
6507
|
-
})(AccessControlType || {});
|
|
6508
|
-
var InstantWithdrawalVault = /* @__PURE__ */ ((InstantWithdrawalVault2) => {
|
|
6509
|
-
InstantWithdrawalVault2["YES"] = "Yes";
|
|
6510
|
-
InstantWithdrawalVault2["NO"] = "No";
|
|
6511
|
-
return InstantWithdrawalVault2;
|
|
6512
|
-
})(InstantWithdrawalVault || {});
|
|
6513
|
-
var FlowChartColors = /* @__PURE__ */ ((FlowChartColors2) => {
|
|
6514
|
-
FlowChartColors2["Green"] = "purple";
|
|
6515
|
-
FlowChartColors2["Blue"] = "#35484f";
|
|
6516
|
-
FlowChartColors2["Purple"] = "#6e53dc";
|
|
6517
|
-
return FlowChartColors2;
|
|
6518
|
-
})(FlowChartColors || {});
|
|
6519
|
-
var StrategyLiveStatus = /* @__PURE__ */ ((StrategyLiveStatus2) => {
|
|
6520
|
-
StrategyLiveStatus2["ACTIVE"] = "Active";
|
|
6521
|
-
StrategyLiveStatus2["NEW"] = "New";
|
|
6522
|
-
StrategyLiveStatus2["COMING_SOON"] = "Coming Soon";
|
|
6523
|
-
StrategyLiveStatus2["DEPRECATED"] = "Deprecated";
|
|
6524
|
-
StrategyLiveStatus2["RETIRED"] = "Retired";
|
|
6525
|
-
StrategyLiveStatus2["HOT"] = "Hot & New \u{1F525}";
|
|
6526
|
-
return StrategyLiveStatus2;
|
|
6527
|
-
})(StrategyLiveStatus || {});
|
|
6528
|
-
function getMainnetConfig(rpcUrl = "https://starknet-mainnet.public.blastapi.io", blockIdentifier = import_starknet16.BlockTag.LATEST) {
|
|
6529
|
-
return {
|
|
6530
|
-
provider: new import_starknet16.RpcProvider({
|
|
6531
|
-
nodeUrl: rpcUrl,
|
|
6532
|
-
blockIdentifier
|
|
6533
|
-
// specVersion
|
|
6534
|
-
}),
|
|
6535
|
-
stage: "production",
|
|
6536
|
-
network: "mainnet" /* mainnet */
|
|
6537
|
-
};
|
|
6538
|
-
}
|
|
6539
|
-
var getStrategyTagDesciption = (tag) => {
|
|
6540
|
-
switch (tag) {
|
|
6541
|
-
case "Meta Vaults" /* META_VAULT */:
|
|
6542
|
-
return "A meta vault is a vault that auto allocates funds to multiple vaults based on optimal yield opportunities";
|
|
6543
|
-
case "Maxx" /* LEVERED */:
|
|
6544
|
-
return "Looping vaults on Endur LSTs with leveraged borrowing of STRK or BTC to increase yield (2-4x higher yield than simply staking)";
|
|
6545
|
-
case "Ekubo" /* AUTOMATED_LP */:
|
|
6546
|
-
return "Automated LP vaults on Ekubo that rebalance position automatically, ensuring you earn fees efficiently";
|
|
6547
|
-
case "BTC" /* BTC */:
|
|
6548
|
-
return "BTC linked vaults";
|
|
6549
|
-
}
|
|
6550
|
-
};
|
|
6551
|
-
var getAllStrategyTags = () => {
|
|
6552
|
-
return Object.values(StrategyTag);
|
|
6553
|
-
};
|
|
6554
|
-
var getRiskExplaination = (riskType) => {
|
|
6555
|
-
switch (riskType) {
|
|
6556
|
-
case "Market Risk" /* MARKET_RISK */:
|
|
6557
|
-
return "The risk of the market moving against the position.";
|
|
6558
|
-
case "Impermanent Loss Risk" /* IMPERMANENT_LOSS */:
|
|
6559
|
-
return "The temporary loss of value experienced by liquidity providers in AMMs when asset prices diverge compared to simply holding them.";
|
|
6560
|
-
case "Liquidation Risk" /* LIQUIDATION_RISK */:
|
|
6561
|
-
return "The risk of losing funds due to the position being liquidated.";
|
|
6562
|
-
case "Low Liquidity Risk" /* LOW_LIQUIDITY_RISK */:
|
|
6563
|
-
return "The risk of low liquidity in the pool, which can lead to high slippages or reduced in-abilities to quickly exit the position.";
|
|
6564
|
-
case "Oracle Risk" /* ORACLE_RISK */:
|
|
6565
|
-
return "The risk of the oracle being manipulated or incorrect.";
|
|
6566
|
-
case "Smart Contract Risk" /* SMART_CONTRACT_RISK */:
|
|
6567
|
-
return "The risk of the smart contract being vulnerable to attacks.";
|
|
6568
|
-
case "Technical Risk" /* TECHNICAL_RISK */:
|
|
6569
|
-
return "The risk of technical issues e.g. backend failure.";
|
|
6570
|
-
case "Counterparty Risk" /* COUNTERPARTY_RISK */:
|
|
6571
|
-
return "The risk of the counterparty defaulting e.g. bad debt on lending platforms.";
|
|
6572
|
-
case "Depeg Risk" /* DEPEG_RISK */:
|
|
6573
|
-
return "The risk of a token losing its peg to the underlying asset, leading to potential losses for holders.";
|
|
6574
|
-
}
|
|
6575
|
-
};
|
|
6576
|
-
var getRiskColor = (risk) => {
|
|
6577
|
-
const value = risk.value;
|
|
6578
|
-
if (value <= 2) return "light_green_2";
|
|
6579
|
-
if (value < 3) return "yellow";
|
|
6580
|
-
return "red";
|
|
6581
|
-
};
|
|
6582
|
-
var getNoRiskTags = (risks) => {
|
|
6583
|
-
const noRisks1 = risks.filter((risk) => risk.value === 0).map((risk) => risk.type);
|
|
6584
|
-
const noRisks2 = Object.values(RiskType).filter(
|
|
6585
|
-
(risk) => !risks.map((risk2) => risk2.type).includes(risk)
|
|
6586
|
-
);
|
|
6587
|
-
const mergedUnique = [.../* @__PURE__ */ new Set([...noRisks1, ...noRisks2])];
|
|
6588
|
-
return mergedUnique;
|
|
6589
|
-
};
|
|
6590
|
-
function highlightTextWithLinks(put, highlights) {
|
|
6591
|
-
const escapeRegExp = (text) => text.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
6592
|
-
const pattern = new RegExp(
|
|
6593
|
-
`(${highlights.map((m) => escapeRegExp(m.highlight)).join("|")})`,
|
|
6594
|
-
"gi"
|
|
6595
|
-
);
|
|
6596
|
-
const parts = put.split(pattern);
|
|
6597
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: parts.map((part, i) => {
|
|
6598
|
-
const match = highlights.find((m) => m.highlight.toLowerCase() === part.toLowerCase());
|
|
6599
|
-
return match ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: match.link, target: "_blank", style: { color: "white", background: "rgba(255, 255, 255, 0.04)" }, children: part }, i) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: part }, i);
|
|
6600
|
-
}) });
|
|
6601
|
-
}
|
|
6602
|
-
var VesuProtocol = {
|
|
6603
|
-
name: "Vesu",
|
|
6604
|
-
logo: "https://static-assets-8zct.onrender.com/integrations/vesu/logo.png"
|
|
6605
|
-
};
|
|
6606
|
-
var AvnuProtocol = {
|
|
6607
|
-
name: "Avnu",
|
|
6608
|
-
logo: "https://static-assets-8zct.onrender.com/integrations/avnu/logo.png"
|
|
6609
|
-
};
|
|
6610
|
-
var EndurProtocol = {
|
|
6611
|
-
name: "Endur",
|
|
6612
|
-
logo: "http://endur.fi/logo.png"
|
|
6613
|
-
};
|
|
6614
|
-
var ExtendedProtocol = {
|
|
6615
|
-
name: "Extended",
|
|
6616
|
-
logo: "https://static-assets-8zct.onrender.com/integrations/extended/extended.svg"
|
|
6617
|
-
};
|
|
6618
|
-
var EkuboProtocol = {
|
|
6619
|
-
name: "Ekubo",
|
|
6620
|
-
logo: "https://app.ekubo.org/favicon.ico"
|
|
6621
|
-
};
|
|
6622
|
-
var NoneProtocol = {
|
|
6623
|
-
name: "-",
|
|
6624
|
-
logo: ""
|
|
6625
|
-
};
|
|
6626
|
-
var VaultProtocol = {
|
|
6627
|
-
name: "Vault",
|
|
6628
|
-
logo: ""
|
|
6629
|
-
};
|
|
6630
|
-
var TrovesProtocol = {
|
|
6631
|
-
name: "Troves",
|
|
6632
|
-
logo: "https://app.troves.fi/favicon.ico"
|
|
6633
|
-
};
|
|
6634
|
-
var Protocols = {
|
|
6635
|
-
NONE: NoneProtocol,
|
|
6636
|
-
VESU: VesuProtocol,
|
|
6637
|
-
ENDUR: EndurProtocol,
|
|
6638
|
-
EXTENDED: ExtendedProtocol,
|
|
6639
|
-
EKUBO: EkuboProtocol,
|
|
6640
|
-
AVNU: AvnuProtocol,
|
|
6641
|
-
VAULT: VaultProtocol,
|
|
6642
|
-
TROVES: TrovesProtocol
|
|
6643
|
-
};
|
|
6644
|
-
var UnwrapLabsCurator = {
|
|
6645
|
-
name: "Unwrap Labs",
|
|
6646
|
-
logo: "https://assets.troves.fi/integrations/unwraplabs/white.png"
|
|
6647
|
-
};
|
|
6648
|
-
|
|
6649
|
-
// src/interfaces/initializable.ts
|
|
6650
|
-
var Initializable = class {
|
|
6651
|
-
constructor() {
|
|
6652
|
-
this.initialized = false;
|
|
6653
|
-
}
|
|
6654
|
-
async waitForInitilisation() {
|
|
6655
|
-
return new Promise((resolve, reject) => {
|
|
6656
|
-
const interval = setInterval(() => {
|
|
6657
|
-
if (this.initialized) {
|
|
6658
|
-
console.log("Initialised");
|
|
6659
|
-
clearInterval(interval);
|
|
6660
|
-
resolve();
|
|
6661
|
-
}
|
|
6662
|
-
}, 1e3);
|
|
6663
|
-
});
|
|
6664
|
-
}
|
|
6665
|
-
};
|
|
6666
|
-
|
|
6667
6665
|
// src/strategies/autoCompounderStrk.ts
|
|
6668
6666
|
var import_starknet17 = require("starknet");
|
|
6669
6667
|
var AutoCompounderSTRK = class {
|
|
@@ -18196,6 +18194,73 @@ async function binarySearch(lowWei, highWei, callback) {
|
|
|
18196
18194
|
}
|
|
18197
18195
|
return null;
|
|
18198
18196
|
}
|
|
18197
|
+
async function findMaxInputWithSlippage(options) {
|
|
18198
|
+
const {
|
|
18199
|
+
apiGetOutput,
|
|
18200
|
+
maxInput,
|
|
18201
|
+
maxSlippagePercent,
|
|
18202
|
+
tolerance,
|
|
18203
|
+
minInput = 0,
|
|
18204
|
+
referenceAmountMultiplier = 1e-3,
|
|
18205
|
+
referenceRate = 0
|
|
18206
|
+
} = options;
|
|
18207
|
+
let apiCalls = 0;
|
|
18208
|
+
if (!referenceRate && !referenceAmountMultiplier) {
|
|
18209
|
+
throw new Error("One of referenceRate or referenceAmountMultiplier must be provided");
|
|
18210
|
+
}
|
|
18211
|
+
let _referenceRate = referenceRate;
|
|
18212
|
+
if (!_referenceRate) {
|
|
18213
|
+
const smallAmount = maxInput * referenceAmountMultiplier;
|
|
18214
|
+
const referenceOutput = await apiGetOutput(smallAmount);
|
|
18215
|
+
apiCalls++;
|
|
18216
|
+
_referenceRate = referenceOutput / smallAmount;
|
|
18217
|
+
}
|
|
18218
|
+
async function checkSlippage(inputAmount) {
|
|
18219
|
+
const actualOutput = await apiGetOutput(inputAmount);
|
|
18220
|
+
apiCalls++;
|
|
18221
|
+
const expectedOutput = inputAmount * referenceRate;
|
|
18222
|
+
const slippage = (expectedOutput - actualOutput) / expectedOutput;
|
|
18223
|
+
logger.verbose(`findMaxInputWithSlippage::checkSlippage inputAmount: ${inputAmount}, actualOutput: ${actualOutput}, slippage: ${slippage}, maxSlippagePercent: ${maxSlippagePercent}`);
|
|
18224
|
+
return {
|
|
18225
|
+
acceptable: slippage <= maxSlippagePercent,
|
|
18226
|
+
slippage,
|
|
18227
|
+
output: actualOutput
|
|
18228
|
+
};
|
|
18229
|
+
}
|
|
18230
|
+
const maxCheck = await checkSlippage(maxInput);
|
|
18231
|
+
if (maxCheck.acceptable) {
|
|
18232
|
+
return {
|
|
18233
|
+
optimalInput: maxInput,
|
|
18234
|
+
actualOutput: maxCheck.output,
|
|
18235
|
+
actualSlippage: maxCheck.slippage,
|
|
18236
|
+
apiCallsUsed: apiCalls
|
|
18237
|
+
};
|
|
18238
|
+
}
|
|
18239
|
+
let left = minInput;
|
|
18240
|
+
let right = maxInput;
|
|
18241
|
+
let bestInput = minInput;
|
|
18242
|
+
let bestOutput = 0;
|
|
18243
|
+
let bestSlippage = 0;
|
|
18244
|
+
const convergenceThreshold = tolerance * maxInput;
|
|
18245
|
+
while (right - left > convergenceThreshold) {
|
|
18246
|
+
const mid = (left + right) / 2;
|
|
18247
|
+
const midCheck = await checkSlippage(mid);
|
|
18248
|
+
if (midCheck.acceptable) {
|
|
18249
|
+
bestInput = mid;
|
|
18250
|
+
bestOutput = midCheck.output;
|
|
18251
|
+
bestSlippage = midCheck.slippage;
|
|
18252
|
+
left = mid;
|
|
18253
|
+
} else {
|
|
18254
|
+
right = mid;
|
|
18255
|
+
}
|
|
18256
|
+
}
|
|
18257
|
+
return {
|
|
18258
|
+
optimalInput: bestInput,
|
|
18259
|
+
actualOutput: bestOutput,
|
|
18260
|
+
actualSlippage: bestSlippage,
|
|
18261
|
+
apiCallsUsed: apiCalls
|
|
18262
|
+
};
|
|
18263
|
+
}
|
|
18199
18264
|
|
|
18200
18265
|
// src/strategies/ekubo-cl-vault.tsx
|
|
18201
18266
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
@@ -18501,9 +18566,6 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
|
|
|
18501
18566
|
async getUserRealizedAPY(blockIdentifier = "latest", sinceBlocks = 6e5) {
|
|
18502
18567
|
throw new Error("getUserRealizedAPY not implemented yet for Ekubo CL Vault strategy");
|
|
18503
18568
|
}
|
|
18504
|
-
async getMaxTVL() {
|
|
18505
|
-
return new Web3Number("0", 18);
|
|
18506
|
-
}
|
|
18507
18569
|
async getUserPositionCards(input) {
|
|
18508
18570
|
const quoteToken = this.metadata.additionalInfo.quoteAsset;
|
|
18509
18571
|
const [userTVL, quotePrice] = await Promise.all([
|
|
@@ -18804,8 +18866,8 @@ var EkuboCLVault = class _EkuboCLVault extends BaseStrategy {
|
|
|
18804
18866
|
upperTick: _EkuboCLVault.i129ToNumber(result.bounds.upper)
|
|
18805
18867
|
};
|
|
18806
18868
|
}
|
|
18807
|
-
static div2Power128(
|
|
18808
|
-
return Number(BigInt(
|
|
18869
|
+
static div2Power128(num17) {
|
|
18870
|
+
return Number(BigInt(num17.toString()) * BigInt(1e18) / BigInt(2 ** 128)) / 1e18;
|
|
18809
18871
|
}
|
|
18810
18872
|
static priceToTick(price, isRoundDown, tickSpacing) {
|
|
18811
18873
|
const value = isRoundDown ? Math.floor(Math.log(price) / Math.log(1.000001)) : Math.ceil(Math.log(price) / Math.log(1.000001));
|
|
@@ -30432,7 +30494,8 @@ var vesuPrimeUSDC = {
|
|
|
30432
30494
|
name: "Vesu Prime USDC",
|
|
30433
30495
|
decimals: 18,
|
|
30434
30496
|
logo: usdc.logo,
|
|
30435
|
-
displayDecimals: 2
|
|
30497
|
+
displayDecimals: 2,
|
|
30498
|
+
indexingType: "ignore" /* IGNORE */
|
|
30436
30499
|
};
|
|
30437
30500
|
var strk = Global.getDefaultTokens().find((t) => t.symbol === "STRK");
|
|
30438
30501
|
function getYoloVaultErc4626Config(mainToken, secondaryToken) {
|
|
@@ -37424,6 +37487,12 @@ var SVKStrategy = class extends BaseStrategy {
|
|
|
37424
37487
|
const maxWithdrawables = await Promise.all(this.metadata.additionalInfo.adapters.map((adapter) => adapter.adapter.maxWithdraw()));
|
|
37425
37488
|
return maxWithdrawables;
|
|
37426
37489
|
}
|
|
37490
|
+
async getMaxTVL() {
|
|
37491
|
+
const lstToken = this.asset();
|
|
37492
|
+
const depositLimit = await this.contract.call("get_deposit_limit", []);
|
|
37493
|
+
const limitBN = import_starknet34.uint256.uint256ToBN(depositLimit);
|
|
37494
|
+
return Web3Number.fromWei(limitBN.toString(), lstToken.decimals);
|
|
37495
|
+
}
|
|
37427
37496
|
};
|
|
37428
37497
|
|
|
37429
37498
|
// src/strategies/universal-strategy.tsx
|
|
@@ -38294,7 +38363,6 @@ var getUniversalRisk = () => ({
|
|
|
38294
38363
|
var createUniversalSettings = (tokenSymbol, maxTVLDecimals) => {
|
|
38295
38364
|
const isUSDT = tokenSymbol === "USDT";
|
|
38296
38365
|
return {
|
|
38297
|
-
maxTVL: Web3Number.fromWei(0, maxTVLDecimals),
|
|
38298
38366
|
isAudited: true,
|
|
38299
38367
|
liveStatus: isUSDT ? "Retired" /* RETIRED */ : "Active" /* ACTIVE */,
|
|
38300
38368
|
isPaused: isUSDT,
|
|
@@ -38918,41 +38986,270 @@ var UniversalLstMultiplierStrategy = class _UniversalLstMultiplierStrategy exten
|
|
|
38918
38986
|
}
|
|
38919
38987
|
async netAPY() {
|
|
38920
38988
|
const unusedBalance = await this.getUnusedBalance();
|
|
38921
|
-
const
|
|
38922
|
-
|
|
38923
|
-
|
|
38989
|
+
const maxNewDeposits = await this.maxNewDeposits({
|
|
38990
|
+
isAPYComputation: true
|
|
38991
|
+
});
|
|
38992
|
+
const lstAPY = await this.getLSTAPR(
|
|
38993
|
+
this.getLSTUnderlyingTokenInfo().address
|
|
38994
|
+
);
|
|
38995
|
+
if (maxNewDeposits * 1.5 < unusedBalance.amount.toNumber()) {
|
|
38924
38996
|
logger.verbose(
|
|
38925
38997
|
`${this.getTag()}::netAPY: unused balance is > max servicable from loan, lstAPY: ${lstAPY}`
|
|
38926
38998
|
);
|
|
38927
|
-
const
|
|
38999
|
+
const { positions, baseAPYs, rewardAPYs } = await this.getVesuAPYs();
|
|
39000
|
+
const unusedBalanceAPY = await this.getUnusedBalanceAPY();
|
|
39001
|
+
baseAPYs.push(...[unusedBalanceAPY.apy]);
|
|
39002
|
+
rewardAPYs.push(0);
|
|
39003
|
+
const weights = positions.map((p, index) => p.usdValue * (index % 2 == 0 ? 1 : -1));
|
|
39004
|
+
weights.push(unusedBalanceAPY.weight);
|
|
39005
|
+
const prevAUM = await this.getPrevAUM();
|
|
39006
|
+
const price = await this.pricer.getPrice(this.metadata.depositTokens[0].symbol);
|
|
39007
|
+
const prevAUMUSD = prevAUM.multipliedBy(price.price);
|
|
39008
|
+
const output = await this.returnNetAPY(baseAPYs, rewardAPYs, weights, prevAUMUSD);
|
|
38928
39009
|
output.splits.push({ apy: lstAPY, id: "lst_apy" });
|
|
38929
39010
|
return output;
|
|
38930
39011
|
} else {
|
|
38931
39012
|
logger.verbose(
|
|
38932
39013
|
`${this.getTag()}::netAPY: we can take more deposits, use theoretical max APY`
|
|
38933
39014
|
);
|
|
38934
|
-
const
|
|
39015
|
+
const { positions, baseAPYs, rewardAPYs } = await this.getVesuAPYs();
|
|
39016
|
+
const weights = positions.map(
|
|
39017
|
+
(p, index) => p.usdValue * (index % 2 == 0 ? 1 : -1)
|
|
39018
|
+
);
|
|
39019
|
+
const aum = weights.reduce((acc, curr) => acc + curr, 0);
|
|
39020
|
+
const output = await this.returnNetAPY(
|
|
39021
|
+
baseAPYs,
|
|
39022
|
+
rewardAPYs,
|
|
39023
|
+
weights,
|
|
39024
|
+
new Web3Number(
|
|
39025
|
+
aum.toFixed(9),
|
|
39026
|
+
this.getLSTUnderlyingTokenInfo().decimals
|
|
39027
|
+
)
|
|
39028
|
+
);
|
|
38935
39029
|
output.splits.push({ apy: lstAPY, id: "lst_apy" });
|
|
38936
39030
|
return output;
|
|
38937
39031
|
}
|
|
38938
39032
|
}
|
|
38939
|
-
async
|
|
38940
|
-
|
|
38941
|
-
|
|
38942
|
-
|
|
38943
|
-
|
|
39033
|
+
async getVesuAPYs() {
|
|
39034
|
+
const vesuAdapters = this.getVesuAdapters();
|
|
39035
|
+
const allVesuPools = await VesuAdapter.getVesuPools();
|
|
39036
|
+
const pools = vesuAdapters.map((vesuAdapter) => {
|
|
39037
|
+
return allVesuPools.pools.find((p) => vesuAdapter.config.poolId.eqString(import_starknet36.num.getHexString(p.id)));
|
|
39038
|
+
});
|
|
39039
|
+
logger.verbose(`${this.metadata.name}::netAPY: vesu-pools: ${JSON.stringify(pools)}`);
|
|
39040
|
+
if (pools.some((p) => !p)) {
|
|
39041
|
+
throw new Error("Pool not found");
|
|
39042
|
+
}
|
|
39043
|
+
const positions = await this.getVesuPositions();
|
|
39044
|
+
logger.verbose(`${this.metadata.name}::netAPY: positions: ${JSON.stringify(positions)}`);
|
|
39045
|
+
const baseAPYs = [];
|
|
39046
|
+
const rewardAPYs = [];
|
|
39047
|
+
for (const [index, pool] of pools.entries()) {
|
|
39048
|
+
const vesuAdapter = vesuAdapters[index];
|
|
39049
|
+
const collateralAsset = pool.assets.find((a) => a.symbol.toLowerCase() === vesuAdapter.config.collateral.symbol.toLowerCase())?.stats;
|
|
39050
|
+
const debtAsset = pool.assets.find((a) => a.symbol.toLowerCase() === vesuAdapter.config.debt.symbol.toLowerCase())?.stats;
|
|
39051
|
+
const supplyApy = Number(collateralAsset.supplyApy.value || 0) / 1e18;
|
|
39052
|
+
const lstAPY = await this.getLSTAPR(vesuAdapter.config.collateral.address);
|
|
39053
|
+
logger.verbose(`${this.metadata.name}::netAPY: ${vesuAdapter.config.collateral.symbol} LST APR from Endur: ${lstAPY}`);
|
|
39054
|
+
baseAPYs.push(...[supplyApy + lstAPY, Number(debtAsset.borrowApr.value) / 1e18]);
|
|
39055
|
+
rewardAPYs.push(...[Number(collateralAsset.defiSpringSupplyApr?.value || "0") / 1e18, 0]);
|
|
38944
39056
|
}
|
|
38945
|
-
|
|
39057
|
+
logger.verbose(`${this.metadata.name}::netAPY: baseAPYs: ${JSON.stringify(baseAPYs)}`);
|
|
39058
|
+
logger.verbose(`${this.metadata.name}::netAPY: rewardAPYs: ${JSON.stringify(rewardAPYs)}`);
|
|
39059
|
+
assert(baseAPYs.length == positions.length, "APYs and positions length mismatch");
|
|
39060
|
+
return {
|
|
39061
|
+
baseAPYs,
|
|
39062
|
+
rewardAPYs,
|
|
39063
|
+
positions
|
|
39064
|
+
};
|
|
39065
|
+
}
|
|
39066
|
+
async returnNetAPY(baseAPYs, rewardAPYs, weights, prevAUMUSD) {
|
|
39067
|
+
if (weights.every((p) => p == 0)) {
|
|
39068
|
+
return {
|
|
39069
|
+
net: 0,
|
|
39070
|
+
splits: [{
|
|
39071
|
+
apy: 0,
|
|
39072
|
+
id: "base"
|
|
39073
|
+
}, {
|
|
39074
|
+
apy: 0,
|
|
39075
|
+
id: "defispring"
|
|
39076
|
+
}]
|
|
39077
|
+
};
|
|
39078
|
+
}
|
|
39079
|
+
const baseAPY = this.computeAPY(baseAPYs, weights, prevAUMUSD);
|
|
39080
|
+
const rewardAPY = this.computeAPY(rewardAPYs, weights, prevAUMUSD);
|
|
39081
|
+
const netAPY = baseAPY + rewardAPY;
|
|
39082
|
+
logger.verbose(`${this.metadata.name}::netAPY: net: ${netAPY}, baseAPY: ${baseAPY}, rewardAPY: ${rewardAPY}`);
|
|
39083
|
+
return {
|
|
39084
|
+
net: netAPY,
|
|
39085
|
+
splits: [{
|
|
39086
|
+
apy: baseAPY,
|
|
39087
|
+
id: "base"
|
|
39088
|
+
}, {
|
|
39089
|
+
apy: rewardAPY,
|
|
39090
|
+
id: "defispring"
|
|
39091
|
+
}]
|
|
39092
|
+
};
|
|
38946
39093
|
}
|
|
38947
39094
|
async getUnusedBalanceAPY() {
|
|
38948
39095
|
const unusedBalance = await this.getUnusedBalance();
|
|
38949
|
-
const
|
|
39096
|
+
const vesuAdapter = this.getVesuSameTokenAdapter();
|
|
39097
|
+
const underlying = vesuAdapter.config.debt;
|
|
38950
39098
|
const lstAPY = await this.getLSTAPR(underlying.address);
|
|
38951
39099
|
return {
|
|
38952
39100
|
apy: lstAPY,
|
|
38953
39101
|
weight: unusedBalance.usdValue
|
|
38954
39102
|
};
|
|
38955
39103
|
}
|
|
39104
|
+
computeAPY(apys, weights, currentAUM) {
|
|
39105
|
+
assert(apys.length === weights.length, "APYs and weights length mismatch");
|
|
39106
|
+
const weightedSum = apys.reduce((acc, apy, i) => acc + apy * weights[i], 0);
|
|
39107
|
+
logger.verbose(`${this.getTag()} computeAPY: apys: ${JSON.stringify(apys)}, weights: ${JSON.stringify(weights)}, weightedSum: ${weightedSum}, currentAUM: ${currentAUM}`);
|
|
39108
|
+
return weightedSum / currentAUM.toNumber();
|
|
39109
|
+
}
|
|
39110
|
+
getVesuAdapters() {
|
|
39111
|
+
const multiply = this.getVesuMultiplyAdapters();
|
|
39112
|
+
return multiply.map((m) => m._vesuAdapter);
|
|
39113
|
+
}
|
|
39114
|
+
async getVesuPositions(blockNumber = "latest") {
|
|
39115
|
+
const adapters = this.getVesuAdapters();
|
|
39116
|
+
const positions = [];
|
|
39117
|
+
for (const adapter of adapters) {
|
|
39118
|
+
positions.push(...await adapter.getPositions(this.config, blockNumber));
|
|
39119
|
+
}
|
|
39120
|
+
return positions;
|
|
39121
|
+
}
|
|
39122
|
+
async getUnusedBalance() {
|
|
39123
|
+
const balance = await new ERC20(this.config).balanceOf(this.asset().address, this.metadata.additionalInfo.vaultAllocator, this.asset().decimals);
|
|
39124
|
+
const price = await this.pricer.getPrice(this.metadata.depositTokens[0].symbol);
|
|
39125
|
+
const usdValue = Number(balance.toFixed(6)) * price.price;
|
|
39126
|
+
return {
|
|
39127
|
+
tokenInfo: this.asset(),
|
|
39128
|
+
amount: balance,
|
|
39129
|
+
usdValue
|
|
39130
|
+
};
|
|
39131
|
+
}
|
|
39132
|
+
async maxNewDeposits(params = { isAPYComputation: false }) {
|
|
39133
|
+
const maxBorrowableAmounts = await this.getMaxBorrowableAmount(params);
|
|
39134
|
+
let numerator = 0;
|
|
39135
|
+
for (let adapter of this.getVesuAdapters()) {
|
|
39136
|
+
const maxBorrowableAmountInfo = maxBorrowableAmounts.maxBorrowables.find(
|
|
39137
|
+
(b) => b.borrowableAsset.address.eq(adapter.config.debt.address)
|
|
39138
|
+
);
|
|
39139
|
+
if (!maxBorrowableAmountInfo || !maxBorrowableAmountInfo?.amount) {
|
|
39140
|
+
throw new Error(
|
|
39141
|
+
`Max borrowable amount not found for adapter: ${adapter.config.debt.symbol}`
|
|
39142
|
+
);
|
|
39143
|
+
}
|
|
39144
|
+
numerator += this.metadata.additionalInfo.targetHealthFactor * maxBorrowableAmountInfo.amount.toNumber() / maxBorrowableAmountInfo.ltv;
|
|
39145
|
+
}
|
|
39146
|
+
return numerator - maxBorrowableAmounts.netMaxBorrowableAmount.toNumber();
|
|
39147
|
+
}
|
|
39148
|
+
async getMaxBorrowableAmount(params = { isAPYComputation: false }) {
|
|
39149
|
+
const vesuAdapters = this.getVesuAdapters();
|
|
39150
|
+
let netMaxBorrowableAmount = Web3Number.fromWei("0", this.getLSTUnderlyingTokenInfo().decimals);
|
|
39151
|
+
const maxBorrowables = [];
|
|
39152
|
+
for (const vesuAdapter of vesuAdapters) {
|
|
39153
|
+
const output = await this.getMaxBorrowableAmountByVesuAdapter(
|
|
39154
|
+
vesuAdapter,
|
|
39155
|
+
params.isAPYComputation
|
|
39156
|
+
);
|
|
39157
|
+
const ltv = await vesuAdapter.getLTVConfig(this.config);
|
|
39158
|
+
maxBorrowables.push({ ...output, ltv, poolId: vesuAdapter.config.poolId });
|
|
39159
|
+
}
|
|
39160
|
+
maxBorrowables.sort((a, b) => b.amount.toNumber() - a.amount.toNumber());
|
|
39161
|
+
netMaxBorrowableAmount = maxBorrowables.reduce(
|
|
39162
|
+
(acc, curr) => acc.plus(curr.amount),
|
|
39163
|
+
Web3Number.fromWei("0", this.getLSTUnderlyingTokenInfo().decimals)
|
|
39164
|
+
);
|
|
39165
|
+
return { netMaxBorrowableAmount, maxBorrowables };
|
|
39166
|
+
}
|
|
39167
|
+
async getMaxSwappableWithMaxSlippage(fromToken, toToken, maxSlippage, maxAmount) {
|
|
39168
|
+
const output = await findMaxInputWithSlippage({
|
|
39169
|
+
apiGetOutput: async (inputAmount) => {
|
|
39170
|
+
const ekuboQuoter = new EkuboQuoter(this.config, this.pricer);
|
|
39171
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
39172
|
+
const quote = await ekuboQuoter.getQuoteExactInput(
|
|
39173
|
+
fromToken.address.address,
|
|
39174
|
+
toToken.address.address,
|
|
39175
|
+
new Web3Number(inputAmount.toFixed(9), fromToken.decimals)
|
|
39176
|
+
);
|
|
39177
|
+
return Web3Number.fromWei(
|
|
39178
|
+
quote.total_calculated.toString(),
|
|
39179
|
+
toToken.decimals
|
|
39180
|
+
).toNumber();
|
|
39181
|
+
},
|
|
39182
|
+
maxInput: maxAmount.toNumber(),
|
|
39183
|
+
maxSlippagePercent: maxSlippage,
|
|
39184
|
+
tolerance: 1e-3,
|
|
39185
|
+
referenceRate: 1
|
|
39186
|
+
});
|
|
39187
|
+
return new Web3Number(output.optimalInput, fromToken.decimals);
|
|
39188
|
+
}
|
|
39189
|
+
async getMaxBorrowableAmountByVesuAdapter(vesuAdapter, isAPYComputation) {
|
|
39190
|
+
const lstAPY = await this.getLSTAPR(
|
|
39191
|
+
this.getLSTUnderlyingTokenInfo().address
|
|
39192
|
+
);
|
|
39193
|
+
const maxInterestRate = lstAPY * 0.8;
|
|
39194
|
+
const { maxDebtToHave: maxBorrowableAmount, currentDebt } = await vesuAdapter.getMaxBorrowableByInterestRate(
|
|
39195
|
+
this.config,
|
|
39196
|
+
vesuAdapter.config.debt,
|
|
39197
|
+
maxInterestRate
|
|
39198
|
+
);
|
|
39199
|
+
const debtCap = await vesuAdapter.getDebtCap(this.config);
|
|
39200
|
+
if (currentDebt.gte(debtCap)) {
|
|
39201
|
+
return {
|
|
39202
|
+
amount: Web3Number.fromWei("0", vesuAdapter.config.debt.decimals),
|
|
39203
|
+
dexSwappableAmount: Web3Number.fromWei(
|
|
39204
|
+
"0",
|
|
39205
|
+
vesuAdapter.config.debt.decimals
|
|
39206
|
+
),
|
|
39207
|
+
maxBorrowableAmount: Web3Number.fromWei(
|
|
39208
|
+
"0",
|
|
39209
|
+
vesuAdapter.config.debt.decimals
|
|
39210
|
+
),
|
|
39211
|
+
borrowableAsset: vesuAdapter.config.debt
|
|
39212
|
+
};
|
|
39213
|
+
}
|
|
39214
|
+
const availableToBorrow = debtCap.minus(currentDebt);
|
|
39215
|
+
const maxBorrowable = maxBorrowableAmount.minimum(availableToBorrow).multipliedBy(0.999);
|
|
39216
|
+
if (vesuAdapter.config.debt.address.eq(
|
|
39217
|
+
this.getLSTUnderlyingTokenInfo().address
|
|
39218
|
+
) || isAPYComputation) {
|
|
39219
|
+
return {
|
|
39220
|
+
amount: maxBorrowable,
|
|
39221
|
+
dexSwappableAmount: maxBorrowable,
|
|
39222
|
+
maxBorrowableAmount: maxBorrowable,
|
|
39223
|
+
borrowableAsset: vesuAdapter.config.debt
|
|
39224
|
+
};
|
|
39225
|
+
}
|
|
39226
|
+
try {
|
|
39227
|
+
const maxSwappable = await this.getMaxSwappableWithMaxSlippage(
|
|
39228
|
+
vesuAdapter.config.debt,
|
|
39229
|
+
this.getLSTUnderlyingTokenInfo(),
|
|
39230
|
+
2e-4,
|
|
39231
|
+
maxBorrowable
|
|
39232
|
+
);
|
|
39233
|
+
return {
|
|
39234
|
+
amount: maxBorrowable.minimum(maxSwappable),
|
|
39235
|
+
dexSwappableAmount: maxSwappable,
|
|
39236
|
+
maxBorrowableAmount: maxBorrowable,
|
|
39237
|
+
borrowableAsset: vesuAdapter.config.debt
|
|
39238
|
+
};
|
|
39239
|
+
} catch (error) {
|
|
39240
|
+
logger.warn(`${this.getTag()}: Failed to get max swappable: ${error}`);
|
|
39241
|
+
const maxSwappable = Web3Number.fromWei(
|
|
39242
|
+
"0",
|
|
39243
|
+
vesuAdapter.config.debt.decimals
|
|
39244
|
+
);
|
|
39245
|
+
return {
|
|
39246
|
+
amount: maxBorrowable.minimum(maxSwappable),
|
|
39247
|
+
dexSwappableAmount: maxSwappable,
|
|
39248
|
+
maxBorrowableAmount: maxBorrowable,
|
|
39249
|
+
borrowableAsset: vesuAdapter.config.debt
|
|
39250
|
+
};
|
|
39251
|
+
}
|
|
39252
|
+
}
|
|
38956
39253
|
async getAUM(unrealizedAUM = false) {
|
|
38957
39254
|
const underlying = this.asset();
|
|
38958
39255
|
assert(underlying.symbol.startsWith("x"), "Underlying is not an LST of Endur");
|
|
@@ -39315,6 +39612,9 @@ var hyperxWBTC = {
|
|
|
39315
39612
|
borrowable_assets: [{
|
|
39316
39613
|
tokenInfo: Global.getDefaultTokens().find((token) => token.symbol === "WBTC"),
|
|
39317
39614
|
poolId: VesuPools.Re7xBTC
|
|
39615
|
+
}, {
|
|
39616
|
+
tokenInfo: Global.getDefaultTokens().find((token) => token.symbol === "WBTC"),
|
|
39617
|
+
poolId: VesuPools.Prime
|
|
39318
39618
|
}],
|
|
39319
39619
|
underlyingToken: Global.getDefaultTokens().find((token) => token.symbol === "WBTC"),
|
|
39320
39620
|
quoteAmountToFetchPrice: new Web3Number("0.001", Global.getDefaultTokens().find((token) => token.symbol === "WBTC").decimals),
|
|
@@ -39384,29 +39684,11 @@ function getInvestmentSteps(lstSymbol, underlyingSymbol) {
|
|
|
39384
39684
|
`If required, adjust leverage or re-allocate assets within LST pool on Vesu to optimize yield`
|
|
39385
39685
|
];
|
|
39386
39686
|
}
|
|
39387
|
-
function getMaxTVL(lstSymbol) {
|
|
39388
|
-
const lstMaxTVLs = {
|
|
39389
|
-
xWBTC: 5,
|
|
39390
|
-
xLBTC: 5,
|
|
39391
|
-
xtBTC: 5,
|
|
39392
|
-
xsBTC: 5,
|
|
39393
|
-
xSTRK: 7e6
|
|
39394
|
-
};
|
|
39395
|
-
const maxTVLValue = lstMaxTVLs[lstSymbol] || 0;
|
|
39396
|
-
const token = Global.getDefaultTokens().find(
|
|
39397
|
-
(token2) => token2.symbol === lstSymbol
|
|
39398
|
-
);
|
|
39399
|
-
if (!token) {
|
|
39400
|
-
return Web3Number.fromWei(0, 18);
|
|
39401
|
-
}
|
|
39402
|
-
return Web3Number.fromWei(maxTVLValue, token.decimals);
|
|
39403
|
-
}
|
|
39404
39687
|
function createHyperLSTSettings(lstSymbol, underlyingSymbol) {
|
|
39405
39688
|
const depositToken = Global.getDefaultTokens().find(
|
|
39406
39689
|
(token) => token.symbol === lstSymbol
|
|
39407
39690
|
);
|
|
39408
39691
|
return {
|
|
39409
|
-
maxTVL: getMaxTVL(lstSymbol),
|
|
39410
39692
|
isPaused: false,
|
|
39411
39693
|
liveStatus: "Hot & New \u{1F525}" /* HOT */,
|
|
39412
39694
|
isAudited: true,
|
|
@@ -39445,8 +39727,7 @@ var HYPER_LST_SECURITY = {
|
|
|
39445
39727
|
},
|
|
39446
39728
|
accessControl: {
|
|
39447
39729
|
type: "Standard Account" /* STANDARD_ACCOUNT */,
|
|
39448
|
-
addresses: [ContractAddr.from("
|
|
39449
|
-
timeLock: "2 Days"
|
|
39730
|
+
addresses: [ContractAddr.from("0x03495dd1e4838aa06666aac236036d86e81a6553e222fc02e70c2cbc0062e8d0")]
|
|
39450
39731
|
}
|
|
39451
39732
|
};
|
|
39452
39733
|
var HYPER_LST_REDEMPTION_INFO = {
|
|
@@ -40399,7 +40680,6 @@ function getStrategySettings2(settings, meta) {
|
|
|
40399
40680
|
logo: "https://assets.troves.fi/integrations/unwraplabs/white.png"
|
|
40400
40681
|
},
|
|
40401
40682
|
settings: {
|
|
40402
|
-
maxTVL: Web3Number.fromWei(0, depositToken.decimals),
|
|
40403
40683
|
liveStatus: "Hot & New \u{1F525}" /* HOT */,
|
|
40404
40684
|
isPaused: false,
|
|
40405
40685
|
isAudited: true,
|
|
@@ -41398,6 +41678,7 @@ var deployer_default = Deployer;
|
|
|
41398
41678
|
TRANSFER_SANITIZER,
|
|
41399
41679
|
TelegramGroupNotif,
|
|
41400
41680
|
TelegramNotif,
|
|
41681
|
+
TokenIndexingType,
|
|
41401
41682
|
TokenMarketData,
|
|
41402
41683
|
TokenTransferAdapter,
|
|
41403
41684
|
UNIVERSAL_ADAPTER_IDS,
|