@1delta/margin-fetcher 5.0.111 → 5.0.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -13501,6 +13501,14 @@ interface EarnShareToken {
13501
13501
  * Lagoon (18-decimal shares over 6-decimal USDC) — never assume they match.
13502
13502
  */
13503
13503
  decimals: number;
13504
+ /**
13505
+ * The share's asset group in the token lists (`Nest BlackOpal LiquidStone II Vault::nOPAL`),
13506
+ * when they carry it — what an asset page asks for as "the vaults that mint this"
13507
+ * (`shareGroup=`). Absent when the lists do not know the share.
13508
+ */
13509
+ assetGroup?: string;
13510
+ /** The share's own icon from the token lists, when they carry one. */
13511
+ logoURI?: string;
13504
13512
  }
13505
13513
  /**
13506
13514
  * A position whose unit is a POOL POSITION over several tokens.
@@ -15556,7 +15564,7 @@ type SvmEarnBuildability = {
15556
15564
  ok: false;
15557
15565
  reason: string;
15558
15566
  };
15559
- /** Vault providers, and `savings` by brand (one provider, one builder per brand). */
15567
+ /** Vault providers, and `savings` / `lst` by brand (one provider, one builder per brand). */
15560
15568
  declare const SVM_EARN_VAULT_BUILDERS: {
15561
15569
  readonly [key: string]: SvmEarnBuilder;
15562
15570
  };
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao,
5
5
  export { hasCrossMarginRisk, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
6
  import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, flyingTulipLendersByChain, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, coolerLendersByChain, llamaLendLendersByChain, usddLendersByChain, skyLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, fraxlendLendersByChain, twyneLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, dolomiteIsolationMarket, morphoTypeMarkets, resolveTermApiBase, flyingTulipConfigFor, flyingTulipAssetsFor, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, coolerConfigFor, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, fraxlendConfigFor, dssConfigFor, dssChainData, dssDebtToken, dssDebtJoin, frankencoinConfigFor, frankencoinChainData, aaveTokens, compoundV3BaseData, compoundV2TokenArray, morphoTypeVaults, eulerConfigs, fluidVaultEntries, gearboxMarketConfigurators, dolomiteIsolation, liquityMarkets, riverMarkets, tellerConfig, tellerPools, termMarkets, termMaxConfig, midnightMarkets, midnightCollateralRef, llamaLendMarkets, fraxlendPairsFor, inverseMarkets, curvanceConfig, frankencoinMarkets, twyneMarkets, twyneConfigFor, exactlyMarkets, aaveOracles, resolveMidnightApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, listaCollateralProvider, gearboxMarketCompressor, gearboxV3LenderKey, midnightMarketsByChain, twyneChainData, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2OraclesConfig, compoundV3OraclesData, compoundV2Reserves, aaveV4Oracles, morphoTypeOracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
- import { Chain, isEvmChainId, isSvmChainId } from '@1delta/chain-registry';
8
+ import { Chain, isEvmChainId, isRetiredChain, isSvmChainId } from '@1delta/chain-registry';
9
9
  import { multicallRetryUniversal, getEvmClient, getEvmChain, createMulticallRetryUniversal, LIST_OVERRIDES, getEvmClientUniversal } from '@1delta/providers';
10
10
  import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, CurveTricryptoOracleAbi, Erc20Abi, CoolerMonoAbi, CoolerLtvOracleAbi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, TwyneCollateralVaultAbi, MetaMorphoAbi, FluidDexResolverAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, FlyingTulipLendingLensAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, ResupplyUtilitiesAbi, ResupplyRewardHandlerAbi, ResupplyPairEmissionsAbi, ConvexPoolUtilAbi, FraxlendPairAbi, FraxlendLeverAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, TwyneVaultManagerAbi, TwyneCollateralVaultFactoryAbi, AaveV2V3Abi, TwyneATokenWrapperAbi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
11
11
  export { MorphoLensAbi } from '@1delta/abis';
@@ -6390,6 +6390,7 @@ var ENABLED_EULER_V2_CHAINS = [
6390
6390
  Chain.HYPEREVM
6391
6391
  ];
6392
6392
  var getLendersForChain = (c) => {
6393
+ if (isRetiredChain(c)) return [];
6393
6394
  let lenders = [];
6394
6395
  Object.entries(aavePools() ?? {}).forEach(([l, data]) => {
6395
6396
  const chains = Object.keys(data);
@@ -10965,7 +10966,6 @@ var MORPHO_LENS = {
10965
10966
  [Chain.ROBINHOOD_CHAIN]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
10966
10967
  [Chain.STABLE_MAINNET]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
10967
10968
  [Chain.LISK]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
10968
- [Chain.ABSTRACT]: "0x8e24cfc19c6c00c524353cb8816f5f1c2f33c201",
10969
10969
  [Chain.INK]: "0x0bd7473CbBf81d9dD936c61117eD230d95006CA2",
10970
10970
  [Chain.KAIA_MAINNET]: "0x925716D57c842B50806884EDb295bA3E3A8EBdFE",
10971
10971
  // blue-api does not index these four, so the lens is the ONLY way to read
@@ -44710,6 +44710,65 @@ var rethFetcher = {
44710
44710
  }
44711
44711
  };
44712
44712
 
44713
+ // src/yields/intrinsic/fetchers/defillama.ts
44714
+ var POOLS_ENRICHED = "https://yields.llama.fi/poolsEnriched?pool=";
44715
+ var fetchDefiLlamaApy = async (poolId) => {
44716
+ const res = await fetch(POOLS_ENRICHED + poolId, {
44717
+ headers: { accept: "application/json" },
44718
+ signal: AbortSignal.timeout(8e3)
44719
+ });
44720
+ if (!res.ok) throw new Error(`DefiLlama HTTP ${res.status}`);
44721
+ const json = await res.json();
44722
+ const apy = json?.data?.[0]?.apy;
44723
+ if (typeof apy !== "number" || !Number.isFinite(apy)) {
44724
+ throw new Error(`DefiLlama: no apy for pool ${poolId}`);
44725
+ }
44726
+ return apy;
44727
+ };
44728
+
44729
+ // src/yields/intrinsic/fetchers/sanctum.ts
44730
+ var KAMINO_STAKING_YIELDS = "https://api.kamino.finance/staking-yields/tokens";
44731
+ var INF_MINT = "5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm";
44732
+ var INF_LLAMA_POOL = "3075a746-bdd1-4aac-bcd5-b035abee2622";
44733
+ var INF_KEY = "Infinity::INF::solana";
44734
+ var INF_EPOCHS = 10;
44735
+ var MAX_PLAUSIBLE_APY = 0.3;
44736
+ function meanEpochApy(rows, n = INF_EPOCHS) {
44737
+ if (!Array.isArray(rows)) return void 0;
44738
+ const ok3 = rows.map((r) => ({ epoch: Number(r?.epoch), apy: Number(r?.apy) })).filter(
44739
+ (r) => Number.isFinite(r.epoch) && Number.isFinite(r.apy) && r.apy > 0 && r.apy < MAX_PLAUSIBLE_APY
44740
+ ).sort((a, b) => b.epoch - a.epoch).slice(0, n);
44741
+ if (ok3.length === 0) return void 0;
44742
+ return ok3.reduce((s, r) => s + r.apy, 0) / ok3.length;
44743
+ }
44744
+ async function kaminoInfApy() {
44745
+ const end = /* @__PURE__ */ new Date();
44746
+ const start = new Date(end.getTime() - 30 * 864e5);
44747
+ const d = (x) => x.toISOString().slice(0, 10);
44748
+ const res = await fetch(
44749
+ `${KAMINO_STAKING_YIELDS}/${INF_MINT}/history?start=${d(start)}&end=${d(end)}`,
44750
+ {
44751
+ headers: { accept: "application/json" },
44752
+ signal: AbortSignal.timeout(8e3)
44753
+ }
44754
+ );
44755
+ if (!res.ok) throw new Error(`Kamino staking-yields HTTP ${res.status}`);
44756
+ return meanEpochApy(await res.json());
44757
+ }
44758
+ var infFetcher = {
44759
+ label: "SANCTUM_INF",
44760
+ fetch: async () => {
44761
+ const apy = await kaminoInfApy().catch((e) => {
44762
+ console.warn(`[sanctum] Kamino INF history unavailable: ${e.message}`);
44763
+ return void 0;
44764
+ });
44765
+ if (apy !== void 0) return { [INF_KEY]: apyToAprPercent(apy * 100) };
44766
+ const llama = await fetchDefiLlamaApy(INF_LLAMA_POOL);
44767
+ if (!(llama > 0) || llama >= MAX_PLAUSIBLE_APY * 100) return {};
44768
+ return { [INF_KEY]: apyToAprPercent(llama) };
44769
+ }
44770
+ };
44771
+
44713
44772
  // src/yields/intrinsic/fetchers/renzo.ts
44714
44773
  var EZETH_URL = "https://app.renzoprotocol.com/api/stats?chainId=1";
44715
44774
  var ezethFetcher = {
@@ -44719,6 +44778,41 @@ var ezethFetcher = {
44719
44778
  return { EZETH: Number(res.data.apr.data.rate) };
44720
44779
  }
44721
44780
  };
44781
+ var EZSOL_URL = "https://app.renzoprotocol.com/api/stats/ezsol";
44782
+ var KAMINO_STAKING_YIELDS2 = "https://api.kamino.finance/staking-yields/tokens";
44783
+ var EZSOL_MINT = "ezSoL6fY1PVdJcJsUpe5CM3xkfmy3zoVCABybm5WtiC";
44784
+ var JITOSOL_MINT = "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn";
44785
+ var EZSOL_KEY = "Renzo Restaked SOL::ezSOL::solana";
44786
+ var MAX_PLAUSIBLE_APR = 30;
44787
+ var ok2 = (x) => Number.isFinite(x) && x > 0 && x < MAX_PLAUSIBLE_APR;
44788
+ async function kaminoEpochApy(mint) {
44789
+ const end = /* @__PURE__ */ new Date();
44790
+ const start = new Date(end.getTime() - 30 * 864e5);
44791
+ const d = (x) => x.toISOString().slice(0, 10);
44792
+ const res = await fetch(
44793
+ `${KAMINO_STAKING_YIELDS2}/${mint}/history?start=${d(start)}&end=${d(end)}`,
44794
+ { signal: AbortSignal.timeout(8e3) }
44795
+ );
44796
+ if (!res.ok) throw new Error(`Kamino staking-yields HTTP ${res.status}`);
44797
+ return meanEpochApy(await res.json());
44798
+ }
44799
+ var ezsolFetcher = {
44800
+ label: "EZSOL",
44801
+ fetch: async () => {
44802
+ const issuer = await fetch(EZSOL_URL, { signal: AbortSignal.timeout(8e3) }).then((r) => r.json()).then((r) => Number(r?.data?.apr?.data)).catch((e) => {
44803
+ console.warn(`[renzo] ezSOL APR unavailable: ${e.message}`);
44804
+ return NaN;
44805
+ });
44806
+ if (ok2(issuer)) return { [EZSOL_KEY]: issuer };
44807
+ const [jito, vrt] = await Promise.all([
44808
+ kaminoEpochApy(JITOSOL_MINT).catch(() => void 0),
44809
+ kaminoEpochApy(EZSOL_MINT).catch(() => void 0)
44810
+ ]);
44811
+ if (jito === void 0 || vrt === void 0) return {};
44812
+ const apr = apyToAprPercent(jito * 100) + apyToAprPercent(vrt * 100);
44813
+ return ok2(apr) ? { [EZSOL_KEY]: apr } : {};
44814
+ }
44815
+ };
44722
44816
 
44723
44817
  // src/yields/intrinsic/fetchers/kelp.ts
44724
44818
  var RSETH_URL = "https://universe.kelpdao.xyz/rseth/totalApy";
@@ -44886,22 +44980,6 @@ var createTruFinFetcher = (staker, yieldKey) => ({
44886
44980
  var trumaticFetcher = createTruFinFetcher("MATIC", "TRUMATIC");
44887
44981
  var trupolFetcher = createTruFinFetcher("POL", "TRUPOL");
44888
44982
 
44889
- // src/yields/intrinsic/fetchers/defillama.ts
44890
- var POOLS_ENRICHED = "https://yields.llama.fi/poolsEnriched?pool=";
44891
- var fetchDefiLlamaApy = async (poolId) => {
44892
- const res = await fetch(POOLS_ENRICHED + poolId, {
44893
- headers: { accept: "application/json" },
44894
- signal: AbortSignal.timeout(8e3)
44895
- });
44896
- if (!res.ok) throw new Error(`DefiLlama HTTP ${res.status}`);
44897
- const json = await res.json();
44898
- const apy = json?.data?.[0]?.apy;
44899
- if (typeof apy !== "number" || !Number.isFinite(apy)) {
44900
- throw new Error(`DefiLlama: no apy for pool ${poolId}`);
44901
- }
44902
- return apy;
44903
- };
44904
-
44905
44983
  // src/yields/intrinsic/fetchers/kinetiq.ts
44906
44984
  var KHYPE_POOL_ID = "9f25a954-db87-4bb2-a8b2-4be0b843a44c";
44907
44985
  var KHYPE_KEY = "Kinetiq Staked HYPE::kHYPE";
@@ -47986,7 +48064,7 @@ var HASTRA_TOKEN_KEYS = {
47986
48064
  prime: HASTRA_PRIME_KEY,
47987
48065
  auto: HASTRA_AUTO_KEY
47988
48066
  };
47989
- var MAX_PLAUSIBLE_APR = 50;
48067
+ var MAX_PLAUSIBLE_APR2 = 50;
47990
48068
  function parseHastraPor(res) {
47991
48069
  const tokens = res?.demo_prime_card?.tokens;
47992
48070
  const out = {};
@@ -47995,7 +48073,7 @@ function parseHastraPor(res) {
47995
48073
  const key3 = HASTRA_TOKEN_KEYS[String(t?.token ?? "").toLowerCase()];
47996
48074
  if (!key3) continue;
47997
48075
  const apr = Number(t?.effective_rate);
47998
- if (Number.isFinite(apr) && apr > 0 && apr < MAX_PLAUSIBLE_APR)
48076
+ if (Number.isFinite(apr) && apr > 0 && apr < MAX_PLAUSIBLE_APR2)
47999
48077
  out[key3] = apr;
48000
48078
  }
48001
48079
  return out;
@@ -55742,49 +55820,6 @@ var onycFetcher = {
55742
55820
  }
55743
55821
  };
55744
55822
 
55745
- // src/yields/intrinsic/fetchers/sanctum.ts
55746
- var KAMINO_STAKING_YIELDS = "https://api.kamino.finance/staking-yields/tokens";
55747
- var INF_MINT = "5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm";
55748
- var INF_LLAMA_POOL = "3075a746-bdd1-4aac-bcd5-b035abee2622";
55749
- var INF_KEY = "Infinity::INF::solana";
55750
- var INF_EPOCHS = 10;
55751
- var MAX_PLAUSIBLE_APY = 0.3;
55752
- function meanEpochApy(rows, n = INF_EPOCHS) {
55753
- if (!Array.isArray(rows)) return void 0;
55754
- const ok2 = rows.map((r) => ({ epoch: Number(r?.epoch), apy: Number(r?.apy) })).filter(
55755
- (r) => Number.isFinite(r.epoch) && Number.isFinite(r.apy) && r.apy > 0 && r.apy < MAX_PLAUSIBLE_APY
55756
- ).sort((a, b) => b.epoch - a.epoch).slice(0, n);
55757
- if (ok2.length === 0) return void 0;
55758
- return ok2.reduce((s, r) => s + r.apy, 0) / ok2.length;
55759
- }
55760
- async function kaminoInfApy() {
55761
- const end = /* @__PURE__ */ new Date();
55762
- const start = new Date(end.getTime() - 30 * 864e5);
55763
- const d = (x) => x.toISOString().slice(0, 10);
55764
- const res = await fetch(
55765
- `${KAMINO_STAKING_YIELDS}/${INF_MINT}/history?start=${d(start)}&end=${d(end)}`,
55766
- {
55767
- headers: { accept: "application/json" },
55768
- signal: AbortSignal.timeout(8e3)
55769
- }
55770
- );
55771
- if (!res.ok) throw new Error(`Kamino staking-yields HTTP ${res.status}`);
55772
- return meanEpochApy(await res.json());
55773
- }
55774
- var infFetcher = {
55775
- label: "SANCTUM_INF",
55776
- fetch: async () => {
55777
- const apy = await kaminoInfApy().catch((e) => {
55778
- console.warn(`[sanctum] Kamino INF history unavailable: ${e.message}`);
55779
- return void 0;
55780
- });
55781
- if (apy !== void 0) return { [INF_KEY]: apyToAprPercent(apy * 100) };
55782
- const llama = await fetchDefiLlamaApy(INF_LLAMA_POOL);
55783
- if (!(llama > 0) || llama >= MAX_PLAUSIBLE_APY * 100) return {};
55784
- return { [INF_KEY]: apyToAprPercent(llama) };
55785
- }
55786
- };
55787
-
55788
55823
  // src/yields/intrinsic/fetchers/exponentTranching.ts
55789
55824
  var EXPONENT_APP_API = "https://app.exponent.finance/api/tranching-markets";
55790
55825
  var EXPONENT_SENIOR_GROUPS = {
@@ -56602,6 +56637,9 @@ var LENDING_ONLY_FETCHERS = [
56602
56637
  // pool, collateral on Kamino / Jupiter Lend / Project 0 / Save. Its earn
56603
56638
  // row lives in margin-fetcher-sol, so it is lending-only here.
56604
56639
  infFetcher,
56640
+ // ezSOL (Renzo, Solana): a Jito Restaking VRT over JitoSOL, Kamino
56641
+ // collateral. Its earn row lives in margin-fetcher-sol (`jito-vault`).
56642
+ ezsolFetcher,
56605
56643
  // Exponent senior tranches (srEHYUSD / srAUTO / srONyc / srnOPAL, Solana):
56606
56644
  // Loopscale loop collateral, no earn row.
56607
56645
  exponentSeniorFetcher,
@@ -63659,8 +63697,6 @@ var MORPHO_STUB_VAULTS = {
63659
63697
  // Pharos
63660
63698
  "1868": ["0x94665e0df3c8c25119d80b2e3c703ccd127bf37e"],
63661
63699
  // Soneium
63662
- "2741": ["0x225c6e63970bb04d0780b3abb047dba659ad3cec"],
63663
- // Abstract
63664
63700
  "2818": ["0x7cf2c1a184c2f17e0413a13b21b1fdafd51df08c"],
63665
63701
  // Morph
63666
63702
  "4114": ["0xc063aca30b0d56ff0a9e446a94f8cdb421ab89fb"],
@@ -75672,17 +75708,17 @@ var priceGlvVaults = async (chainId, multicallRetry, glvTokens, prices, marketIn
75672
75708
  const sp = price(prices, short);
75673
75709
  if (!lp || !sp) return;
75674
75710
  const indexPrices = [];
75675
- let ok2 = true;
75711
+ let ok3 = true;
75676
75712
  for (const m of markets) {
75677
75713
  const idx = marketIndexToken.get(m.toLowerCase());
75678
75714
  const ip = idx ? price(prices, idx) : void 0;
75679
75715
  if (!ip) {
75680
- ok2 = false;
75716
+ ok3 = false;
75681
75717
  break;
75682
75718
  }
75683
75719
  indexPrices.push(ip);
75684
75720
  }
75685
- if (!ok2) return;
75721
+ if (!ok3) return;
75686
75722
  calls.push({
75687
75723
  address: c.glvReader,
75688
75724
  name: "getGlvTokenPrice",
@@ -76173,8 +76209,12 @@ var PENDLE_CHAIN_IDS = /* @__PURE__ */ new Set([
76173
76209
  // Monad
76174
76210
  "146",
76175
76211
  // Sonic
76212
+ "196",
76213
+ // X Layer
76176
76214
  "999",
76177
76215
  // HyperEVM
76216
+ "4663",
76217
+ // Robinhood Chain
76178
76218
  "5000",
76179
76219
  // Mantle
76180
76220
  "8453",
@@ -84834,6 +84874,14 @@ var SVM_EARN_VAULT_BUILDERS = {
84834
84874
  verbs: ["deposit", "withdraw"],
84835
84875
  nativeDeposit: true,
84836
84876
  nativeWithdraw: true
84877
+ },
84878
+ // ezSOL (a Jito Restaking vault, served as `lst`): JitoSOL in (or SOL /
84879
+ // wSOL, minted to JitoSOL first), a ticket out after a 1–2 epoch
84880
+ // cooldown, the claim burns it into JitoSOL — no cancel exists
84881
+ "lst:Renzo": {
84882
+ verbs: ["deposit", "request-withdraw", "claim"],
84883
+ payAsset: true,
84884
+ nativeDeposit: true
84837
84885
  }
84838
84886
  };
84839
84887
  var UNBUILT_REASONS = {
@@ -84851,7 +84899,7 @@ function svmEarnBuildability(venue, brand) {
84851
84899
  return { ok: false, reason: "No Solana builder for this lender yet" };
84852
84900
  }
84853
84901
  const provider = venue.slice("vault.".length);
84854
- const key3 = provider === "savings" ? `savings:${brand ?? ""}` : provider;
84902
+ const key3 = provider === "savings" || provider === "lst" ? `${provider}:${brand ?? ""}` : provider;
84855
84903
  const builder = SVM_EARN_VAULT_BUILDERS[key3];
84856
84904
  if (builder) return { ok: true, builder };
84857
84905
  return {