@strkfarm/sdk 1.0.59 → 1.0.61

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.
@@ -1,7 +1,7 @@
1
1
  import { ContractAddr, Web3Number } from "@/dataTypes";
2
2
  import { BaseStrategy, SingleActionAmount, SingleTokenInfo } from "./base-strategy";
3
3
  import { PricerBase } from "@/modules/pricerBase";
4
- import { getNoRiskTags, IConfig, IStrategyMetadata, Protocols, RiskFactor, RiskType, VaultPosition } from "@/interfaces";
4
+ import { FAQ, getNoRiskTags, IConfig, IStrategyMetadata, Protocols, RiskFactor, RiskType, VaultPosition } from "@/interfaces";
5
5
  import { Call, CallData, Contract, num, uint256 } from "starknet";
6
6
  import { VesuRebalanceSettings } from "./vesu-rebalance";
7
7
  import { assert, LeafData, logger, StandardMerkleTree } from "@/utils";
@@ -12,6 +12,7 @@ import { Global } from "@/global";
12
12
  import { ERC20 } from "@/modules";
13
13
 
14
14
  export interface UniversalStrategySettings {
15
+ vaultAddress: ContractAddr,
15
16
  manager: ContractAddr,
16
17
  vaultAllocator: ContractAddr,
17
18
  redeemRequestNFT: ContractAddr,
@@ -290,6 +291,7 @@ export class UniversalStrategy<
290
291
  .plus(leg2AUM[0].usdValue / token1Price.price)
291
292
  .minus(leg1AUM[1].usdValue / token1Price.price)
292
293
  .minus(leg2AUM[1].amount);
294
+ logger.verbose(`${this.getTag()} Vesu AUM: leg1: ${leg1AUM[0].amount.toNumber()}, ${leg1AUM[1].amount.toNumber()}, leg2: ${leg2AUM[0].amount.toNumber()}, ${leg2AUM[1].amount.toNumber()}`);
293
295
 
294
296
  const zeroAmt = Web3Number.fromWei('0', this.asset().decimals);
295
297
  const net = {
@@ -549,20 +551,25 @@ export class UniversalStrategy<
549
551
  logger.verbose(`${this.getTag()}:: borrow1Amount: ${borrow1Amount.toString()} ${vesuAdapter1.config.debt.symbol}`);
550
552
  logger.verbose(`${this.getTag()}:: borrow2Amount: ${borrow2Amount.toString()} ${vesuAdapter2.config.debt.symbol}`);
551
553
 
552
- const callSet1 = this.getVesuModifyPositionCalls({
554
+ let callSet1 = this.getVesuModifyPositionCalls({
553
555
  isLeg1: true,
554
556
  isDeposit: params.isDeposit,
555
557
  depositAmount: params.leg1DepositAmount.plus(borrow2Amount),
556
558
  debtAmount: borrow1Amount
557
559
  });
558
560
 
559
- const callSet2 = this.getVesuModifyPositionCalls({
561
+ let callSet2 = this.getVesuModifyPositionCalls({
560
562
  isLeg1: false,
561
563
  isDeposit: params.isDeposit,
562
564
  depositAmount: borrow1Amount,
563
565
  debtAmount: borrow2Amount
564
566
  });
565
567
 
568
+ if (!params.isDeposit) {
569
+ let temp = callSet2;
570
+ callSet2 = [...callSet1];
571
+ callSet1 = [...temp];
572
+ }
566
573
  const allActions = [...callSet1.map(i => i.manageCall), ...callSet2.map(i => i.manageCall)];
567
574
  const flashloanCalldata = CallData.compile([
568
575
  [...callSet1.map(i => i.proofs), ...callSet2.map(i => i.proofs)],
@@ -583,6 +590,21 @@ export class UniversalStrategy<
583
590
  return manageCall;
584
591
  }
585
592
 
593
+ async getBringLiquidityCall(params: {
594
+ amount: Web3Number
595
+ }) {
596
+ const manage1Info = this.getProofs<ApproveCallParams>(UNIVERSAL_MANAGE_IDS.APPROVE_BRING_LIQUIDITY);
597
+ const manageCall1 = manage1Info.callConstructor({
598
+ amount: params.amount
599
+ });
600
+ const manage2Info = this.getProofs<ApproveCallParams>(UNIVERSAL_MANAGE_IDS.BRING_LIQUIDITY);
601
+ const manageCall2 = manage2Info.callConstructor({
602
+ amount: params.amount
603
+ });
604
+ const manageCall = this.getManageCall([UNIVERSAL_MANAGE_IDS.APPROVE_BRING_LIQUIDITY, UNIVERSAL_MANAGE_IDS.BRING_LIQUIDITY], [manageCall1, manageCall2]);
605
+ return manageCall;
606
+ }
607
+
586
608
  async getRebalanceCall(params: {
587
609
  isLeg1toLeg2: boolean,
588
610
  amount: Web3Number
@@ -616,12 +638,15 @@ export class UniversalStrategy<
616
638
  }
617
639
 
618
640
 
641
+ // useful to map readble names to proofs and calls
619
642
  export enum UNIVERSAL_MANAGE_IDS {
620
643
  FLASH_LOAN = 'flash_loan_init',
621
644
  VESU_LEG1 = 'vesu_leg1',
622
645
  VESU_LEG2 = 'vesu_leg2',
623
646
  APPROVE_TOKEN1 = 'approve_token1',
624
- APPROVE_TOKEN2 = 'approve_token2'
647
+ APPROVE_TOKEN2 = 'approve_token2',
648
+ APPROVE_BRING_LIQUIDITY = 'approve_bring_liquidity',
649
+ BRING_LIQUIDITY = 'bring_liquidity'
625
650
  }
626
651
 
627
652
  export enum UNIVERSAL_ADAPTERS {
@@ -635,7 +660,7 @@ function getLooperSettings(
635
660
  token2Symbol: string,
636
661
  vaultSettings: UniversalStrategySettings,
637
662
  pool1: ContractAddr,
638
- pool2: ContractAddr
663
+ pool2: ContractAddr,
639
664
  ) {
640
665
  const USDCToken = Global.getDefaultTokens().find(token => token.symbol === token1Symbol)!;
641
666
  const ETHToken = Global.getDefaultTokens().find(token => token.symbol === token2Symbol)!;
@@ -643,7 +668,9 @@ function getLooperSettings(
643
668
  const commonAdapter = new CommonAdapter({
644
669
  manager: vaultSettings.manager,
645
670
  asset: USDCToken.address,
646
- id: UNIVERSAL_MANAGE_IDS.FLASH_LOAN
671
+ id: UNIVERSAL_MANAGE_IDS.FLASH_LOAN,
672
+ vaultAddress: vaultSettings.vaultAddress,
673
+ vaultAllocator: vaultSettings.vaultAllocator,
647
674
  })
648
675
  const vesuAdapterUSDCETH = new VesuAdapter({
649
676
  poolId: pool1,
@@ -669,20 +696,28 @@ function getLooperSettings(
669
696
  id: UNIVERSAL_ADAPTERS.VESU_LEG2,
670
697
  adapter: vesuAdapterETHUSDC
671
698
  }])
699
+
700
+ // vesu looping
672
701
  vaultSettings.leafAdapters.push(commonAdapter.getFlashloanAdapter.bind(commonAdapter));
673
702
  vaultSettings.leafAdapters.push(vesuAdapterUSDCETH.getModifyPosition.bind(vesuAdapterUSDCETH));
674
703
  vaultSettings.leafAdapters.push(vesuAdapterETHUSDC.getModifyPosition.bind(vesuAdapterETHUSDC));
675
704
  vaultSettings.leafAdapters.push(commonAdapter.getApproveAdapter(USDCToken.address, vesuAdapterUSDCETH.VESU_SINGLETON, UNIVERSAL_MANAGE_IDS.APPROVE_TOKEN1).bind(commonAdapter));
676
705
  vaultSettings.leafAdapters.push(commonAdapter.getApproveAdapter(ETHToken.address, vesuAdapterETHUSDC.VESU_SINGLETON, UNIVERSAL_MANAGE_IDS.APPROVE_TOKEN2).bind(commonAdapter));
706
+
707
+ // to bridge liquidity back to vault (used by bring_liquidity)
708
+ vaultSettings.leafAdapters.push(commonAdapter.getApproveAdapter(USDCToken.address, vaultSettings.vaultAddress, UNIVERSAL_MANAGE_IDS.APPROVE_BRING_LIQUIDITY).bind(commonAdapter));
709
+ vaultSettings.leafAdapters.push(commonAdapter.getBringLiquidityAdapter(UNIVERSAL_MANAGE_IDS.BRING_LIQUIDITY).bind(commonAdapter));
677
710
  return vaultSettings;
678
711
  }
679
712
 
680
713
  const _riskFactor: RiskFactor[] = [
681
714
  { type: RiskType.SMART_CONTRACT_RISK, value: 0.5, weight: 25, reason: "Audited by Zellic" },
682
- { type: RiskType.LIQUIDATION_RISK, value: 1, weight: 50, reason: "Liquidation risk is mitigated btable price feed on Starknet" }
715
+ { type: RiskType.LIQUIDATION_RISK, value: 1.5, weight: 50, reason: "Liquidation risk is mitigated by stable price feed on Starknet" },
716
+ { type: RiskType.TECHNICAL_RISK, value: 1, weight: 50, reason: "Technical failures like risk monitoring failures" }
683
717
  ];
684
718
 
685
719
  const usdcVaultSettings: UniversalStrategySettings = {
720
+ vaultAddress: ContractAddr.from('0x7e6498cf6a1bfc7e6fc89f1831865e2dacb9756def4ec4b031a9138788a3b5e'),
686
721
  manager: ContractAddr.from('0xf41a2b1f498a7f9629db0b8519259e66e964260a23d20003f3e42bb1997a07'),
687
722
  vaultAllocator: ContractAddr.from('0x228cca1005d3f2b55cbaba27cb291dacf1b9a92d1d6b1638195fbd3d0c1e3ba'),
688
723
  redeemRequestNFT: ContractAddr.from('0x906d03590010868cbf7590ad47043959d7af8e782089a605d9b22567b64fda'),
@@ -694,6 +729,7 @@ const usdcVaultSettings: UniversalStrategySettings = {
694
729
  }
695
730
 
696
731
  const wbtcVaultSettings: UniversalStrategySettings = {
732
+ vaultAddress: ContractAddr.from('0x5a4c1651b913aa2ea7afd9024911603152a19058624c3e425405370d62bf80c'),
697
733
  manager: ContractAddr.from('0xef8a664ffcfe46a6af550766d27c28937bf1b77fb4ab54d8553e92bca5ba34'),
698
734
  vaultAllocator: ContractAddr.from('0x1e01c25f0d9494570226ad28a7fa856c0640505e809c366a9fab4903320e735'),
699
735
  redeemRequestNFT: ContractAddr.from('0x4fec59a12f8424281c1e65a80b5de51b4e754625c60cddfcd00d46941ec37b2'),
@@ -705,6 +741,7 @@ const wbtcVaultSettings: UniversalStrategySettings = {
705
741
  }
706
742
 
707
743
  const ethVaultSettings: UniversalStrategySettings = {
744
+ vaultAddress: ContractAddr.from('0x446c22d4d3f5cb52b4950ba832ba1df99464c6673a37c092b1d9622650dbd8'),
708
745
  manager: ContractAddr.from('0x494888b37206616bd09d759dcda61e5118470b9aa7f58fb84f21c778a7b8f97'),
709
746
  vaultAllocator: ContractAddr.from('0x4acc0ad6bea58cb578d60ff7c31f06f44369a7a9a7bbfffe4701f143e427bd'),
710
747
  redeemRequestNFT: ContractAddr.from('0x2e6cd71e5060a254d4db00655e420db7bf89da7755bb0d5f922e2f00c76ac49'),
@@ -716,6 +753,7 @@ const ethVaultSettings: UniversalStrategySettings = {
716
753
  }
717
754
 
718
755
  const strkVaultSettings: UniversalStrategySettings = {
756
+ vaultAddress: ContractAddr.from('0x55d012f57e58c96e0a5c7ebbe55853989d01e6538b15a95e7178aca4af05c21'),
719
757
  manager: ContractAddr.from('0xcc6a5153ca56293405506eb20826a379d982cd738008ef7e808454d318fb81'),
720
758
  vaultAllocator: ContractAddr.from('0xf29d2f82e896c0ed74c9eff220af34ac148e8b99846d1ace9fbb02c9191d01'),
721
759
  redeemRequestNFT: ContractAddr.from('0x46902423bd632c428376b84fcee9cac5dbe016214e93a8103bcbde6e1de656b'),
@@ -727,6 +765,7 @@ const strkVaultSettings: UniversalStrategySettings = {
727
765
  }
728
766
 
729
767
  const usdtVaultSettings: UniversalStrategySettings = {
768
+ vaultAddress: ContractAddr.from('0x1c4933d1880c6778585e597154eaca7b428579d72f3aae425ad2e4d26c6bb3'),
730
769
  manager: ContractAddr.from('0x39bb9843503799b552b7ed84b31c06e4ff10c0537edcddfbf01fe944b864029'),
731
770
  vaultAllocator: ContractAddr.from('0x56437d18c43727ac971f6c7086031cad7d9d6ccb340f4f3785a74cc791c931a'),
732
771
  redeemRequestNFT: ContractAddr.from('0x5af0c2a657eaa8e23ed78e855dac0c51e4f69e2cf91a18c472041a1f75bb41f'),
@@ -737,11 +776,172 @@ const usdtVaultSettings: UniversalStrategySettings = {
737
776
  minHealthFactor: 1.25
738
777
  }
739
778
 
779
+ type AllowedSources = 'vesu' | 'endur' | 'extended';
780
+ export default function MetaVaultDescription(allowedSources: AllowedSources[]) {
781
+ const logos: any = {
782
+ vesu: Protocols.VESU.logo,
783
+ endur: Protocols.ENDUR.logo,
784
+ extended: Protocols.EXTENDED.logo,
785
+ ekubo: "https://dummyimage.com/64x64/ffffff/000000&text=K",
786
+ };
787
+ const _sources = [
788
+ { key: "vesu", name: "Vesu", status: "Live", description: "Integrated liquidity venue used for automated routing to capture the best available yield." },
789
+ { key: "endur", name: "Endur", status: "Coming soon", description: "Planned integration to tap into STRK staking–backed yields via our LST pipeline." },
790
+ { key: "extended", name: "Extended", status: "Coming soon", description: "Expanding coverage to additional money markets and vaults across the ecosystem." },
791
+ // { key: "ekubo", name: "Ekubo", status: "Coming soon", description: "Concentrated liquidity strategies targeted for optimized fee APR harvesting." },
792
+ ];
793
+ const sources = _sources.filter(s => allowedSources.includes(s.key as any));
794
+
795
+ const containerStyle = {
796
+ maxWidth: "800px",
797
+ margin: "0 auto",
798
+ backgroundColor: "#111",
799
+ color: "#eee",
800
+ fontFamily: "Arial, sans-serif",
801
+ borderRadius: "12px",
802
+ };
803
+
804
+ const cardStyle = {
805
+ border: "1px solid #333",
806
+ borderRadius: "10px",
807
+ padding: "12px",
808
+ marginBottom: "12px",
809
+ backgroundColor: "#1a1a1a",
810
+ };
811
+
812
+ const logoStyle = {
813
+ width: "24px",
814
+ height: "24px",
815
+ borderRadius: "8px",
816
+ border: "1px solid #444",
817
+ backgroundColor: "#222",
818
+ };
819
+
820
+ return (
821
+ <div style={containerStyle}>
822
+ <h1 style={{ fontSize: "18px", marginBottom: "10px" }}>Meta Vault — Automated Yield Router</h1>
823
+ <p style={{ fontSize: "14px", lineHeight: "1.5", marginBottom: "16px" }}>
824
+ This Evergreen vault is a tokenized Meta Vault, auto-compounding strategy that continuously allocates your deposited
825
+ asset to the best available yield source in the ecosystem. Depositors receive vault shares that
826
+ represent a proportional claim on the underlying assets and accrued yield. Allocation shifts are
827
+ handled programmatically based on on-chain signals and risk filters, minimizing idle capital and
828
+ maximizing net APY.
829
+ </p>
830
+
831
+ <div style={{ backgroundColor: "#222", padding: "10px", borderRadius: "8px", marginBottom: "20px", border: "1px solid #444" }}>
832
+ <p style={{ fontSize: "13px", color: "#ccc" }}>
833
+ <strong>Withdrawals:</strong> Requests can take up to <strong>1-2 hours</strong> to process as the vault unwinds and settles routing.
834
+ </p>
835
+ </div>
836
+
837
+ <h2 style={{ fontSize: "18px", marginBottom: "10px" }}>Supported Yield Sources</h2>
838
+ {sources.map((s) => (
839
+ <div key={s.key} style={cardStyle}>
840
+ <div style={{ display: "flex", gap: "10px", alignItems: "flex-start" }}>
841
+ <img src={logos[s.key]} alt={`${s.name} logo`} style={logoStyle} />
842
+ <div style={{ flex: 1 }}>
843
+ <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
844
+ <h3 style={{ fontSize: "15px", margin: 0 }}>{s.name}</h3>
845
+ <StatusBadge status={s.status} />
846
+ </div>
847
+ {/* <p style={{ fontSize: "13px", color: "#ccc", marginTop: "4px" }}>{s.description}</p> */}
848
+ </div>
849
+ </div>
850
+ </div>
851
+ ))}
852
+ </div>
853
+ );
854
+ }
855
+
856
+ function StatusBadge({ status }: { status: string }) {
857
+ const isSoon = String(status).toLowerCase() !== "live";
858
+ const badgeStyle = {
859
+ fontSize: "12px",
860
+ padding: "2px 6px",
861
+ borderRadius: "12px",
862
+ border: "1px solid",
863
+ color: isSoon ? "rgb(196 196 195)" : "#6aff7d",
864
+ borderColor: isSoon ? "#484848" : "#6aff7d",
865
+ backgroundColor: isSoon ? "#424242" : "#002b1a",
866
+ };
867
+ return <span style={badgeStyle}>{status}</span>;
868
+ }
869
+
870
+ function getDescription(tokenSymbol: string, allowedSources: AllowedSources[]) {
871
+ return MetaVaultDescription(allowedSources);
872
+ }
873
+
874
+ function getFAQs(): FAQ[] {
875
+ return [
876
+ {
877
+ question: "What is the Meta Vault?",
878
+ answer:
879
+ "The Meta Vault is a tokenized strategy that automatically allocates your deposited assets to the best available yield source in the ecosystem. It optimizes returns while minimizing idle capital.",
880
+ },
881
+ {
882
+ question: "How does yield allocation work?",
883
+ answer:
884
+ "The vault continuously monitors supported protocols and routes liquidity to the source offering the highest net yield after accounting for fees, slippage, and gas costs. Reallocations are performed automatically.",
885
+ },
886
+ {
887
+ question: "Which yield sources are supported?",
888
+ answer: (
889
+ <span>
890
+ Currently, <strong>Vesu</strong> is live. Future integrations may include{" "}
891
+ <strong>Endur</strong>, <strong>Extended</strong>, and{" "}
892
+ <strong>Ekubo</strong> (all coming soon).
893
+ </span>
894
+ ),
895
+ },
896
+ {
897
+ question: "What do I receive when I deposit?",
898
+ answer:
899
+ "Depositors receive vault tokens representing their proportional share of the vault. These tokens entitle holders to both the principal and accrued yield.",
900
+ },
901
+ {
902
+ question: "How long do withdrawals take?",
903
+ answer:
904
+ "Withdrawals may take up to 1-2 hours to process, as the vault unwinds and settles liquidity routing across integrated protocols.",
905
+ },
906
+ {
907
+ question: "Is the Meta Vault non-custodial?",
908
+ answer:
909
+ "Yes. The Meta Vault operates entirely on-chain. Users always maintain control of their vault tokens, and the strategy is fully transparent.",
910
+ },
911
+ {
912
+ question: "How is risk managed?",
913
+ answer:
914
+ "Integrations are supported with active risk monitoring like liquidation risk. Only vetted protocols are included to balance yield with safety. However, usual Defi risks like smart contract risk, extreme volatile market risk, etc. are still present.",
915
+ },
916
+ {
917
+ question: "Are there any fees?",
918
+ answer:
919
+ "Troves charges a performance of 10% on the yield generated. The APY shown is net of this fee. This fee is only applied to the profits earned, ensuring that users retain their initial capital.",
920
+ },
921
+ ];
922
+ }
923
+
924
+ function getContractDetails(settings: UniversalStrategySettings): {address: ContractAddr, name: string}[] {
925
+ return [
926
+ { address: settings.vaultAddress, name: "Vault" },
927
+ { address: settings.manager, name: "Vault Manager" },
928
+ { address: settings.vaultAllocator, name: "Vault Allocator" },
929
+ { address: settings.redeemRequestNFT, name: "Redeem Request NFT" },
930
+ { address: settings.aumOracle, name: "AUM Oracle" },
931
+ ];
932
+ }
933
+
934
+ const investmentSteps: string[] = [
935
+ "Deposit funds into the vault",
936
+ "Vault manager allocates funds to optimal yield sources",
937
+ "Vault manager reports asset under management (AUM) regularly to the vault",
938
+ "Request withdrawal and vault manager processes it in 1-2 hours"
939
+ ]
740
940
  export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[] =
741
941
  [
742
942
  {
743
943
  name: "USDC Evergreen",
744
- description: "A universal strategy for managing USDC assets",
944
+ description: getDescription('USDC', ['vesu', 'extended']),
745
945
  address: ContractAddr.from('0x7e6498cf6a1bfc7e6fc89f1831865e2dacb9756def4ec4b031a9138788a3b5e'),
746
946
  launchBlock: 0,
747
947
  type: 'ERC4626',
@@ -756,13 +956,13 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
756
956
  },
757
957
  protocols: [Protocols.VESU],
758
958
  maxTVL: Web3Number.fromWei(0, 6),
759
- contractDetails: [],
760
- faqs: [],
761
- investmentSteps: [],
959
+ contractDetails: getContractDetails(usdcVaultSettings),
960
+ faqs: getFAQs(),
961
+ investmentSteps: investmentSteps,
762
962
  },
763
963
  {
764
964
  name: "WBTC Evergreen",
765
- description: "A universal strategy for managing WBTC assets",
965
+ description: getDescription('WBTC', ['vesu', 'endur', 'extended']),
766
966
  address: ContractAddr.from('0x5a4c1651b913aa2ea7afd9024911603152a19058624c3e425405370d62bf80c'),
767
967
  launchBlock: 0,
768
968
  type: 'ERC4626',
@@ -777,13 +977,13 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
777
977
  },
778
978
  protocols: [Protocols.VESU],
779
979
  maxTVL: Web3Number.fromWei(0, 8),
780
- contractDetails: [],
781
- faqs: [],
782
- investmentSteps: [],
980
+ contractDetails: getContractDetails(wbtcVaultSettings),
981
+ faqs: getFAQs(),
982
+ investmentSteps: investmentSteps,
783
983
  },
784
984
  {
785
985
  name: "ETH Evergreen",
786
- description: "A universal strategy for managing ETH assets",
986
+ description: getDescription('ETH', ['vesu', 'extended']),
787
987
  address: ContractAddr.from('0x446c22d4d3f5cb52b4950ba832ba1df99464c6673a37c092b1d9622650dbd8'),
788
988
  launchBlock: 0,
789
989
  type: 'ERC4626',
@@ -798,13 +998,13 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
798
998
  },
799
999
  protocols: [Protocols.VESU],
800
1000
  maxTVL: Web3Number.fromWei(0, 18),
801
- contractDetails: [],
802
- faqs: [],
803
- investmentSteps: [],
1001
+ contractDetails: getContractDetails(ethVaultSettings),
1002
+ faqs: getFAQs(),
1003
+ investmentSteps: investmentSteps,
804
1004
  },
805
1005
  {
806
1006
  name: "STRK Evergreen",
807
- description: "A universal strategy for managing STRK assets",
1007
+ description: getDescription('STRK', ['vesu', 'endur', 'extended']),
808
1008
  address: ContractAddr.from('0x55d012f57e58c96e0a5c7ebbe55853989d01e6538b15a95e7178aca4af05c21'),
809
1009
  launchBlock: 0,
810
1010
  type: 'ERC4626',
@@ -819,13 +1019,13 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
819
1019
  },
820
1020
  protocols: [Protocols.VESU],
821
1021
  maxTVL: Web3Number.fromWei(0, 18),
822
- contractDetails: [],
823
- faqs: [],
824
- investmentSteps: [],
1022
+ contractDetails: getContractDetails(strkVaultSettings),
1023
+ faqs: getFAQs(),
1024
+ investmentSteps: investmentSteps,
825
1025
  },
826
1026
  {
827
1027
  name: "USDT Evergreen",
828
- description: "A universal strategy for managing USDT assets",
1028
+ description: getDescription('USDT', ['vesu']),
829
1029
  address: ContractAddr.from('0x1c4933d1880c6778585e597154eaca7b428579d72f3aae425ad2e4d26c6bb3'),
830
1030
  launchBlock: 0,
831
1031
  type: 'ERC4626',
@@ -840,8 +1040,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
840
1040
  },
841
1041
  protocols: [Protocols.VESU],
842
1042
  maxTVL: Web3Number.fromWei(0, 6),
843
- contractDetails: [],
844
- faqs: [],
845
- investmentSteps: [],
1043
+ contractDetails: getContractDetails(usdtVaultSettings),
1044
+ faqs: getFAQs(),
1045
+ investmentSteps: investmentSteps,
846
1046
  }
847
1047
  ]