@1delta/margin-fetcher 5.0.42 → 5.0.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/index.js CHANGED
@@ -6566,7 +6566,7 @@ var AAVE_V3_EMODES = (chain, lender) => {
6566
6566
  if (chain === Chain.PLASMA_MAINNET) {
6567
6567
  if (lender === Lender.AAVE_V3) return range(25);
6568
6568
  }
6569
- return [0, 1, 2, 3, 4, 5, 6];
6569
+ return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
6570
6570
  };
6571
6571
  function yldrBaseline(assetsToQuery, providerAddress, aaveTokenMap) {
6572
6572
  return assetsToQuery.flatMap((tk) => [
@@ -44033,12 +44033,83 @@ var snusdFetcher = {
44033
44033
  }
44034
44034
  };
44035
44035
  var CHAIN_ID9 = Chain.ETHEREUM_MAINNET;
44036
+ var WITRY = "0xe346c29b5b60ef870b9724c57ccfbbc631e47dee";
44037
+ var BRIX_APY_URL = "https://brix.money/api/witry/apy-snapshot?windowDays=30&method=realized";
44038
+ var BRIX_DEFILLAMA_POOL = "da8c4ac9-733d-4a98-85a5-83b76b7e84d1";
44039
+ var VESTING_PERIOD = 248400n;
44040
+ var YEAR_SECONDS9 = 31536000n;
44041
+ var ONE_E188 = 10n ** 18n;
44042
+ var WITRY_KEY = "WITRY";
44043
+ var WITRY_GROUP_KEY = "Wrapped iTRY::WITRY";
44044
+ var STAKED_ITRY_ABI = [
44045
+ {
44046
+ name: "vestingAmount",
44047
+ type: "function",
44048
+ stateMutability: "view",
44049
+ inputs: [],
44050
+ outputs: [{ type: "uint256" }]
44051
+ },
44052
+ {
44053
+ name: "lastDistributionTimestamp",
44054
+ type: "function",
44055
+ stateMutability: "view",
44056
+ inputs: [],
44057
+ outputs: [{ type: "uint256" }]
44058
+ },
44059
+ {
44060
+ name: "totalAssets",
44061
+ type: "function",
44062
+ stateMutability: "view",
44063
+ inputs: [],
44064
+ outputs: [{ type: "uint256" }]
44065
+ }
44066
+ ];
44067
+ var fetchBrixAprPercent = async () => {
44068
+ const res = await fetch(BRIX_APY_URL, {
44069
+ headers: { accept: "application/json" },
44070
+ signal: AbortSignal.timeout(8e3)
44071
+ });
44072
+ if (!res.ok) throw new Error(`Brix HTTP ${res.status}`);
44073
+ const apr = Number((await res.json())?.stakingApr);
44074
+ if (!Number.isFinite(apr) || apr <= 0) throw new Error("stakingApr missing");
44075
+ return apr * 100;
44076
+ };
44077
+ var fetchWitryAprOnChain = async () => {
44078
+ const [vestingAmount, lastDistribution, totalAssets] = await multicallRetryUniversal({
44079
+ chain: CHAIN_ID9,
44080
+ abi: STAKED_ITRY_ABI,
44081
+ calls: [
44082
+ { address: WITRY, name: "vestingAmount", params: [] },
44083
+ { address: WITRY, name: "lastDistributionTimestamp", params: [] },
44084
+ { address: WITRY, name: "totalAssets", params: [] }
44085
+ ],
44086
+ allowFailure: false
44087
+ });
44088
+ if (totalAssets === 0n) throw new Error("wiTRY: empty vault");
44089
+ const elapsed = BigInt(Math.floor(Date.now() / 1e3)) - lastDistribution;
44090
+ const window = elapsed > VESTING_PERIOD ? elapsed : VESTING_PERIOD;
44091
+ if (window <= 0n) throw new Error("wiTRY: bad vesting window");
44092
+ const perSecond = vestingAmount / window;
44093
+ const apr = Number(perSecond * YEAR_SECONDS9 * ONE_E188 / totalAssets) / 1e16;
44094
+ if (!Number.isFinite(apr) || apr <= 0) throw new Error("wiTRY: no yield");
44095
+ return apr;
44096
+ };
44097
+ var brixFetcher = {
44098
+ label: "WITRY",
44099
+ fetch: async () => {
44100
+ const apr = await fetchBrixAprPercent().catch(() => fetchWitryAprOnChain()).catch(
44101
+ async () => apyToAprPercent(await fetchDefiLlamaApy(BRIX_DEFILLAMA_POOL))
44102
+ ).catch(() => 0);
44103
+ return { [WITRY_KEY]: apr, [WITRY_GROUP_KEY]: apr };
44104
+ }
44105
+ };
44106
+ var CHAIN_ID10 = Chain.ETHEREUM_MAINNET;
44036
44107
  var APYUSD = "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a";
44037
44108
  var APYX_LINEAR_VEST = "0x0d62b4cc02b4b51ed19ddf41d7a7979cf394c99f";
44038
44109
  var APYX_DISCOVER_URL = "https://api.apyx.fi/v1/rewards/seasons/2/discover";
44039
44110
  var APYX_DEFILLAMA_POOL = "cb6139f9-4a68-4efd-8245-0312a92aee55";
44040
- var YEAR_SECONDS9 = 31536000n;
44041
- var ONE_E188 = 10n ** 18n;
44111
+ var YEAR_SECONDS10 = 31536000n;
44112
+ var ONE_E189 = 10n ** 18n;
44042
44113
  var APYUSD_KEY = "APYUSD";
44043
44114
  var APYUSD_GROUP_KEY = "apyUSD::APYUSD";
44044
44115
  var APYUSD_LEGACY_GROUP_KEY = "apyUSD::apyUSD";
@@ -44067,7 +44138,7 @@ var APYX_READ_ABI = [
44067
44138
  ];
44068
44139
  var fetchApyusdAprOnChain = async () => {
44069
44140
  const [totalAssets, unvested, periodRemaining] = await multicallRetryUniversal({
44070
- chain: CHAIN_ID9,
44141
+ chain: CHAIN_ID10,
44071
44142
  abi: APYX_READ_ABI,
44072
44143
  calls: [
44073
44144
  { address: APYUSD, name: "totalAssets", params: [] },
@@ -44084,7 +44155,7 @@ var fetchApyusdAprOnChain = async () => {
44084
44155
  throw new Error("apyx vesting state empty");
44085
44156
  }
44086
44157
  const perSecond = unvested / periodRemaining;
44087
- return Number(perSecond * YEAR_SECONDS9 * ONE_E188 / totalAssets) / 1e16;
44158
+ return Number(perSecond * YEAR_SECONDS10 * ONE_E189 / totalAssets) / 1e16;
44088
44159
  };
44089
44160
  var fetchApyusdApyFromApi = async () => {
44090
44161
  const res = await fetch(APYX_DISCOVER_URL, {
@@ -44204,7 +44275,7 @@ var strataFetcher = {
44204
44275
  }
44205
44276
  };
44206
44277
  var RAY7 = 10n ** 27n;
44207
- var YEAR_SECONDS10 = 31536e3;
44278
+ var YEAR_SECONDS11 = 31536e3;
44208
44279
  var DSR_ABI = [
44209
44280
  {
44210
44281
  name: "dsr",
@@ -44232,7 +44303,7 @@ var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
44232
44303
  var aprFromDsr = (dsr) => {
44233
44304
  if (dsr <= RAY7) return 0;
44234
44305
  const perSecond = Number(dsr - RAY7) / 1e27;
44235
- return perSecond * YEAR_SECONDS10 * 100;
44306
+ return perSecond * YEAR_SECONDS11 * 100;
44236
44307
  };
44237
44308
  var fetchChainDsr = async (chainId, pot) => {
44238
44309
  const [dsr] = await multicallRetryUniversal({
@@ -46062,6 +46133,85 @@ var SINGLE_CHAIN_ENTRIES = {
46062
46133
  yieldFetcher: snusdFetcher,
46063
46134
  yieldKey: SNUSD_KEY
46064
46135
  },
46136
+ {
46137
+ // Brix wiTRY — StakedUSDeV2 clone over iTRY, a TURKISH LIRA stablecoin
46138
+ // backed by the Digital Liquidity Fund's DLF token (shares in a
46139
+ // regulated basket of Turkish money-market funds). Yield is the funds'
46140
+ // NAV delta, minted as fresh iTRY on a scheduled cycle (weekly at
46141
+ // launch) and `transferInRewards`'d into the vault, where it vests
46142
+ // linearly over a PRIVATE 248,400 s (69 h) constant — see
46143
+ // `fetchers/brix.ts` for how that was solved, and why the rate is not
46144
+ // read from a getter.
46145
+ //
46146
+ // THE RATE IS IN LIRA. 36-38 % is what Turkish money-market paper pays
46147
+ // BECAUSE the lira depreciates; a USD holder earns that minus the
46148
+ // TRY/USD drift, and historically the two have been close. Nothing in
46149
+ // the numeric fields can express that — `supplyRate` is asset-
46150
+ // denominated for every row on this surface — so the description below
46151
+ // is the only place it is stated, and it must stay there. Note also
46152
+ // that `denomination` classifies iTRY as `stable` (fiat-pegged, the
46153
+ // same call already made for ZCHF / EURA / TRYB): that axis means
46154
+ // "pegged to a currency", never "does not move against the dollar".
46155
+ //
46156
+ // Verified on-chain 2026-08-14: `silo()` = 0x1b301c81…, `unstake`,
46157
+ // `cooldownAssets`/`cooldownShares`, `MAX_COOLDOWN_DURATION` = 90 d,
46158
+ // `maxDeposit` = uint.max.
46159
+ //
46160
+ // `isMintable: false` — NOT because of a cap or a KYC gate on the vault,
46161
+ // which has neither, but because **the UNDERLYING is a permissioned
46162
+ // token**. iTRY is an Ethena `USDtb` clone sitting at
46163
+ // `transferState() == 1` (WHITELIST_ENABLED), whose transfer hook needs
46164
+ // BOTH `from` AND `to` to hold `WHITELISTED_ROLE` and otherwise reverts
46165
+ // `OperationNotAllowed()`. The role is held only by protocol plumbing
46166
+ // (this vault, the Silo, the Yield Forwarder, the OFT adapter, the
46167
+ // distributor), so an ordinary wallet cannot receive iTRY, cannot send
46168
+ // it, and therefore cannot stake OR unstake. `maxDeposit` reads
46169
+ // uint.max throughout — the vault has no idea. Fork-proven 2026-08-14:
46170
+ // the deposit reverts for a fresh account and the whole cycle succeeds
46171
+ // the moment the role is granted (see the worker-api fixture
46172
+ // `witry-cooldown-cycle.test.ts`, which fails loudly if
46173
+ // `transferState` ever reaches 2 so this flag gets flipped back).
46174
+ //
46175
+ // NB the vault's own `maxRedeem`/`maxWithdraw` report the full balance
46176
+ // while the cooldown is set even though `withdraw`/`redeem` revert —
46177
+ // family-wide StakedUSDeV2 behaviour (sNUSD does it too), not a Brix
46178
+ // bug. Never size an exit here off the 4626 views.
46179
+ //
46180
+ // COOLDOWN: the docs say 3 days; the contract answered **300 seconds**
46181
+ // on 2026-08-14, an owner-settable dial with no timelock and a 90-day
46182
+ // ceiling (docs also still label staking "coming soon" while $8.7M is
46183
+ // staked). The pin below is the documented steady state and the
46184
+ // `erc4626-cooldown` reader overrides it with the live value every
46185
+ // fetch, so neither number can go stale on the row.
46186
+ //
46187
+ // Ethereum-only. MegaETH (4326) carries same-address-book LayerZero
46188
+ // OFTs for both tokens — 94 % of the wiTRY supply actually sits there —
46189
+ // but that contract is a bare ERC-20: `asset()`, `totalAssets()`,
46190
+ // `cooldownDuration()` and `convertToAssets()` all revert, and the
46191
+ // staking logic is Ethereum-canonical (MegaETH stakes round-trip
46192
+ // through LayerZero OVault). A second row would be a second vault that
46193
+ // does not exist.
46194
+ reader: "erc4626-cooldown",
46195
+ address: "0xe346c29b5b60ef870b9724c57ccfbbc631e47dee",
46196
+ underlying: "0xb492b4afd9658093694cf9452d5c272e8230f3b0",
46197
+ // iTRY
46198
+ symbol: "wiTRY",
46199
+ brand: "Brix",
46200
+ // The backing is a regulated fund's shares held with Zodia Custody plus
46201
+ // an on-chain Fast Access Vault, marked by a licensed administrator's
46202
+ // daily NAV. Attested, not verifiable on-chain — and Brix's own
46203
+ // Accountable proof-of-reserves dashboard is documented as launching
46204
+ // "day 1 of official launch", i.e. not live at integration.
46205
+ solvency: "nav-attested",
46206
+ description: "iTRY is a Turkish lira stablecoin backed by shares in a regulated basket of Turkish money-market funds, custodied off-chain and marked to a daily fund NAV. wiTRY stakes it: the NAV gain is minted as fresh iTRY weekly and vests into the share price over ~69 hours. NOT OPEN YET \u2014 iTRY transfers are whitelist-gated to the protocol's own contracts, so an ordinary wallet can neither hold nor stake it. The rate is earned in LIRA: Turkish paper pays this much because the lira depreciates, so a dollar-based holder keeps only what is left after the TRY/USD move.",
46207
+ decimals: 18,
46208
+ isRebasing: false,
46209
+ isMintable: false,
46210
+ withdrawalMode: "fixed-cooldown",
46211
+ withdrawalCooldownSeconds: 3 * 86400,
46212
+ yieldFetcher: brixFetcher,
46213
+ yieldKey: WITRY_KEY
46214
+ },
46065
46215
  {
46066
46216
  // Apyx apyUSD — ERC-4626 over apxUSD, the "Dividend-Backed
46067
46217
  // Dollar" (variable-rate perpetual preferred stock of DAT
@@ -56359,7 +56509,7 @@ var Erc4626PreviewRedeemAbi = [
56359
56509
  ];
56360
56510
 
56361
56511
  // src/vaults/lst/readers/shared.ts
56362
- var ONE_E189 = 10n ** 18n;
56512
+ var ONE_E1810 = 10n ** 18n;
56363
56513
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
56364
56514
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
56365
56515
  var Multicall3BalanceAbi = [
@@ -56402,7 +56552,7 @@ var readerBeetsStS = (entry) => ({
56402
56552
  }
56403
56553
  const liquidity = toBigInt14(pool);
56404
56554
  return {
56405
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56555
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56406
56556
  totalSupply,
56407
56557
  exchangeRate,
56408
56558
  liquidity
@@ -56435,7 +56585,7 @@ var readerBenqiSavax = (entry) => ({
56435
56585
  {
56436
56586
  address: entry.address,
56437
56587
  name: "getPooledAvaxByShares",
56438
- params: [ONE_E189]
56588
+ params: [ONE_E1810]
56439
56589
  },
56440
56590
  { address: entry.address, name: "totalPooledAvax", params: [] }
56441
56591
  ],
@@ -56446,7 +56596,7 @@ var readerBenqiSavax = (entry) => ({
56446
56596
  if (totalSupply === void 0 || exchangeRate === void 0) {
56447
56597
  return void 0;
56448
56598
  }
56449
- const totalAssets = toBigInt14(totalPooled) ?? totalSupply * exchangeRate / ONE_E189;
56599
+ const totalAssets = toBigInt14(totalPooled) ?? totalSupply * exchangeRate / ONE_E1810;
56450
56600
  return {
56451
56601
  totalAssets,
56452
56602
  totalSupply,
@@ -56465,7 +56615,7 @@ var readerBgtWrapper1to1 = (entry) => ({
56465
56615
  return {
56466
56616
  totalAssets: totalSupply,
56467
56617
  totalSupply,
56468
- exchangeRate: ONE_E189
56618
+ exchangeRate: ONE_E1810
56469
56619
  };
56470
56620
  }
56471
56621
  });
@@ -56495,7 +56645,7 @@ var readerDineroBeraEth = (entry) => ({
56495
56645
  return void 0;
56496
56646
  }
56497
56647
  return {
56498
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56648
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56499
56649
  totalSupply,
56500
56650
  exchangeRate
56501
56651
  };
@@ -56507,7 +56657,7 @@ var readerErc4626 = (entry) => ({
56507
56657
  calls: [
56508
56658
  { address: entry.address, name: "totalAssets", params: [] },
56509
56659
  { address: entry.address, name: "totalSupply", params: [] },
56510
- { address: entry.address, name: "convertToAssets", params: [ONE_E189] }
56660
+ { address: entry.address, name: "convertToAssets", params: [ONE_E1810] }
56511
56661
  ],
56512
56662
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
56513
56663
  parse: ([assets, supply, rate]) => {
@@ -56524,7 +56674,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
56524
56674
  calls: [
56525
56675
  { address: entry.address, name: "totalAssets", params: [] },
56526
56676
  { address: entry.address, name: "totalSupply", params: [] },
56527
- { address: entry.address, name: "previewRedeem", params: [ONE_E189] }
56677
+ { address: entry.address, name: "previewRedeem", params: [ONE_E1810] }
56528
56678
  ],
56529
56679
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
56530
56680
  parse: ([assets, supply, rate]) => {
@@ -56604,7 +56754,7 @@ var readerEtherFiWeEth = (entry) => {
56604
56754
  }
56605
56755
  }
56606
56756
  return {
56607
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56757
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56608
56758
  totalSupply,
56609
56759
  exchangeRate,
56610
56760
  liquidity
@@ -56637,7 +56787,7 @@ var readerHyperbeatBeHype = (entry) => {
56637
56787
  return {
56638
56788
  totalAssets: totalSupply,
56639
56789
  totalSupply,
56640
- exchangeRate: ONE_E189
56790
+ exchangeRate: ONE_E1810
56641
56791
  };
56642
56792
  }
56643
56793
  };
@@ -56645,7 +56795,7 @@ var readerHyperbeatBeHype = (entry) => {
56645
56795
  return {
56646
56796
  calls: [
56647
56797
  { address: entry.address, name: "totalSupply", params: [] },
56648
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E189] }
56798
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E1810] }
56649
56799
  ],
56650
56800
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
56651
56801
  parse: ([supply, rate]) => {
@@ -56655,7 +56805,7 @@ var readerHyperbeatBeHype = (entry) => {
56655
56805
  return void 0;
56656
56806
  }
56657
56807
  return {
56658
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56808
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56659
56809
  totalSupply,
56660
56810
  exchangeRate
56661
56811
  };
@@ -56687,7 +56837,7 @@ var readerKelpRsEth = (entry) => {
56687
56837
  return {
56688
56838
  totalAssets: totalSupply,
56689
56839
  totalSupply,
56690
- exchangeRate: ONE_E189
56840
+ exchangeRate: ONE_E1810
56691
56841
  };
56692
56842
  }
56693
56843
  };
@@ -56705,7 +56855,7 @@ var readerKelpRsEth = (entry) => {
56705
56855
  return void 0;
56706
56856
  }
56707
56857
  return {
56708
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56858
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56709
56859
  totalSupply,
56710
56860
  exchangeRate
56711
56861
  };
@@ -56737,7 +56887,7 @@ var readerKinetiqKHype = (entry) => {
56737
56887
  return {
56738
56888
  totalAssets: totalSupply,
56739
56889
  totalSupply,
56740
- exchangeRate: ONE_E189
56890
+ exchangeRate: ONE_E1810
56741
56891
  };
56742
56892
  }
56743
56893
  };
@@ -56745,7 +56895,7 @@ var readerKinetiqKHype = (entry) => {
56745
56895
  return {
56746
56896
  calls: [
56747
56897
  { address: entry.address, name: "totalSupply", params: [] },
56748
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E189] }
56898
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E1810] }
56749
56899
  ],
56750
56900
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
56751
56901
  parse: ([supply, rate]) => {
@@ -56755,7 +56905,7 @@ var readerKinetiqKHype = (entry) => {
56755
56905
  return void 0;
56756
56906
  }
56757
56907
  return {
56758
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56908
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56759
56909
  totalSupply,
56760
56910
  exchangeRate
56761
56911
  };
@@ -56795,7 +56945,7 @@ var readerLairStKaia = (entry) => ({
56795
56945
  if (totalSupply === void 0 || exchangeRate === void 0) {
56796
56946
  return void 0;
56797
56947
  }
56798
- const totalAssets = toBigInt14(totalStaking) ?? totalSupply * exchangeRate / ONE_E189;
56948
+ const totalAssets = toBigInt14(totalStaking) ?? totalSupply * exchangeRate / ONE_E1810;
56799
56949
  return {
56800
56950
  totalAssets,
56801
56951
  totalSupply,
@@ -56829,7 +56979,7 @@ var readerLidoWstEth = (entry) => ({
56829
56979
  return void 0;
56830
56980
  }
56831
56981
  return {
56832
- totalAssets: totalSupply * exchangeRate / ONE_E189,
56982
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56833
56983
  totalSupply,
56834
56984
  exchangeRate
56835
56985
  };
@@ -56867,7 +57017,7 @@ var readerListaSlisBnb = (entry) => {
56867
57017
  return {
56868
57018
  totalAssets: totalSupply,
56869
57019
  totalSupply,
56870
- exchangeRate: ONE_E189
57020
+ exchangeRate: ONE_E1810
56871
57021
  };
56872
57022
  }
56873
57023
  };
@@ -56875,7 +57025,7 @@ var readerListaSlisBnb = (entry) => {
56875
57025
  return {
56876
57026
  calls: [
56877
57027
  { address: entry.address, name: "totalSupply", params: [] },
56878
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E189] },
57028
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E1810] },
56879
57029
  { address: manager, name: "getTotalPooledBnb", params: [] }
56880
57030
  ],
56881
57031
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -56886,7 +57036,7 @@ var readerListaSlisBnb = (entry) => {
56886
57036
  return void 0;
56887
57037
  }
56888
57038
  const pooledBnb = toBigInt14(pooled);
56889
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E189;
57039
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E1810;
56890
57040
  return { totalAssets, totalSupply, exchangeRate };
56891
57041
  }
56892
57042
  };
@@ -56916,7 +57066,7 @@ var readerMantleMEth = (entry) => {
56916
57066
  return {
56917
57067
  totalAssets: totalSupply,
56918
57068
  totalSupply,
56919
- exchangeRate: ONE_E189
57069
+ exchangeRate: ONE_E1810
56920
57070
  };
56921
57071
  }
56922
57072
  };
@@ -56924,7 +57074,7 @@ var readerMantleMEth = (entry) => {
56924
57074
  return {
56925
57075
  calls: [
56926
57076
  { address: entry.address, name: "totalSupply", params: [] },
56927
- { address: staking, name: "mETHToETH", params: [ONE_E189] }
57077
+ { address: staking, name: "mETHToETH", params: [ONE_E1810] }
56928
57078
  ],
56929
57079
  abis: [TotalSupplyAbi, MantleStakingAbi],
56930
57080
  parse: ([supply, rate]) => {
@@ -56934,7 +57084,7 @@ var readerMantleMEth = (entry) => {
56934
57084
  return void 0;
56935
57085
  }
56936
57086
  return {
56937
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57087
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
56938
57088
  totalSupply,
56939
57089
  exchangeRate
56940
57090
  };
@@ -56955,7 +57105,7 @@ var readerOffChain = (entry) => {
56955
57105
  return {
56956
57106
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
56957
57107
  totalSupply,
56958
- exchangeRate: ONE_E189
57108
+ exchangeRate: ONE_E1810
56959
57109
  };
56960
57110
  }
56961
57111
  };
@@ -56989,7 +57139,7 @@ var readerRenzoEzEth = (entry) => {
56989
57139
  return {
56990
57140
  totalAssets: totalSupply,
56991
57141
  totalSupply,
56992
- exchangeRate: ONE_E189
57142
+ exchangeRate: ONE_E1810
56993
57143
  };
56994
57144
  }
56995
57145
  };
@@ -57008,7 +57158,7 @@ var readerRenzoEzEth = (entry) => {
57008
57158
  return {
57009
57159
  totalAssets: totalTvl,
57010
57160
  totalSupply,
57011
- exchangeRate: totalTvl * ONE_E189 / totalSupply
57161
+ exchangeRate: totalTvl * ONE_E1810 / totalSupply
57012
57162
  };
57013
57163
  }
57014
57164
  };
@@ -57064,7 +57214,7 @@ var readerRocketReth = (entry) => {
57064
57214
  }
57065
57215
  const liquidity = depositPool ? toBigInt14(slice2[2]) : void 0;
57066
57216
  return {
57067
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57217
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57068
57218
  totalSupply,
57069
57219
  exchangeRate,
57070
57220
  liquidity
@@ -57106,7 +57256,7 @@ var readerStaderEthx = (entry) => {
57106
57256
  return {
57107
57257
  totalAssets: totalSupply,
57108
57258
  totalSupply,
57109
- exchangeRate: ONE_E189
57259
+ exchangeRate: ONE_E1810
57110
57260
  };
57111
57261
  }
57112
57262
  };
@@ -57124,7 +57274,7 @@ var readerStaderEthx = (entry) => {
57124
57274
  return void 0;
57125
57275
  }
57126
57276
  return {
57127
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57277
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57128
57278
  totalSupply,
57129
57279
  exchangeRate
57130
57280
  };
@@ -57141,7 +57291,7 @@ var readerStaderMaticX = (entry) => {
57141
57291
  {
57142
57292
  address: rateAddress,
57143
57293
  name: "convertMaticXToMatic",
57144
- params: [ONE_E189],
57294
+ params: [ONE_E1810],
57145
57295
  chainId: homeChainId
57146
57296
  }
57147
57297
  ],
@@ -57156,7 +57306,7 @@ var readerStaderMaticX = (entry) => {
57156
57306
  }
57157
57307
  const isCrossChain = homeContract !== void 0;
57158
57308
  return {
57159
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E189 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E189,
57309
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E1810 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E1810,
57160
57310
  totalSupply,
57161
57311
  exchangeRate: amountInMatic
57162
57312
  };
@@ -57188,7 +57338,7 @@ var readerStakeWiseOsEth = (entry) => {
57188
57338
  return {
57189
57339
  totalAssets: totalSupply,
57190
57340
  totalSupply,
57191
- exchangeRate: ONE_E189
57341
+ exchangeRate: ONE_E1810
57192
57342
  };
57193
57343
  }
57194
57344
  };
@@ -57196,7 +57346,7 @@ var readerStakeWiseOsEth = (entry) => {
57196
57346
  return {
57197
57347
  calls: [
57198
57348
  { address: entry.address, name: "totalSupply", params: [] },
57199
- { address: controller, name: "convertToAssets", params: [ONE_E189] }
57349
+ { address: controller, name: "convertToAssets", params: [ONE_E1810] }
57200
57350
  ],
57201
57351
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
57202
57352
  parse: ([supply, rate]) => {
@@ -57206,7 +57356,7 @@ var readerStakeWiseOsEth = (entry) => {
57206
57356
  return void 0;
57207
57357
  }
57208
57358
  return {
57209
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57359
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57210
57360
  totalSupply,
57211
57361
  exchangeRate
57212
57362
  };
@@ -57238,7 +57388,7 @@ var readerStCelo = (entry) => {
57238
57388
  return {
57239
57389
  totalAssets: totalSupply,
57240
57390
  totalSupply,
57241
- exchangeRate: ONE_E189
57391
+ exchangeRate: ONE_E1810
57242
57392
  };
57243
57393
  }
57244
57394
  };
@@ -57246,7 +57396,7 @@ var readerStCelo = (entry) => {
57246
57396
  return {
57247
57397
  calls: [
57248
57398
  { address: entry.address, name: "totalSupply", params: [] },
57249
- { address: manager, name: "toCelo", params: [ONE_E189] }
57399
+ { address: manager, name: "toCelo", params: [ONE_E1810] }
57250
57400
  ],
57251
57401
  abis: [TotalSupplyAbi, StCeloManagerAbi],
57252
57402
  parse: ([supply, rate]) => {
@@ -57256,7 +57406,7 @@ var readerStCelo = (entry) => {
57256
57406
  return void 0;
57257
57407
  }
57258
57408
  return {
57259
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57409
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57260
57410
  totalSupply,
57261
57411
  exchangeRate
57262
57412
  };
@@ -57289,7 +57439,7 @@ var readerSwellGetRate = (entry) => ({
57289
57439
  return void 0;
57290
57440
  }
57291
57441
  return {
57292
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57442
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57293
57443
  totalSupply,
57294
57444
  exchangeRate
57295
57445
  };
@@ -57320,7 +57470,7 @@ var readerValantisWstHype = (entry) => {
57320
57470
  return {
57321
57471
  totalAssets: totalSupply,
57322
57472
  totalSupply,
57323
- exchangeRate: ONE_E189
57473
+ exchangeRate: ONE_E1810
57324
57474
  };
57325
57475
  }
57326
57476
  };
@@ -57338,7 +57488,7 @@ var readerValantisWstHype = (entry) => {
57338
57488
  return void 0;
57339
57489
  }
57340
57490
  return {
57341
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57491
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57342
57492
  totalSupply,
57343
57493
  exchangeRate
57344
57494
  };
@@ -57372,7 +57522,7 @@ var readerVedaAccountant = (entry) => {
57372
57522
  return {
57373
57523
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
57374
57524
  totalSupply,
57375
- exchangeRate: ONE_E189
57525
+ exchangeRate: ONE_E1810
57376
57526
  };
57377
57527
  }
57378
57528
  };
@@ -57391,7 +57541,7 @@ var readerVedaAccountant = (entry) => {
57391
57541
  const exchangeRate = rawRate * scale3;
57392
57542
  return {
57393
57543
  totalAssets: rescaleDecimals(
57394
- totalSupply * exchangeRate / ONE_E189,
57544
+ totalSupply * exchangeRate / ONE_E1810,
57395
57545
  shareDec,
57396
57546
  underlyingDec
57397
57547
  ),
@@ -57427,9 +57577,9 @@ var readerAnkrRatio = (entry) => ({
57427
57577
  return void 0;
57428
57578
  }
57429
57579
  return {
57430
- totalAssets: totalSupply * ONE_E189 / r,
57580
+ totalAssets: totalSupply * ONE_E1810 / r,
57431
57581
  totalSupply,
57432
- exchangeRate: ONE_E189 * ONE_E189 / r
57582
+ exchangeRate: ONE_E1810 * ONE_E1810 / r
57433
57583
  };
57434
57584
  }
57435
57585
  });
@@ -57459,7 +57609,7 @@ var readerBinanceWbeth = (entry) => ({
57459
57609
  return void 0;
57460
57610
  }
57461
57611
  return {
57462
- totalAssets: totalSupply * exchangeRate / ONE_E189,
57612
+ totalAssets: totalSupply * exchangeRate / ONE_E1810,
57463
57613
  totalSupply,
57464
57614
  exchangeRate
57465
57615
  };
@@ -57505,7 +57655,7 @@ var readerCoreEarnRate = (entry) => {
57505
57655
  return {
57506
57656
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
57507
57657
  totalSupply,
57508
- exchangeRate: r * ONE_E189 / CORE_RATE_DENOM
57658
+ exchangeRate: r * ONE_E1810 / CORE_RATE_DENOM
57509
57659
  };
57510
57660
  }
57511
57661
  };
@@ -57527,7 +57677,7 @@ var readerCoreStakedRatio = (entry) => {
57527
57677
  return {
57528
57678
  totalAssets: totalStaked,
57529
57679
  totalSupply,
57530
- exchangeRate: totalStaked * ONE_E189 / totalSupply
57680
+ exchangeRate: totalStaked * ONE_E1810 / totalSupply
57531
57681
  };
57532
57682
  }
57533
57683
  };
@@ -57562,7 +57712,7 @@ var readerKintsuSMon = (entry) => ({
57562
57712
  const totalAssets = toBigInt14(pooled);
57563
57713
  const totalSupply = toBigInt14(shares);
57564
57714
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
57565
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E189 / totalSupply : ONE_E189;
57715
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E1810 / totalSupply : ONE_E1810;
57566
57716
  return { totalAssets, totalSupply, exchangeRate };
57567
57717
  }
57568
57718
  });
@@ -57998,7 +58148,7 @@ var getLstValidators = async (chainId, shareToken) => {
57998
58148
  };
57999
58149
 
58000
58150
  // src/vaults/lst/fetchPublic.ts
58001
- var ONE_E1810 = 10n ** 18n;
58151
+ var ONE_E1811 = 10n ** 18n;
58002
58152
  var ERC20_BALANCE_ABI = parseAbi([
58003
58153
  "function balanceOf(address) view returns (uint256)"
58004
58154
  ]);
@@ -58113,8 +58263,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
58113
58263
  const underlyingUnit = 10n ** BigInt(underlyingDec);
58114
58264
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
58115
58265
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
58116
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
58117
- const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
58266
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1811;
58267
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1811 * shareUnit / state.exchangeRate : 0n;
58118
58268
  let liquidityRaw;
58119
58269
  if (state.liquidity !== void 0) {
58120
58270
  liquidityRaw = state.liquidity;
@@ -60912,6 +61062,17 @@ var LST_WITHDRAWAL_REGISTRY = {
60912
61062
  symbol: "sNUSD",
60913
61063
  reader: "ethenaCooldown"
60914
61064
  },
61065
+ {
61066
+ // Brix wiTRY — StakedUSDeV2 clone over iTRY (Turkish lira); same
61067
+ // cooldowns(address) escrow, claim via `unstake`. The duration is
61068
+ // owner-settable with no timelock (documented 3 d, live 300 s on
61069
+ // 2026-08-14, 90 d ceiling), which is exactly why the pending exit is
61070
+ // read per-user from `cooldowns()` rather than derived from a constant.
61071
+ lst: "0xe346c29b5b60ef870b9724c57ccfbbc631e47dee",
61072
+ brand: "Brix",
61073
+ symbol: "wiTRY",
61074
+ reader: "ethenaCooldown"
61075
+ },
60915
61076
  {
60916
61077
  // 3Jane sUSD3 — startCooldown(shares) → 30d → plain 4626 redeem
60917
61078
  // inside the withdrawal window; getCooldownStatus(address) getter.
@@ -61546,6 +61707,15 @@ var Erc4626ReadAbi2 = [
61546
61707
  outputs: [{ type: "uint256", name: "assets" }]
61547
61708
  }
61548
61709
  ];
61710
+ var CooldownDurationAbi = [
61711
+ {
61712
+ name: "cooldownDuration",
61713
+ type: "function",
61714
+ stateMutability: "view",
61715
+ inputs: [],
61716
+ outputs: [{ type: "uint24" }]
61717
+ }
61718
+ ];
61549
61719
  var NavOracleReadAbi = [
61550
61720
  {
61551
61721
  name: "latestRoundData",
@@ -61563,7 +61733,7 @@ var NavOracleReadAbi = [
61563
61733
  ];
61564
61734
 
61565
61735
  // src/vaults/savings/readers/shared.ts
61566
- var ONE_E1811 = 10n ** 18n;
61736
+ var ONE_E1812 = 10n ** 18n;
61567
61737
  var toBigInt16 = (v) => {
61568
61738
  if (v === void 0 || v === null) return void 0;
61569
61739
  if (typeof v === "bigint") return v;
@@ -61604,7 +61774,37 @@ var readerErc46262 = (entry) => {
61604
61774
  return {
61605
61775
  totalAssets,
61606
61776
  totalSupply,
61607
- exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit
61777
+ exchangeRate: convertToAssetsRaw * ONE_E1812 / underlyingUnit
61778
+ };
61779
+ }
61780
+ };
61781
+ };
61782
+
61783
+ // src/vaults/savings/readers/erc4626Cooldown.ts
61784
+ var readerErc4626Cooldown = (entry) => {
61785
+ const shareUnit = 10n ** BigInt(entry.decimals);
61786
+ const underlyingUnit = 10n ** BigInt(entry.underlyingDecimals ?? entry.decimals);
61787
+ return {
61788
+ calls: [
61789
+ { address: entry.address, name: "totalAssets", params: [] },
61790
+ { address: entry.address, name: "totalSupply", params: [] },
61791
+ { address: entry.address, name: "convertToAssets", params: [shareUnit] },
61792
+ { address: entry.address, name: "cooldownDuration", params: [] }
61793
+ ],
61794
+ abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2, CooldownDurationAbi],
61795
+ parse: ([assets, supply, rate, cooldown]) => {
61796
+ const totalAssets = toBigInt16(assets);
61797
+ const totalSupply = toBigInt16(supply);
61798
+ const convertToAssetsRaw = toBigInt16(rate);
61799
+ if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
61800
+ return void 0;
61801
+ }
61802
+ const cooldownSecs = toBigInt16(cooldown);
61803
+ return {
61804
+ totalAssets,
61805
+ totalSupply,
61806
+ exchangeRate: convertToAssetsRaw * ONE_E1812 / underlyingUnit,
61807
+ withdrawalCooldownSeconds: cooldownSecs === void 0 ? void 0 : Number(cooldownSecs)
61608
61808
  };
61609
61809
  }
61610
61810
  };
@@ -61793,7 +61993,7 @@ var readerErc4626Idle = (entry) => {
61793
61993
  return {
61794
61994
  totalAssets,
61795
61995
  totalSupply,
61796
- exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
61996
+ exchangeRate: convertToAssetsRaw * ONE_E1812 / underlyingUnit,
61797
61997
  ...capacity !== void 0 ? {
61798
61998
  instantRedeemCapacity: capacity,
61799
61999
  instantRedeemEnabled: true,
@@ -61842,7 +62042,7 @@ var readerErc4626WithdrawLimit = (entry) => {
61842
62042
  return {
61843
62043
  totalAssets,
61844
62044
  totalSupply,
61845
- exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
62045
+ exchangeRate: convertToAssetsRaw * ONE_E1812 / underlyingUnit,
61846
62046
  ...capacity !== void 0 ? {
61847
62047
  instantRedeemCapacity: capacity,
61848
62048
  instantRedeemEnabled: true,
@@ -61871,7 +62071,7 @@ var readerFrankencoinSavings = (entry) => ({
61871
62071
  // `fetchPublic` derives `convertToAssets` / `convertToShares` from
61872
62072
  // `exchangeRate`, and 1e18 makes them the identity.
61873
62073
  totalSupply: deposits,
61874
- exchangeRate: ONE_E1811
62074
+ exchangeRate: ONE_E1812
61875
62075
  };
61876
62076
  }
61877
62077
  });
@@ -61897,7 +62097,7 @@ var readerNavOracle = (entry) => {
61897
62097
  const exchangeRate = toBigInt16(raw);
61898
62098
  if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
61899
62099
  return {
61900
- totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1811 * shareUnit),
62100
+ totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1812 * shareUnit),
61901
62101
  totalSupply,
61902
62102
  exchangeRate
61903
62103
  };
@@ -61911,7 +62111,7 @@ var readerNativeWnlp = (entry) => {
61911
62111
  return {
61912
62112
  calls: [
61913
62113
  { address, name: "totalSupply", params: [] },
61914
- { address, name: "getNlpByWnlp", params: [ONE_E1811] },
62114
+ { address, name: "getNlpByWnlp", params: [ONE_E1812] },
61915
62115
  { address, name: "instantRedeemFeeBips", params: [] },
61916
62116
  { address, name: "instantRedeemEnabled", params: [] },
61917
62117
  // Falls back to the vault itself when no CreditVault is pinned —
@@ -61945,7 +62145,7 @@ var readerNativeWnlp = (entry) => {
61945
62145
  const windowSeconds = toBigInt16(window);
61946
62146
  const bips = toBigInt16(feeBips);
61947
62147
  return {
61948
- totalAssets: totalSupply * exchangeRate / ONE_E1811,
62148
+ totalAssets: totalSupply * exchangeRate / ONE_E1812,
61949
62149
  totalSupply,
61950
62150
  exchangeRate,
61951
62151
  // `instantRedeemFeeBips` on-chain is already basis points, so it
@@ -61963,7 +62163,7 @@ var readerNativeWnlp = (entry) => {
61963
62163
  };
61964
62164
 
61965
62165
  // src/vaults/savings/readers/yieldBasisLt.ts
61966
- var ONE_SHARE = ONE_E1811;
62166
+ var ONE_SHARE = ONE_E1812;
61967
62167
  var readerYieldBasisLt = (entry) => {
61968
62168
  const underlyingUnit = 10n ** BigInt(entry.underlyingDecimals ?? entry.decimals);
61969
62169
  const amm = entry.capacityContract ?? entry.address;
@@ -61991,7 +62191,7 @@ var readerYieldBasisLt = (entry) => {
61991
62191
  }
61992
62192
  if (totalSupply === 0n || redeemRaw === 0n) return void 0;
61993
62193
  const totalAssets = totalSupply * redeemRaw / ONE_SHARE;
61994
- const exchangeRate = redeemRaw * ONE_E1811 / underlyingUnit;
62194
+ const exchangeRate = redeemRaw * ONE_E1812 / underlyingUnit;
61995
62195
  const equity = Array.isArray(valueOracle) ? toBigInt16(valueOracle[1]) : toBigInt16(valueOracle?.value);
61996
62196
  const cap = toBigInt16(maxDebt);
61997
62197
  let depositCapacity;
@@ -62021,6 +62221,8 @@ var buildReader2 = (entry) => {
62021
62221
  return readerFrankencoinSavings(entry);
62022
62222
  case "yieldbasis-lt":
62023
62223
  return readerYieldBasisLt(entry);
62224
+ case "erc4626-cooldown":
62225
+ return readerErc4626Cooldown(entry);
62024
62226
  case "erc4626-idle":
62025
62227
  return readerErc4626Idle(entry);
62026
62228
  case "erc4626-withdraw-limit":
@@ -62035,7 +62237,7 @@ var buildReader2 = (entry) => {
62035
62237
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
62036
62238
 
62037
62239
  // src/vaults/savings/fetchPublic.ts
62038
- var ONE_E1812 = 10n ** 18n;
62240
+ var ONE_E1813 = 10n ** 18n;
62039
62241
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
62040
62242
  const entries = getSavingsRegistry(chainId);
62041
62243
  if (entries.length === 0) return {};
@@ -62084,8 +62286,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
62084
62286
  1,
62085
62287
  Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
62086
62288
  ) : 1;
62087
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1812;
62088
- const convertToShares = state.exchangeRate > 0n ? ONE_E1812 * shareUnit / state.exchangeRate : 0n;
62289
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1813;
62290
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1813 * shareUnit / state.exchangeRate : 0n;
62089
62291
  const depositCapacity = state.depositCapacity?.toString();
62090
62292
  const depositCapacityFormatted = state.depositCapacity !== void 0 ? Number(state.depositCapacity) / 10 ** underlyingDec : void 0;
62091
62293
  const depositCapacityUsd = depositCapacityFormatted !== void 0 && priceUsd !== void 0 ? depositCapacityFormatted * priceUsd : void 0;
@@ -62123,12 +62325,13 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
62123
62325
  depositRate,
62124
62326
  // Opt-IN, not opt-out: a new bespoke reader exists precisely
62125
62327
  // because its token is not a conforming vault, so the default for
62126
- // an unlisted reader must be `false`. `erc4626-idle` and
62127
- // `erc4626-withdraw-limit` are the plain 4626 surface plus one
62128
- // extra read (an inventory balance / the strategy's limit view),
62129
- // so they count; Native's wNLP and Re's NAV-oracle tokens revert
62130
- // on `asset()`/`totalAssets()`/`convertToAssets()` and do not.
62131
- isErc4626: entry.reader === void 0 || entry.reader === "erc4626" || entry.reader === "erc4626-idle" || entry.reader === "erc4626-withdraw-limit",
62328
+ // an unlisted reader must be `false`. `erc4626-idle`,
62329
+ // `erc4626-withdraw-limit` and `erc4626-cooldown` are the plain 4626
62330
+ // surface plus one extra read (an inventory balance / the strategy's
62331
+ // limit view / the exit lock), so they count; Native's wNLP and Re's
62332
+ // NAV-oracle tokens revert on
62333
+ // `asset()`/`totalAssets()`/`convertToAssets()` and do not.
62334
+ isErc4626: entry.reader === void 0 || entry.reader === "erc4626" || entry.reader === "erc4626-cooldown" || entry.reader === "erc4626-idle" || entry.reader === "erc4626-withdraw-limit",
62132
62335
  isRebasing: entry.isRebasing,
62133
62336
  isMintable: entry.isMintable,
62134
62337
  mintContract: entry.mintContract?.toLowerCase() ?? addressLc,
@@ -63237,6 +63440,12 @@ var STABLECOIN_SYMBOLS = /* @__PURE__ */ new Set([
63237
63440
  "GBPT",
63238
63441
  "XSGD",
63239
63442
  "TRYB",
63443
+ // Brix iTRY — lira-pegged, backed by a regulated basket of Turkish
63444
+ // money-market funds. `stable` on this axis means PEGGED TO A CURRENCY, not
63445
+ // "holds its value in dollars": a lira peg is a promise about lira, and this
63446
+ // one pays ~37 % precisely because that is what the lira costs. Same reading
63447
+ // already applied to ZCHF / EURA / TRYB above.
63448
+ "ITRY",
63240
63449
  // long-tail USD stables (no `USD` substring) — verified against the
63241
63450
  // dataset's `stablecoinish` flag.
63242
63451
  "WM",
@@ -64740,7 +64949,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
64740
64949
  };
64741
64950
 
64742
64951
  // src/vaults/yield/annualize.ts
64743
- var YEAR_SECONDS11 = 365 * 24 * 60 * 60;
64952
+ var YEAR_SECONDS12 = 365 * 24 * 60 * 60;
64744
64953
  var SCALE = 10n ** 18n;
64745
64954
  var appendSnapshot = (points, snap, options) => {
64746
64955
  const maxPoints = options?.maxPoints ?? 90;
@@ -64769,7 +64978,7 @@ var computeVaultApr = (points, options) => {
64769
64978
  if (pThen === 0n) return void 0;
64770
64979
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
64771
64980
  const ratio = Number(ratioScaled) / 1e18;
64772
- const apr = (ratio - 1) * (YEAR_SECONDS11 / windowSeconds);
64981
+ const apr = (ratio - 1) * (YEAR_SECONDS12 / windowSeconds);
64773
64982
  return {
64774
64983
  apr,
64775
64984
  sharePriceNow: now.p,