@panoptic-eng/sdk 1.0.21 → 1.0.22

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
@@ -1,7 +1,8 @@
1
- import { BORROW_INDEX_BITS, BPS_SCALE, MARKET_EPOCH_BITS, MARKET_EPOCH_SHIFT, Multicall3Abi, RATE_AT_TARGET_BITS, SECONDS_PER_YEAR, UNREALIZED_INTEREST_BITS, WAD, annualizePerSecondRateWad, deriveSupplyRatePerSecWad, formatPerSecondRateWadAsAprPct, formatPerSecondRateWadAsApyPct, getAccountCollateral, getCollateralData, getIrmCurrent, getIrmCurve, packMarketState, ratePerSecWadToAprPct, utilizationBpsToWad, utilizationPctToWad } from "./irm-CfM383Ku.js";
2
- import { collateralTrackerV2Abi, getPoolMetadata$1 as getPoolMetadata, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticPoolV2Abi, panopticQueryAbi$1 as panopticQueryAbi, riskEngineAbi, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi } from "./position-BK4a-Yyu.js";
1
+ import { BASE_CHAIN_ID, BASE_DEPLOYMENT, BASE_ETH_USDC_5BPS_MARKET, BASE_HYPOVAULT_ADDRESSES, BASE_HYPOVAULT_CORE_ADDRESSES, BASE_HYPOVAULT_MANAGER_ADDRESSES, BASE_HYPOVAULT_MANAGER_TURNKEY_SIGNERS, BASE_PANOPTIC_POOL_ADDRESSES, BASE_PANOPTIC_V2_ADDRESSES, BORROW_INDEX_BITS, BPS_SCALE, CHAIN_DEPLOYMENTS, MAINNET_CHAIN_ID, MAINNET_DEPLOYMENT, MAINNET_PANOPTIC_V2_ADDRESSES, MARKET_EPOCH_BITS, MARKET_EPOCH_SHIFT, Multicall3Abi, RATE_AT_TARGET_BITS, SECONDS_PER_YEAR, SEPOLIA_CHAIN_ID, SEPOLIA_DEPLOYMENT, SEPOLIA_ETH_USDC_5BPS_MARKET, SEPOLIA_HYPOVAULT_ADDRESSES, SEPOLIA_HYPOVAULT_CORE_ADDRESSES, SEPOLIA_HYPOVAULT_MANAGER_ADDRESSES, SEPOLIA_HYPOVAULT_MANAGER_TURNKEY_SIGNERS, SEPOLIA_PANOPTIC_POOL_ADDRESSES, SEPOLIA_PANOPTIC_V2_ADDRESSES, UNREALIZED_INTEREST_BITS, VAULT_DISPLAY_NAMES_PER_CHAIN, VAULT_DISPLAY_NAME_RESOLVERS_PER_CHAIN, WAD, annualizePerSecondRateWad, deriveSupplyRatePerSecWad, formatPerSecondRateWadAsAprPct, formatPerSecondRateWadAsApyPct, getAccountCollateral, getChainDeployment, getCollateralData, getEthUsdcMarket, getIrmCurrent, getIrmCurve, isSupportedChain, packMarketState, ratePerSecWadToAprPct, requireChainDeployment, resolveVaultDisplayName, utilizationBpsToWad, utilizationPctToWad } from "./irm-DNK3N7qk.js";
2
+ import { collateralTrackerV2Abi, getPoolMetadata$1 as getPoolMetadata, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticPoolV2Abi, panopticQueryAbi$1 as panopticQueryAbi, riskEngineAbi, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, tickToSqrtPriceX96$1 as tickToSqrtPriceX96 } from "./position-BK4a-Yyu.js";
3
3
  import { BaseError, ContractFunctionExecutionError, ContractFunctionRevertedError, encodeAbiParameters, encodeFunctionData, encodePacked, keccak256, maxUint256, parseAbi, zeroAddress } from "viem";
4
4
  import { readContract, simulateContract, writeContract } from "viem/actions";
5
+ import Decimal from "decimal.js";
5
6
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
7
  import { useAccount, useReadContract, useSimulateContract, useWaitForTransactionReceipt, useWriteContract } from "wagmi";
7
8
  import { z } from "zod";
@@ -15468,304 +15469,6 @@ const panopticPoolV2Abi$1 = [
15468
15469
  }
15469
15470
  ];
15470
15471
 
15471
- //#endregion
15472
- //#region ../deployments/src/chainDeployments.data.json
15473
- var _1 = {
15474
- "chainId": 1,
15475
- "infrastructure": {
15476
- "uniswapV3Factory": "0x1F98431c8aD98523631AE4a59f267346ea31F984",
15477
- "poolManager": "0x000000000004444c5dc75cB358380D2e3dE08A90",
15478
- "stateView": "0x7ffe42c4a5deea5b0fec41c94c136cf115597227"
15479
- },
15480
- "hypovault": {
15481
- "core": {
15482
- "hypoVaultImplementation": "0xF16714665955DBd0361D997eFc50fe391D96E8D0",
15483
- "factory": "0xd5049B2647de57141dE7F65E5124707B99A452A3",
15484
- "accountant": "0x65aA902AE3135658587FFC36ED51B61c927114e1",
15485
- "rolesAuthority": "0xb952D345c413Ddb7850173422bAe4968e0330598",
15486
- "collateralTrackerDecoderAndSanitizer": "0xC87c45d2dbE5acb56013e2591427ECC84Fa251E6"
15487
- },
15488
- "vaults": {
15489
- "wethPlpVault": "0xd4e2c720a760049cc4151bcf61e3a9348db9cd92",
15490
- "usdcPlpVault": "0x236d0558f06cd60780b232d4Ec4c92d2cb7e4D18"
15491
- },
15492
- "managers": {
15493
- "wethPlpVaultManager": "0xB6Fc48e658C9B1a7dbdFA51A5E153ab60BB2e04d",
15494
- "usdcPlpVaultManager": "0x2ce65016366ef7320078e0758D58Cf1038bc7C4e"
15495
- },
15496
- "turnkeySigners": {
15497
- "wethPlpVaultManager": "0x8FfA6DAB99f8afc64F61BeF83F0966eD6362f24F",
15498
- "usdcPlpVaultManager": "0x3c1c79d0cfc316Ba959194c89696a8382d7d283b"
15499
- }
15500
- },
15501
- "panoptic": {
15502
- "pool": {
15503
- "panopticPool": "0x00000000563b70d704f4c6675a5f6ac989fbae13",
15504
- "collateralTracker0": "0x1e46b0289B7E0F710E2Db8Ab87800dd782D624f7",
15505
- "collateralTracker1": "0x12bF31955522BAC337D93e1bC0a39F68D8BDa216"
15506
- },
15507
- "v2": {
15508
- "semiFungiblePositionManagerV4": "0x000000000000047534b9E1D528ED997169865a64",
15509
- "semiFungiblePositionManagerV3": "0x000000000000031d296bBA22f188472157eEb01f",
15510
- "builderFactory": "0x00000000000008D41F2cd5bF144F61cEB3661F98",
15511
- "riskEngine": "0x0000000000000e673aECBDB5f5fE5DFAf4a8e9Ac",
15512
- "panopticPoolImplementation": "0x00000000000010bb6695dAAC60D0515c0A01a948",
15513
- "collateralTrackerImplementation": "0x0000000000002038055dB8f2B2Fd356598935C51",
15514
- "panopticFactoryV4": "0x0000000000000c51d0f8cf4bd9adE7191372a625",
15515
- "panopticFactoryV3": "0x0000000000000aDC9A108591e718F2aee963a2a7",
15516
- "panopticHelper": "0x0000000000000000000000000000000000000000",
15517
- "panopticMath": "0x000000000000301F5BC0171C75967b8e78a92b10",
15518
- "panopticQuery": "0x0000000000000e1aE9c66C1c3B0A547D23389C93",
15519
- "interactionHelper": "0x00000000000040ae7CD505F4E0e3F34195D8c08C"
15520
- }
15521
- },
15522
- "riskEngines": [
15523
- "0x000000000000075e29cdaa9cb640a69e148ca7da",
15524
- "0x0000000000000fe1e261f66ce2f44def4f5ae0cb",
15525
- "0x0000000000000e673aECBDB5f5fE5DFAf4a8e9Ac"
15526
- ],
15527
- "markets": { "ethUsdc30bps": {
15528
- "currency0": "0x0000000000000000000000000000000000000000",
15529
- "currency1": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
15530
- "fee": 3e3,
15531
- "tickSpacing": 60,
15532
- "poolId": "0x3C08AE4977F78D"
15533
- } },
15534
- "subgraphs": {
15535
- "hypovault": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/hypovault-subgraph-mainnet/prod/gn",
15536
- "panoptic": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/panoptic-subgraph-mainnet/v2_prod/gn"
15537
- }
15538
- };
15539
- var _8453 = {
15540
- "chainId": 8453,
15541
- "infrastructure": {
15542
- "uniswapV3Factory": "0x33128a8fC17869897dcE68Ed026d694621f6FDfD",
15543
- "poolManager": "0x498581fF718922c3f8e6A244956aF099B2652b2b",
15544
- "stateView": "0xA3c0c9b65baD0b08107Aa264b0f3dB444b867A71"
15545
- },
15546
- "hypovault": {
15547
- "core": {
15548
- "hypoVaultImplementation": "0xec311aE06486ad44Ba782133b502A34aCE0f479E",
15549
- "factory": "0x9bE53b169a41030f1710A9B82e9eA6413f14D12E",
15550
- "accountant": "0x345cA3407942f9d175c9eA8B90e83A36F570f852",
15551
- "rolesAuthority": "0x278D37CaBFFB4B72D2866E30fEFE08aef773E0B6",
15552
- "collateralTrackerDecoderAndSanitizer": "0x4A290b3EC46cF320421Bb2aaee96d445de31CF0b"
15553
- },
15554
- "vaults": {
15555
- "wethPlpVault": "0x41b7D0515d709A4Fd2CF27f9d141D0c2F8713D04",
15556
- "usdcPlpVault": "0xb452af299c565D04B05E601efF2840e000C922f1"
15557
- },
15558
- "managers": {
15559
- "wethPlpVaultManager": "0x2a4923456c79E9ebD10F5Bf5305a5C742bBc1D7C",
15560
- "usdcPlpVaultManager": "0xdd6E2406a044582463CFE9F0C774870eAf4A310B"
15561
- },
15562
- "turnkeySigners": {
15563
- "wethPlpVaultManager": "0x8FfA6DAB99f8afc64F61BeF83F0966eD6362f24F",
15564
- "usdcPlpVaultManager": "0x3c1c79d0cfc316Ba959194c89696a8382d7d283b"
15565
- }
15566
- },
15567
- "panoptic": {
15568
- "pool": {
15569
- "panopticPool": "0xB50e8bb68f5855DA742f4579274902a20454174a",
15570
- "collateralTracker0": "0x0d82b189c96EbB1f44A7207e6A9cfB1e490f2869",
15571
- "collateralTracker1": "0x9ba1082Ab3cb9edEA988697A14BBe543A3dABEd2"
15572
- },
15573
- "v2": {
15574
- "semiFungiblePositionManagerV4": "0x8dcAa08cF298F8b4830FAf56d47930981AdE33af",
15575
- "semiFungiblePositionManagerV3": "0xFB1c06B491305d618bb8a7a368C6e50c001C153A",
15576
- "builderFactory": "0x6d26E916a18d522f7DdA2a26d9E1645564ccDcA5",
15577
- "riskEngine": "0x8bbce8b1eb64118cfe6c1eab0afe13b80ea41481",
15578
- "panopticPoolImplementation": "0x5BA68a018fF149c38ec52D181Dd24aBabE9a07DB",
15579
- "collateralTrackerImplementation": "0x34B3a4e4F14f292575ECe3EF67886C4598af459f",
15580
- "panopticFactoryV4": "0x9ac0317fcd124aff0b5429beb8de17020bc45f9a",
15581
- "panopticFactoryV3": "0x687f616d68c483a7223e6922f59aef7452e26c1d",
15582
- "panopticHelper": "0x0000000000000000000000000000000000000000",
15583
- "panopticMath": "0x6d21699192f5aF112C87e53b32ff846782afF407",
15584
- "panopticQuery": "0xd2586E1bbdd1169F597F3A370117EdF7372A7350",
15585
- "interactionHelper": "0x643d8DD5372FD6c71f8fAbCce4Eb8857704F3E15"
15586
- }
15587
- },
15588
- "riskEngines": ["0x8bbce8b1eb64118cfe6c1eab0afe13b80ea41481"],
15589
- "markets": { "ethUsdc5bps": {
15590
- "currency0": "0x0000000000000000000000000000000000000000",
15591
- "currency1": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
15592
- "fee": 500,
15593
- "tickSpacing": 10,
15594
- "poolId": "0x96d4b53a38337a5733179751781178a2613306063c511b78cd02684739288c0a"
15595
- } },
15596
- "subgraphs": {
15597
- "hypovault": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/hypovault-subgraph-base/prod/gn",
15598
- "panoptic": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/panoptic-subgraph-base/v2_prod/gn"
15599
- }
15600
- };
15601
- var _11155111 = {
15602
- "chainId": 11155111,
15603
- "infrastructure": {
15604
- "uniswapV3Factory": "0x0227628f3F023bb0B980b67D528571c95c6DaC1c",
15605
- "poolManager": "0xE03A1074c86CFeDd5C142C4F04F1a1536e203543",
15606
- "stateView": "0xE1Dd9c3fA50EDB962E442f60DfBc432e24537E4C"
15607
- },
15608
- "hypovault": {
15609
- "core": {
15610
- "hypoVaultImplementation": "0xC5b415Db4087228Af817893769DC3a205160160B",
15611
- "factory": "0x363a9d605ca45cBfF3b597350DeADb53cdC292c7",
15612
- "accountant": "0x25BBef1DF262c24aa1AACD1F7eCeEcc1a7AD08ab",
15613
- "rolesAuthority": "0x673BfafB4e2712215B422347c1571421B83E8A3d",
15614
- "collateralTrackerDecoderAndSanitizer": "0xb899BE50BAF25BBB3A3ca3403256B3c703E5AB5d"
15615
- },
15616
- "vaults": {
15617
- "wethPlpVault": "0xD58C4F9AEe5bBfcf28dC9a8d3D57b323fA6521b1",
15618
- "usdcPlpVault": "0xdd7a8d6c6975488e801129bC84302d74e2361208"
15619
- },
15620
- "managers": {
15621
- "wethPlpVaultManager": "0x95eC124FAAB70D7aE147c3BE0336E01a828AE2d5",
15622
- "usdcPlpVaultManager": "0xFB5aa3e0b46F3859D90B14b52ffd287013b5Ec53"
15623
- },
15624
- "turnkeySigners": {
15625
- "wethPlpVaultManager": "0x8FfA6DAB99f8afc64F61BeF83F0966eD6362f24F",
15626
- "usdcPlpVaultManager": "0x3c1c79d0cfc316Ba959194c89696a8382d7d283b"
15627
- }
15628
- },
15629
- "panoptic": {
15630
- "pool": {
15631
- "panopticPool": "0x872b98C46b2062F663BEb2CC9D4cE046Da2a2918",
15632
- "collateralTracker0": "0x09a60b78d06a03e5148faedd3bfee6f58b22012f",
15633
- "collateralTracker1": "0x7365664c8101ff7e9422ae2b203822253c31e69c"
15634
- },
15635
- "v2": {
15636
- "semiFungiblePositionManagerV3": "0x9DaD2C40107Db4B29a5450401BB7A28e6eA00e43",
15637
- "semiFungiblePositionManagerV4": "0xD2615995A71644E122cC2FD7FeC2392b971220DE",
15638
- "builderFactory": "0x55f3D2d9D065AA5Fcc11D94c55a6085849e8b6C3",
15639
- "riskEngine": "0x1376aF5ca426B6B9fad6a712c21f6Cf58a94b93c",
15640
- "panopticPoolImplementation": "0x969235B5830f13b58BB699305d9c70A8Cd3BD97C",
15641
- "collateralTrackerImplementation": "0xafcd5F651Ae0403Ff668bb2dAc38BEa907a35Dba",
15642
- "panopticFactoryV3": "0xd9FFCa53C0A6155001Ce8cbcAEfe89DB204690F1",
15643
- "panopticFactoryV4": "0x8FCBb59b05779818D9BAD2686cc44B705603ce03",
15644
- "panopticHelper": "0xfFEbB3A4ab793cB244209d4dA0Cb3e6B07133bd0",
15645
- "panopticMath": "0x6d21699192f5aF112C87e53b32ff846782afF407",
15646
- "panopticQuery": "0x74057945467Fb4eAE9193B46A60ae66a53f06A5b",
15647
- "interactionHelper": "0x643d8DD5372FD6c71f8fAbCce4Eb8857704F3E15"
15648
- }
15649
- },
15650
- "riskEngines": ["0x1376aF5ca426B6B9fad6a712c21f6Cf58a94b93c"],
15651
- "markets": { "ethUsdc5bps": {
15652
- "currency0": "0x0000000000000000000000000000000000000000",
15653
- "currency1": "0xFFFeD8254566B7F800f6D8CDb843ec75AE49B07A",
15654
- "fee": 500,
15655
- "tickSpacing": 10,
15656
- "poolId": "0xba6673bcb27568a73a93dd23b20c8174fa16193cd90905be859144e8f13097a5"
15657
- } },
15658
- "subgraphs": {
15659
- "hypovault": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/hypovault-subgraph-sepolia/prod/gn",
15660
- "panoptic": "https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/panoptic-subgraph-sepolia/v2_prod/gn"
15661
- }
15662
- };
15663
- var chainDeployments_data_default = {
15664
- "1": _1,
15665
- "8453": _8453,
15666
- "11155111": _11155111
15667
- };
15668
-
15669
- //#endregion
15670
- //#region ../deployments/src/chainDeployments.js
15671
- const MAINNET_CHAIN_ID = 1;
15672
- const SEPOLIA_CHAIN_ID = 11155111;
15673
- const BASE_CHAIN_ID = 8453;
15674
- const CHAIN_DEPLOYMENTS = chainDeployments_data_default;
15675
- function getChainDeployment(chainId) {
15676
- return CHAIN_DEPLOYMENTS[chainId];
15677
- }
15678
- function requireChainDeployment(chainId) {
15679
- const deployment = getChainDeployment(chainId);
15680
- if (deployment === void 0) throw new Error(`Unsupported chain deployment for chainId ${chainId}`);
15681
- return deployment;
15682
- }
15683
- function isSupportedChain(chainId) {
15684
- return getChainDeployment(chainId) !== void 0;
15685
- }
15686
- function getEthUsdcMarket(deployment) {
15687
- const market = deployment.markets.ethUsdc5bps ?? deployment.markets.ethUsdc30bps;
15688
- if (market === void 0) throw new Error(`Missing ETH/USDC market for chainId ${deployment.chainId}`);
15689
- return market;
15690
- }
15691
- const MAINNET_DEPLOYMENT = CHAIN_DEPLOYMENTS[MAINNET_CHAIN_ID];
15692
- const MAINNET_PANOPTIC_V2_ADDRESSES = MAINNET_DEPLOYMENT.panoptic.v2;
15693
- const SEPOLIA_DEPLOYMENT = CHAIN_DEPLOYMENTS[SEPOLIA_CHAIN_ID];
15694
- const SEPOLIA_HYPOVAULT_CORE_ADDRESSES = SEPOLIA_DEPLOYMENT.hypovault.core;
15695
- const SEPOLIA_HYPOVAULT_ADDRESSES = SEPOLIA_DEPLOYMENT.hypovault.vaults;
15696
- const SEPOLIA_HYPOVAULT_MANAGER_ADDRESSES = SEPOLIA_DEPLOYMENT.hypovault.managers;
15697
- const SEPOLIA_HYPOVAULT_MANAGER_TURNKEY_SIGNERS = SEPOLIA_DEPLOYMENT.hypovault.turnkeySigners;
15698
- const SEPOLIA_PANOPTIC_POOL_ADDRESSES = SEPOLIA_DEPLOYMENT.panoptic.pool;
15699
- const SEPOLIA_PANOPTIC_V2_ADDRESSES = SEPOLIA_DEPLOYMENT.panoptic.v2;
15700
- const BASE_DEPLOYMENT = CHAIN_DEPLOYMENTS[BASE_CHAIN_ID];
15701
- const BASE_HYPOVAULT_CORE_ADDRESSES = BASE_DEPLOYMENT.hypovault.core;
15702
- const BASE_HYPOVAULT_ADDRESSES = BASE_DEPLOYMENT.hypovault.vaults;
15703
- const BASE_HYPOVAULT_MANAGER_ADDRESSES = BASE_DEPLOYMENT.hypovault.managers;
15704
- const BASE_HYPOVAULT_MANAGER_TURNKEY_SIGNERS = BASE_DEPLOYMENT.hypovault.turnkeySigners;
15705
- const BASE_PANOPTIC_POOL_ADDRESSES = BASE_DEPLOYMENT.panoptic.pool;
15706
- const BASE_PANOPTIC_V2_ADDRESSES = BASE_DEPLOYMENT.panoptic.v2;
15707
- const BASE_ETH_USDC_5BPS_MARKET = getEthUsdcMarket(BASE_DEPLOYMENT);
15708
- const SEPOLIA_ETH_USDC_5BPS_MARKET = getEthUsdcMarket(SEPOLIA_DEPLOYMENT);
15709
-
15710
- //#endregion
15711
- //#region ../deployments/src/vaultDisplayNames.js
15712
- const mainnetDeployment = requireChainDeployment(MAINNET_CHAIN_ID);
15713
- const mainnetVaults = mainnetDeployment.hypovault.vaults;
15714
- const legacyMainnetVaults = {
15715
- wethPlpVault: "0x779a2aa634A004b3a3f3b322083744869BBC6D66",
15716
- usdcPlpVault: "0x963Fe9c93bc353602656ee4051A75114bA74d6c5"
15717
- };
15718
- const sepoliaDeployment = requireChainDeployment(SEPOLIA_CHAIN_ID);
15719
- const sepoliaVaults = sepoliaDeployment.hypovault.vaults;
15720
- const baseDeployment = requireChainDeployment(BASE_CHAIN_ID);
15721
- const baseVaults = baseDeployment.hypovault.vaults;
15722
- const VAULT_DISPLAY_NAMES_PER_CHAIN = {
15723
- [MAINNET_CHAIN_ID]: {
15724
- [mainnetVaults.wethPlpVault.toLowerCase()]: "PLP Vault",
15725
- [mainnetVaults.usdcPlpVault.toLowerCase()]: "Unicorn Vault",
15726
- [legacyMainnetVaults.wethPlpVault.toLowerCase()]: "PLP Vault",
15727
- [legacyMainnetVaults.usdcPlpVault.toLowerCase()]: "Unicorn Vault"
15728
- },
15729
- [BASE_CHAIN_ID]: {
15730
- [baseVaults.wethPlpVault.toLowerCase()]: "PLP Vault",
15731
- [baseVaults.usdcPlpVault.toLowerCase()]: "Unicorn Vault"
15732
- },
15733
- [SEPOLIA_CHAIN_ID]: {
15734
- [sepoliaVaults.wethPlpVault.toLowerCase()]: "PLP Vault",
15735
- [sepoliaVaults.usdcPlpVault.toLowerCase()]: "Unicorn Vault"
15736
- }
15737
- };
15738
- const VAULT_DISPLAY_NAME_RESOLVERS_PER_CHAIN = {
15739
- [MAINNET_CHAIN_ID]: {
15740
- [mainnetVaults.wethPlpVault.toLowerCase()]: () => "PLP Vault",
15741
- [mainnetVaults.usdcPlpVault.toLowerCase()]: () => "Unicorn Vault",
15742
- [legacyMainnetVaults.wethPlpVault.toLowerCase()]: () => "PLP Vault",
15743
- [legacyMainnetVaults.usdcPlpVault.toLowerCase()]: () => "Unicorn Vault"
15744
- },
15745
- [BASE_CHAIN_ID]: {
15746
- [baseVaults.wethPlpVault.toLowerCase()]: () => "PLP Vault",
15747
- [baseVaults.usdcPlpVault.toLowerCase()]: () => "Unicorn Vault"
15748
- },
15749
- [SEPOLIA_CHAIN_ID]: {
15750
- [sepoliaVaults.wethPlpVault.toLowerCase()]: () => "PLP Vault",
15751
- [sepoliaVaults.usdcPlpVault.toLowerCase()]: () => "Unicorn Vault"
15752
- }
15753
- };
15754
- function resolveVaultDisplayName({ chainId, vaultAddress, underlyingSymbol, fallbackName }) {
15755
- const vaultAddressLower = vaultAddress.toLowerCase();
15756
- const resolver = VAULT_DISPLAY_NAME_RESOLVERS_PER_CHAIN[chainId]?.[vaultAddressLower];
15757
- if (resolver !== void 0) return resolver({
15758
- chainId,
15759
- vaultAddress: vaultAddressLower,
15760
- underlyingSymbol,
15761
- fallbackName
15762
- });
15763
- const staticName = VAULT_DISPLAY_NAMES_PER_CHAIN[chainId]?.[vaultAddressLower];
15764
- if (staticName !== void 0) return staticName;
15765
- if (fallbackName !== void 0 && fallbackName !== null) return fallbackName;
15766
- return "Vault";
15767
- }
15768
-
15769
15472
  //#endregion
15770
15473
  //#region src/hypoVault/hypoVaultManagerConfigs/usdcPlpVaultBaseProdConfig.ts
15771
15474
  const BASE_DEPLOYMENT$3 = requireChainDeployment(BASE_CHAIN_ID);
@@ -16336,7 +16039,7 @@ async function buildManagerInputAtBlock({ viemClient, poolInfos, tokenIds, under
16336
16039
 
16337
16040
  //#endregion
16338
16041
  //#region src/hypoVault/utils/vaultManagerInput.ts
16339
- const DEFAULT_MANAGER_INPUT = "0x";
16042
+ const DEFAULT_MANAGER_INPUT$1 = "0x";
16340
16043
  const PAGE_SIZE = 1e3;
16341
16044
  const VAULT_POOL_INFOS_BY_CHAIN = {
16342
16045
  [MAINNET_CHAIN_ID]: [
@@ -16708,7 +16411,7 @@ async function resolveVaultTokenIdsByPool({ viemClient, chainId, vaultAddress, m
16708
16411
  }
16709
16412
  async function buildVaultManagerInput({ viemClient, chainId, vaultAddress, underlyingToken, managerAddress, panopticSubgraphUrl, fetchFn }) {
16710
16413
  const poolInfos = getVaultPoolInfos(vaultAddress, chainId);
16711
- if (poolInfos.length === 0) return DEFAULT_MANAGER_INPUT;
16414
+ if (poolInfos.length === 0) return DEFAULT_MANAGER_INPUT$1;
16712
16415
  const tokenIds = await resolveVaultTokenIdsByPool({
16713
16416
  viemClient,
16714
16417
  chainId,
@@ -16727,7 +16430,7 @@ async function buildVaultManagerInput({ viemClient, chainId, vaultAddress, under
16727
16430
  }
16728
16431
  async function buildVaultManagerInputAtBlock({ viemClient, chainId, vaultAddress, underlyingToken, blockNumber, managerAddress, panopticSubgraphUrl, fetchFn }) {
16729
16432
  const poolInfos = getVaultPoolInfos(vaultAddress, chainId);
16730
- if (poolInfos.length === 0) return DEFAULT_MANAGER_INPUT;
16433
+ if (poolInfos.length === 0) return DEFAULT_MANAGER_INPUT$1;
16731
16434
  const tokenIds = await resolveVaultTokenIdsByPool({
16732
16435
  viemClient,
16733
16436
  chainId,
@@ -16765,7 +16468,7 @@ const erc20BalanceOfAbi = [{
16765
16468
  function toLowerAddress(address) {
16766
16469
  return address.toLowerCase();
16767
16470
  }
16768
- function discoverPoolAddresses({ chainId, vaultAddress }) {
16471
+ function discoverPoolAddresses$1({ chainId, vaultAddress }) {
16769
16472
  const discoveredAddresses = [];
16770
16473
  const seen = new Set();
16771
16474
  const config = getHypoVaultConfigForVault(vaultAddress, chainId);
@@ -16794,7 +16497,7 @@ function getUnderlyingIndex({ underlyingTokenAddress, token0Asset, token1Asset }
16794
16497
  return null;
16795
16498
  }
16796
16499
  async function getLendingAllocationRows({ client, chainId, vaultAddress, underlyingTokenAddress, blockNumber }) {
16797
- const poolAddresses = discoverPoolAddresses({
16500
+ const poolAddresses = discoverPoolAddresses$1({
16798
16501
  chainId,
16799
16502
  vaultAddress
16800
16503
  });
@@ -16867,6 +16570,704 @@ async function getLendingAllocationRows({ client, chainId, vaultAddress, underly
16867
16570
  };
16868
16571
  }
16869
16572
 
16573
+ //#endregion
16574
+ //#region src/hypoVault/analytics/vaultLendingAllocation.ts
16575
+ const erc20Abi$1 = [
16576
+ {
16577
+ type: "function",
16578
+ name: "balanceOf",
16579
+ inputs: [{
16580
+ name: "account",
16581
+ type: "address"
16582
+ }],
16583
+ outputs: [{
16584
+ name: "balance",
16585
+ type: "uint256"
16586
+ }],
16587
+ stateMutability: "view"
16588
+ },
16589
+ {
16590
+ type: "function",
16591
+ name: "symbol",
16592
+ inputs: [],
16593
+ outputs: [{
16594
+ name: "symbol",
16595
+ type: "string"
16596
+ }],
16597
+ stateMutability: "view"
16598
+ },
16599
+ {
16600
+ type: "function",
16601
+ name: "decimals",
16602
+ inputs: [],
16603
+ outputs: [{
16604
+ name: "decimals",
16605
+ type: "uint8"
16606
+ }],
16607
+ stateMutability: "view"
16608
+ }
16609
+ ];
16610
+ const WAD$1 = 1000000000000000000n;
16611
+ const SECONDS_PER_YEAR$1 = 365n * 24n * 60n * 60n;
16612
+ const Q128 = 2n ** 128n;
16613
+ /**
16614
+ * Matches the on-chain `PanopticMath.convert0to1` / `convert1to0` truncation
16615
+ * semantics (same as `~/utils/panopticMath` in the UI app, without the
16616
+ * `@uniswap/v3-sdk` dependency).
16617
+ */
16618
+ function convert0to1(amount, sqrtPriceX96) {
16619
+ if (sqrtPriceX96 < Q128) return amount * sqrtPriceX96 * sqrtPriceX96 >> 192n;
16620
+ const sp2Hi = sqrtPriceX96 * sqrtPriceX96 >> 64n;
16621
+ return amount * sp2Hi >> 128n;
16622
+ }
16623
+ function convert1to0(amount, sqrtPriceX96) {
16624
+ if (sqrtPriceX96 < Q128) return amount * 2n ** 192n / (sqrtPriceX96 * sqrtPriceX96);
16625
+ const sp2Hi = sqrtPriceX96 * sqrtPriceX96 >> 64n;
16626
+ return amount * 2n ** 128n / sp2Hi;
16627
+ }
16628
+ function adjustUnderlyingIdleBalance({ rawUnderlyingBalance, unfulfilledDepositAssets, reservedWithdrawalAssets: _reservedWithdrawalAssets }) {
16629
+ const nonIdleUnderlying = unfulfilledDepositAssets;
16630
+ return rawUnderlyingBalance > nonIdleUnderlying ? rawUnderlyingBalance - nonIdleUnderlying : 0n;
16631
+ }
16632
+ function isNativeToken(tokenAddress) {
16633
+ return tokenAddress.toLowerCase() === zeroAddress;
16634
+ }
16635
+ function addressesEqual(a, b) {
16636
+ return a.toLowerCase() === b.toLowerCase();
16637
+ }
16638
+ function discoverPoolAddresses({ chainId, vaultAddress }) {
16639
+ const seen = new Set();
16640
+ const addresses = [];
16641
+ const config = getHypoVaultConfigForVault(vaultAddress, chainId);
16642
+ const configuredPool = config?.addresses?.ethUsdc500bpsV4PanopticPool;
16643
+ if (configuredPool !== void 0) {
16644
+ const key = configuredPool.toLowerCase();
16645
+ if (!seen.has(key)) {
16646
+ seen.add(key);
16647
+ addresses.push(configuredPool);
16648
+ }
16649
+ }
16650
+ const artifactInfos = getVaultPoolInfos(vaultAddress, chainId);
16651
+ for (const info of artifactInfos) {
16652
+ const key = info.pool.toLowerCase();
16653
+ if (!seen.has(key)) {
16654
+ seen.add(key);
16655
+ addresses.push(info.pool);
16656
+ }
16657
+ }
16658
+ return addresses;
16659
+ }
16660
+ function computeAllocationPctBps({ allocationUnderlying, totalUnderlying }) {
16661
+ if (totalUnderlying === 0n) return 0n;
16662
+ return allocationUnderlying * 10000n / totalUnderlying;
16663
+ }
16664
+ function toBigInt$1(value) {
16665
+ if (typeof value === "bigint") return value;
16666
+ if (typeof value === "string" || typeof value === "number") return BigInt(value);
16667
+ return null;
16668
+ }
16669
+ function getAssetsDepositedFromDepositEpochState$1(value) {
16670
+ if (Array.isArray(value) && value.length > 0) return toBigInt$1(value[0]) ?? 0n;
16671
+ if (typeof value === "object" && value !== null && "assetsDeposited" in value) {
16672
+ const state = value;
16673
+ return state.assetsDeposited === void 0 ? 0n : toBigInt$1(state.assetsDeposited) ?? 0n;
16674
+ }
16675
+ return 0n;
16676
+ }
16677
+ async function readTokenSymbol({ client, tokenAddress, blockNumber }) {
16678
+ if (isNativeToken(tokenAddress)) return "ETH";
16679
+ return client.readContract({
16680
+ address: tokenAddress,
16681
+ abi: erc20Abi$1,
16682
+ functionName: "symbol",
16683
+ ...blockNumber === void 0 ? {} : { blockNumber }
16684
+ });
16685
+ }
16686
+ async function readTokenDecimals({ client, tokenAddress, blockNumber }) {
16687
+ if (isNativeToken(tokenAddress)) return 18;
16688
+ try {
16689
+ const decimals = await client.readContract({
16690
+ address: tokenAddress,
16691
+ abi: erc20Abi$1,
16692
+ functionName: "decimals",
16693
+ ...blockNumber === void 0 ? {} : { blockNumber }
16694
+ });
16695
+ const parsed = Number(decimals);
16696
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : 18;
16697
+ } catch {
16698
+ return 18;
16699
+ }
16700
+ }
16701
+ async function readTokenBalance({ client, tokenAddress, owner, blockNumber }) {
16702
+ if (isNativeToken(tokenAddress)) return client.getBalance({
16703
+ address: owner,
16704
+ ...blockNumber === void 0 ? {} : { blockNumber }
16705
+ });
16706
+ return client.readContract({
16707
+ address: tokenAddress,
16708
+ abi: erc20Abi$1,
16709
+ functionName: "balanceOf",
16710
+ args: [owner],
16711
+ ...blockNumber === void 0 ? {} : { blockNumber }
16712
+ });
16713
+ }
16714
+ function resolveUnderlyingPoolToken({ underlyingTokenAddress, token0Address, token1Address }) {
16715
+ if (addressesEqual(underlyingTokenAddress, token0Address) || addressesEqual(underlyingTokenAddress, token1Address)) return underlyingTokenAddress;
16716
+ if (isNativeToken(token0Address)) return token0Address;
16717
+ return null;
16718
+ }
16719
+ function convertToUnderlying({ amount, sourceTokenAddress, token0Address, token1Address, underlyingPoolTokenAddress, twapTick }) {
16720
+ if (amount === 0n) return 0n;
16721
+ if (addressesEqual(sourceTokenAddress, underlyingPoolTokenAddress)) return amount;
16722
+ const sourceIsToken0 = addressesEqual(sourceTokenAddress, token0Address);
16723
+ const sourceIsToken1 = addressesEqual(sourceTokenAddress, token1Address);
16724
+ const underlyingIsToken0 = addressesEqual(underlyingPoolTokenAddress, token0Address);
16725
+ const underlyingIsToken1 = addressesEqual(underlyingPoolTokenAddress, token1Address);
16726
+ if (!sourceIsToken0 && !sourceIsToken1 || !underlyingIsToken0 && !underlyingIsToken1) return 0n;
16727
+ const sqrtPriceX96 = tickToSqrtPriceX96(BigInt(twapTick));
16728
+ if (sourceIsToken0 && underlyingIsToken1) return convert0to1(amount, sqrtPriceX96);
16729
+ if (sourceIsToken1 && underlyingIsToken0) return convert1to0(amount, sqrtPriceX96);
16730
+ return 0n;
16731
+ }
16732
+ function convertSignedToUnderlying({ amount, sourceTokenAddress, token0Address, token1Address, underlyingPoolTokenAddress, twapTick }) {
16733
+ if (amount >= 0n) return convertToUnderlying({
16734
+ amount,
16735
+ sourceTokenAddress,
16736
+ token0Address,
16737
+ token1Address,
16738
+ underlyingPoolTokenAddress,
16739
+ twapTick
16740
+ });
16741
+ return -convertToUnderlying({
16742
+ amount: -amount,
16743
+ sourceTokenAddress,
16744
+ token0Address,
16745
+ token1Address,
16746
+ underlyingPoolTokenAddress,
16747
+ twapTick
16748
+ });
16749
+ }
16750
+ function calculateVaultNetLendingApyPctFromTrackerInputs(inputs) {
16751
+ let totalAssetsUnderlying = 0n;
16752
+ let totalNetYieldUnderlying = 0n;
16753
+ for (const input of inputs) {
16754
+ if (input.assets === 0n) continue;
16755
+ const supplyRateWad = input.interestRateWad * input.utilizationBps / 10000n;
16756
+ const annualSupplyRateWad = supplyRateWad * SECONDS_PER_YEAR$1;
16757
+ const annualBorrowRateWad = input.interestRateWad * SECONDS_PER_YEAR$1;
16758
+ const positiveNetBorrows = input.netBorrows > 0n ? input.netBorrows : 0n;
16759
+ const grossSupplyYield = input.assets * annualSupplyRateWad / WAD$1;
16760
+ const borrowCost = positiveNetBorrows * annualBorrowRateWad / WAD$1;
16761
+ const netYield = grossSupplyYield - borrowCost;
16762
+ const assetsUnderlying = convertToUnderlying({
16763
+ amount: input.assets,
16764
+ sourceTokenAddress: input.sourceTokenAddress,
16765
+ token0Address: input.token0Address,
16766
+ token1Address: input.token1Address,
16767
+ underlyingPoolTokenAddress: input.underlyingPoolTokenAddress,
16768
+ twapTick: input.twapTick
16769
+ });
16770
+ if (assetsUnderlying === 0n) continue;
16771
+ const netYieldUnderlying = convertSignedToUnderlying({
16772
+ amount: netYield,
16773
+ sourceTokenAddress: input.sourceTokenAddress,
16774
+ token0Address: input.token0Address,
16775
+ token1Address: input.token1Address,
16776
+ underlyingPoolTokenAddress: input.underlyingPoolTokenAddress,
16777
+ twapTick: input.twapTick
16778
+ });
16779
+ totalAssetsUnderlying += assetsUnderlying;
16780
+ totalNetYieldUnderlying += netYieldUnderlying;
16781
+ }
16782
+ if (totalAssetsUnderlying === 0n) return null;
16783
+ const apyPct = new Decimal(totalNetYieldUnderlying.toString()).div(totalAssetsUnderlying.toString()).mul(100).toNumber();
16784
+ return Number.isFinite(apyPct) ? apyPct : null;
16785
+ }
16786
+ function calculateVaultNetLendingYieldUnderlyingFromTrackerInputs({ inputs, intervalSeconds }) {
16787
+ if (intervalSeconds <= 0n) return 0n;
16788
+ let sawAssets = false;
16789
+ let totalNetYieldUnderlying = 0n;
16790
+ for (const input of inputs) {
16791
+ if (input.assets === 0n) continue;
16792
+ const supplyRateWad = input.interestRateWad * input.utilizationBps / 10000n;
16793
+ const supplyYield = input.assets * supplyRateWad * intervalSeconds / WAD$1;
16794
+ const positiveNetBorrows = input.netBorrows > 0n ? input.netBorrows : 0n;
16795
+ const borrowCost = positiveNetBorrows * input.interestRateWad * intervalSeconds / WAD$1;
16796
+ const netYield = supplyYield - borrowCost;
16797
+ const netYieldUnderlying = convertSignedToUnderlying({
16798
+ amount: netYield,
16799
+ sourceTokenAddress: input.sourceTokenAddress,
16800
+ token0Address: input.token0Address,
16801
+ token1Address: input.token1Address,
16802
+ underlyingPoolTokenAddress: input.underlyingPoolTokenAddress,
16803
+ twapTick: input.twapTick
16804
+ });
16805
+ sawAssets = true;
16806
+ totalNetYieldUnderlying += netYieldUnderlying;
16807
+ }
16808
+ return sawAssets ? totalNetYieldUnderlying : null;
16809
+ }
16810
+ async function fetchVaultNetLendingApyPct({ client, chainId, vaultAddress, underlyingTokenAddress, blockNumber }) {
16811
+ const poolAddresses = discoverPoolAddresses({
16812
+ chainId,
16813
+ vaultAddress
16814
+ });
16815
+ if (poolAddresses.length === 0) return null;
16816
+ const poolContexts = await Promise.all(poolAddresses.map(async (poolAddress) => {
16817
+ const [collateral0Address, collateral1Address] = await Promise.all([client.readContract({
16818
+ address: poolAddress,
16819
+ abi: panopticPoolV2Abi,
16820
+ functionName: "collateralToken0",
16821
+ ...blockNumber === void 0 ? {} : { blockNumber }
16822
+ }), client.readContract({
16823
+ address: poolAddress,
16824
+ abi: panopticPoolV2Abi,
16825
+ functionName: "collateralToken1",
16826
+ ...blockNumber === void 0 ? {} : { blockNumber }
16827
+ })]);
16828
+ const [token0Address, token1Address] = await Promise.all([client.readContract({
16829
+ address: collateral0Address,
16830
+ abi: collateralTrackerV2Abi,
16831
+ functionName: "asset",
16832
+ ...blockNumber === void 0 ? {} : { blockNumber }
16833
+ }), client.readContract({
16834
+ address: collateral1Address,
16835
+ abi: collateralTrackerV2Abi,
16836
+ functionName: "asset",
16837
+ ...blockNumber === void 0 ? {} : { blockNumber }
16838
+ })]);
16839
+ return {
16840
+ poolAddress,
16841
+ token0Address,
16842
+ token1Address,
16843
+ collateral0Address,
16844
+ collateral1Address
16845
+ };
16846
+ }));
16847
+ const trackerInputs = await Promise.all(poolContexts.flatMap((context) => [0, 1].map(async (tokenIndex) => {
16848
+ const trackerAddress = tokenIndex === 0 ? context.collateral0Address : context.collateral1Address;
16849
+ const trackerTokenAddress = tokenIndex === 0 ? context.token0Address : context.token1Address;
16850
+ const underlyingPoolTokenAddress = resolveUnderlyingPoolToken({
16851
+ underlyingTokenAddress,
16852
+ token0Address: context.token0Address,
16853
+ token1Address: context.token1Address
16854
+ });
16855
+ if (underlyingPoolTokenAddress === null) return null;
16856
+ const [interestRate, poolData, trackerAssets, interestState, twapTick] = await Promise.all([
16857
+ client.readContract({
16858
+ address: trackerAddress,
16859
+ abi: collateralTrackerV2Abi,
16860
+ functionName: "interestRate",
16861
+ ...blockNumber === void 0 ? {} : { blockNumber }
16862
+ }),
16863
+ client.readContract({
16864
+ address: trackerAddress,
16865
+ abi: collateralTrackerV2Abi,
16866
+ functionName: "getPoolData",
16867
+ ...blockNumber === void 0 ? {} : { blockNumber }
16868
+ }),
16869
+ client.readContract({
16870
+ address: trackerAddress,
16871
+ abi: collateralTrackerV2Abi,
16872
+ functionName: "assetsOf",
16873
+ args: [vaultAddress],
16874
+ ...blockNumber === void 0 ? {} : { blockNumber }
16875
+ }),
16876
+ client.readContract({
16877
+ address: trackerAddress,
16878
+ abi: collateralTrackerV2Abi,
16879
+ functionName: "interestState",
16880
+ args: [vaultAddress],
16881
+ ...blockNumber === void 0 ? {} : { blockNumber }
16882
+ }),
16883
+ client.readContract({
16884
+ address: context.poolAddress,
16885
+ abi: panopticPoolV2Abi,
16886
+ functionName: "getTWAP",
16887
+ ...blockNumber === void 0 ? {} : { blockNumber }
16888
+ })
16889
+ ]);
16890
+ if (trackerAssets === 0n) return null;
16891
+ return {
16892
+ assets: trackerAssets,
16893
+ netBorrows: interestState[1],
16894
+ interestRateWad: interestRate,
16895
+ utilizationBps: poolData[3],
16896
+ sourceTokenAddress: trackerTokenAddress,
16897
+ token0Address: context.token0Address,
16898
+ token1Address: context.token1Address,
16899
+ underlyingPoolTokenAddress,
16900
+ twapTick
16901
+ };
16902
+ })));
16903
+ return calculateVaultNetLendingApyPctFromTrackerInputs(trackerInputs.filter((input) => input !== null));
16904
+ }
16905
+ async function fetchVaultNetLendingYieldUnderlying({ client, chainId, vaultAddress, underlyingTokenAddress, blockNumber, intervalSeconds }) {
16906
+ const poolAddresses = discoverPoolAddresses({
16907
+ chainId,
16908
+ vaultAddress
16909
+ });
16910
+ if (poolAddresses.length === 0) return null;
16911
+ const poolContexts = await Promise.all(poolAddresses.map(async (poolAddress) => {
16912
+ const [collateral0Address, collateral1Address] = await Promise.all([client.readContract({
16913
+ address: poolAddress,
16914
+ abi: panopticPoolV2Abi,
16915
+ functionName: "collateralToken0",
16916
+ blockNumber
16917
+ }), client.readContract({
16918
+ address: poolAddress,
16919
+ abi: panopticPoolV2Abi,
16920
+ functionName: "collateralToken1",
16921
+ blockNumber
16922
+ })]);
16923
+ const [token0Address, token1Address] = await Promise.all([client.readContract({
16924
+ address: collateral0Address,
16925
+ abi: collateralTrackerV2Abi,
16926
+ functionName: "asset",
16927
+ blockNumber
16928
+ }), client.readContract({
16929
+ address: collateral1Address,
16930
+ abi: collateralTrackerV2Abi,
16931
+ functionName: "asset",
16932
+ blockNumber
16933
+ })]);
16934
+ return {
16935
+ poolAddress,
16936
+ token0Address,
16937
+ token1Address,
16938
+ collateral0Address,
16939
+ collateral1Address
16940
+ };
16941
+ }));
16942
+ const trackerInputs = await Promise.all(poolContexts.flatMap((context) => [0, 1].map(async (tokenIndex) => {
16943
+ const trackerAddress = tokenIndex === 0 ? context.collateral0Address : context.collateral1Address;
16944
+ const trackerTokenAddress = tokenIndex === 0 ? context.token0Address : context.token1Address;
16945
+ const underlyingPoolTokenAddress = resolveUnderlyingPoolToken({
16946
+ underlyingTokenAddress,
16947
+ token0Address: context.token0Address,
16948
+ token1Address: context.token1Address
16949
+ });
16950
+ if (underlyingPoolTokenAddress === null) return null;
16951
+ const [interestRate, poolData, trackerAssets, interestState, twapTick] = await Promise.all([
16952
+ client.readContract({
16953
+ address: trackerAddress,
16954
+ abi: collateralTrackerV2Abi,
16955
+ functionName: "interestRate",
16956
+ blockNumber
16957
+ }),
16958
+ client.readContract({
16959
+ address: trackerAddress,
16960
+ abi: collateralTrackerV2Abi,
16961
+ functionName: "getPoolData",
16962
+ blockNumber
16963
+ }),
16964
+ client.readContract({
16965
+ address: trackerAddress,
16966
+ abi: collateralTrackerV2Abi,
16967
+ functionName: "assetsOf",
16968
+ args: [vaultAddress],
16969
+ blockNumber
16970
+ }),
16971
+ client.readContract({
16972
+ address: trackerAddress,
16973
+ abi: collateralTrackerV2Abi,
16974
+ functionName: "interestState",
16975
+ args: [vaultAddress],
16976
+ blockNumber
16977
+ }),
16978
+ client.readContract({
16979
+ address: context.poolAddress,
16980
+ abi: panopticPoolV2Abi,
16981
+ functionName: "getTWAP",
16982
+ blockNumber
16983
+ })
16984
+ ]);
16985
+ if (trackerAssets === 0n) return null;
16986
+ return {
16987
+ assets: trackerAssets,
16988
+ netBorrows: interestState[1],
16989
+ interestRateWad: interestRate,
16990
+ utilizationBps: poolData[3],
16991
+ sourceTokenAddress: trackerTokenAddress,
16992
+ token0Address: context.token0Address,
16993
+ token1Address: context.token1Address,
16994
+ underlyingPoolTokenAddress,
16995
+ twapTick
16996
+ };
16997
+ })));
16998
+ return calculateVaultNetLendingYieldUnderlyingFromTrackerInputs({
16999
+ inputs: trackerInputs.filter((input) => input !== null),
17000
+ intervalSeconds
17001
+ });
17002
+ }
17003
+ async function fetchVaultLendingAllocation({ client, chainId, vaultAddress, underlyingTokenAddress, blockNumber }) {
17004
+ const [reservedWithdrawalAssetsRaw, depositEpochRaw] = await Promise.all([client.readContract({
17005
+ address: vaultAddress,
17006
+ abi: HypoVaultAbi,
17007
+ functionName: "reservedWithdrawalAssets",
17008
+ ...blockNumber === void 0 ? {} : { blockNumber }
17009
+ }), client.readContract({
17010
+ address: vaultAddress,
17011
+ abi: HypoVaultAbi,
17012
+ functionName: "depositEpoch",
17013
+ ...blockNumber === void 0 ? {} : { blockNumber }
17014
+ })]);
17015
+ const reservedWithdrawalAssets = toBigInt$1(reservedWithdrawalAssetsRaw) ?? 0n;
17016
+ const depositEpoch = toBigInt$1(depositEpochRaw);
17017
+ const depositEpochStateRaw = depositEpoch === null ? null : await client.readContract({
17018
+ address: vaultAddress,
17019
+ abi: HypoVaultAbi,
17020
+ functionName: "depositEpochState",
17021
+ args: [depositEpoch],
17022
+ ...blockNumber === void 0 ? {} : { blockNumber }
17023
+ });
17024
+ const unfulfilledDepositAssets = depositEpochStateRaw === null ? 0n : getAssetsDepositedFromDepositEpochState$1(depositEpochStateRaw);
17025
+ const poolAddresses = discoverPoolAddresses({
17026
+ chainId,
17027
+ vaultAddress
17028
+ });
17029
+ const poolContexts = await Promise.all(poolAddresses.map(async (poolAddress) => {
17030
+ const [collateral0Address, collateral1Address] = await Promise.all([client.readContract({
17031
+ address: poolAddress,
17032
+ abi: panopticPoolV2Abi,
17033
+ functionName: "collateralToken0",
17034
+ ...blockNumber === void 0 ? {} : { blockNumber }
17035
+ }), client.readContract({
17036
+ address: poolAddress,
17037
+ abi: panopticPoolV2Abi,
17038
+ functionName: "collateralToken1",
17039
+ ...blockNumber === void 0 ? {} : { blockNumber }
17040
+ })]);
17041
+ const [token0Address, token1Address] = await Promise.all([client.readContract({
17042
+ address: collateral0Address,
17043
+ abi: collateralTrackerV2Abi,
17044
+ functionName: "asset",
17045
+ ...blockNumber === void 0 ? {} : { blockNumber }
17046
+ }), client.readContract({
17047
+ address: collateral1Address,
17048
+ abi: collateralTrackerV2Abi,
17049
+ functionName: "asset",
17050
+ ...blockNumber === void 0 ? {} : { blockNumber }
17051
+ })]);
17052
+ const [token0Symbol, token1Symbol, token0Decimals, token1Decimals] = await Promise.all([
17053
+ readTokenSymbol({
17054
+ client,
17055
+ tokenAddress: token0Address,
17056
+ blockNumber
17057
+ }),
17058
+ readTokenSymbol({
17059
+ client,
17060
+ tokenAddress: token1Address,
17061
+ blockNumber
17062
+ }),
17063
+ readTokenDecimals({
17064
+ client,
17065
+ tokenAddress: token0Address,
17066
+ blockNumber
17067
+ }),
17068
+ readTokenDecimals({
17069
+ client,
17070
+ tokenAddress: token1Address,
17071
+ blockNumber
17072
+ })
17073
+ ]);
17074
+ return {
17075
+ poolAddress,
17076
+ token0Address,
17077
+ token1Address,
17078
+ token0Symbol,
17079
+ token1Symbol,
17080
+ token0Decimals,
17081
+ token1Decimals,
17082
+ collateral0Address,
17083
+ collateral1Address
17084
+ };
17085
+ }));
17086
+ const trackerRows = await Promise.all(poolContexts.flatMap((context) => [0, 1].map(async (tokenIndex) => {
17087
+ const trackerAddress = tokenIndex === 0 ? context.collateral0Address : context.collateral1Address;
17088
+ const trackerTokenAddress = tokenIndex === 0 ? context.token0Address : context.token1Address;
17089
+ const trackerTokenSymbol = tokenIndex === 0 ? context.token0Symbol : context.token1Symbol;
17090
+ const trackerTokenDecimals = tokenIndex === 0 ? context.token0Decimals : context.token1Decimals;
17091
+ const [interestRate, poolData, trackerAssets, twapTick] = await Promise.all([
17092
+ client.readContract({
17093
+ address: trackerAddress,
17094
+ abi: collateralTrackerV2Abi,
17095
+ functionName: "interestRate",
17096
+ ...blockNumber === void 0 ? {} : { blockNumber }
17097
+ }),
17098
+ client.readContract({
17099
+ address: trackerAddress,
17100
+ abi: collateralTrackerV2Abi,
17101
+ functionName: "getPoolData",
17102
+ ...blockNumber === void 0 ? {} : { blockNumber }
17103
+ }),
17104
+ client.readContract({
17105
+ address: trackerAddress,
17106
+ abi: collateralTrackerV2Abi,
17107
+ functionName: "assetsOf",
17108
+ args: [vaultAddress],
17109
+ ...blockNumber === void 0 ? {} : { blockNumber }
17110
+ }),
17111
+ client.readContract({
17112
+ address: context.poolAddress,
17113
+ abi: panopticPoolV2Abi,
17114
+ functionName: "getTWAP",
17115
+ ...blockNumber === void 0 ? {} : { blockNumber }
17116
+ })
17117
+ ]);
17118
+ if (trackerAssets === 0n) return null;
17119
+ const underlyingPoolTokenAddress = resolveUnderlyingPoolToken({
17120
+ underlyingTokenAddress,
17121
+ token0Address: context.token0Address,
17122
+ token1Address: context.token1Address
17123
+ });
17124
+ if (underlyingPoolTokenAddress === null) return null;
17125
+ const allocationUnderlying = convertToUnderlying({
17126
+ amount: trackerAssets,
17127
+ sourceTokenAddress: trackerTokenAddress,
17128
+ token0Address: context.token0Address,
17129
+ token1Address: context.token1Address,
17130
+ underlyingPoolTokenAddress,
17131
+ twapTick
17132
+ });
17133
+ const utilizationBps = poolData[3];
17134
+ const supplyRateWad = interestRate * utilizationBps / 10000n;
17135
+ return {
17136
+ market: `${context.token0Symbol}/${context.token1Symbol} (${trackerTokenSymbol})`,
17137
+ supplyRateWad,
17138
+ borrowRateWad: interestRate,
17139
+ utilizationBps,
17140
+ allocationSourceRaw: trackerAssets,
17141
+ sourceTokenAddress: trackerTokenAddress,
17142
+ sourceTokenSymbol: trackerTokenSymbol,
17143
+ sourceTokenDecimals: trackerTokenDecimals,
17144
+ allocationUnderlying,
17145
+ isIdle: false,
17146
+ hasCollateralMetrics: true,
17147
+ panopticPoolAddress: context.poolAddress,
17148
+ collateralTrackerAddress: trackerAddress
17149
+ };
17150
+ })));
17151
+ const tokenContexts = new Map();
17152
+ const underlyingSymbol = await readTokenSymbol({
17153
+ client,
17154
+ tokenAddress: underlyingTokenAddress,
17155
+ blockNumber
17156
+ });
17157
+ const underlyingDecimals = await readTokenDecimals({
17158
+ client,
17159
+ tokenAddress: underlyingTokenAddress,
17160
+ blockNumber
17161
+ });
17162
+ tokenContexts.set(underlyingTokenAddress.toLowerCase(), {
17163
+ address: underlyingTokenAddress,
17164
+ symbol: underlyingSymbol,
17165
+ decimals: underlyingDecimals
17166
+ });
17167
+ for (const context of poolContexts) {
17168
+ tokenContexts.set(context.token0Address.toLowerCase(), {
17169
+ address: context.token0Address,
17170
+ symbol: context.token0Symbol,
17171
+ decimals: context.token0Decimals
17172
+ });
17173
+ tokenContexts.set(context.token1Address.toLowerCase(), {
17174
+ address: context.token1Address,
17175
+ symbol: context.token1Symbol,
17176
+ decimals: context.token1Decimals
17177
+ });
17178
+ }
17179
+ const idleRows = await Promise.all(Array.from(tokenContexts.values()).map(async ({ address, symbol, decimals }) => {
17180
+ const balance = await readTokenBalance({
17181
+ client,
17182
+ tokenAddress: address,
17183
+ owner: vaultAddress,
17184
+ blockNumber
17185
+ });
17186
+ const adjustedBalance = addressesEqual(address, underlyingTokenAddress) ? adjustUnderlyingIdleBalance({
17187
+ rawUnderlyingBalance: balance,
17188
+ unfulfilledDepositAssets,
17189
+ reservedWithdrawalAssets
17190
+ }) : balance;
17191
+ if (adjustedBalance === 0n) return null;
17192
+ const convertibleContext = poolContexts.find((context) => {
17193
+ const underlyingPoolTokenAddress$1 = resolveUnderlyingPoolToken({
17194
+ underlyingTokenAddress,
17195
+ token0Address: context.token0Address,
17196
+ token1Address: context.token1Address
17197
+ });
17198
+ if (underlyingPoolTokenAddress$1 === null) return false;
17199
+ return addressesEqual(address, context.token0Address) || addressesEqual(address, context.token1Address) || addressesEqual(address, underlyingPoolTokenAddress$1);
17200
+ });
17201
+ if (convertibleContext === void 0) {
17202
+ const isUnderlyingIdle$1 = addressesEqual(address, underlyingTokenAddress);
17203
+ return {
17204
+ market: `Idle ${symbol}`,
17205
+ supplyRateWad: null,
17206
+ borrowRateWad: null,
17207
+ utilizationBps: null,
17208
+ allocationSourceRaw: adjustedBalance,
17209
+ sourceTokenAddress: address,
17210
+ sourceTokenSymbol: symbol,
17211
+ sourceTokenDecimals: decimals,
17212
+ allocationUnderlying: 0n,
17213
+ isIdle: true,
17214
+ unfulfilledDepositAssetsRaw: isUnderlyingIdle$1 ? unfulfilledDepositAssets : void 0,
17215
+ reservedWithdrawalAssetsRaw: isUnderlyingIdle$1 ? reservedWithdrawalAssets : void 0,
17216
+ hasCollateralMetrics: false,
17217
+ panopticPoolAddress: null,
17218
+ collateralTrackerAddress: null
17219
+ };
17220
+ }
17221
+ const twapTick = await client.readContract({
17222
+ address: convertibleContext.poolAddress,
17223
+ abi: panopticPoolV2Abi,
17224
+ functionName: "getTWAP",
17225
+ ...blockNumber === void 0 ? {} : { blockNumber }
17226
+ });
17227
+ const underlyingPoolTokenAddress = resolveUnderlyingPoolToken({
17228
+ underlyingTokenAddress,
17229
+ token0Address: convertibleContext.token0Address,
17230
+ token1Address: convertibleContext.token1Address
17231
+ });
17232
+ if (underlyingPoolTokenAddress === null) return null;
17233
+ const allocationUnderlying = convertToUnderlying({
17234
+ amount: adjustedBalance,
17235
+ sourceTokenAddress: address,
17236
+ token0Address: convertibleContext.token0Address,
17237
+ token1Address: convertibleContext.token1Address,
17238
+ underlyingPoolTokenAddress,
17239
+ twapTick
17240
+ });
17241
+ const isUnderlyingIdle = addressesEqual(address, underlyingTokenAddress);
17242
+ return {
17243
+ market: `Idle ${symbol}`,
17244
+ supplyRateWad: null,
17245
+ borrowRateWad: null,
17246
+ utilizationBps: null,
17247
+ allocationSourceRaw: adjustedBalance,
17248
+ sourceTokenAddress: address,
17249
+ sourceTokenSymbol: symbol,
17250
+ sourceTokenDecimals: decimals,
17251
+ allocationUnderlying,
17252
+ isIdle: true,
17253
+ unfulfilledDepositAssetsRaw: isUnderlyingIdle ? unfulfilledDepositAssets : void 0,
17254
+ reservedWithdrawalAssetsRaw: isUnderlyingIdle ? reservedWithdrawalAssets : void 0,
17255
+ hasCollateralMetrics: false,
17256
+ panopticPoolAddress: null,
17257
+ collateralTrackerAddress: null
17258
+ };
17259
+ }));
17260
+ const rowsWithoutPct = [...trackerRows.filter((row) => row !== null), ...idleRows.filter((row) => row !== null)];
17261
+ const totalUnderlying = rowsWithoutPct.reduce((sum, row) => sum + row.allocationUnderlying, 0n);
17262
+ return rowsWithoutPct.map((row) => ({
17263
+ ...row,
17264
+ allocationPctBps: computeAllocationPctBps({
17265
+ allocationUnderlying: row.allocationUnderlying,
17266
+ totalUnderlying
17267
+ })
17268
+ }));
17269
+ }
17270
+
16870
17271
  //#endregion
16871
17272
  //#region src/hypoVault/cancelDeposit/cancelDeposit.ts
16872
17273
  const getCancelDepositContractConfig = ({ vaultAddress }) => ({
@@ -19316,282 +19717,32 @@ const useRequestWithdrawal = ({ chainId, vaultAddress, desiredAssets, requestAll
19316
19717
  };
19317
19718
 
19318
19719
  //#endregion
19319
- //#region src/hypoVault/staleOracleOverride.ts
19320
- const PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE = "0x608060405234801561000f575f5ffd5b5060043610610090575f3560e01c80638da5cb5b116100635780638da5cb5b14610135578063995cac6d14610145578063a519c19814610158578063d597b7361461016b578063f2fde38b1461017e575f5ffd5b8063016ff32e1461009457806328d6ae4a146100cb5780634f0e0ef3146100ec578063715018a61461012b575b5f5ffd5b6100b66100a236600461274b565b60026020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100de6100d9366004612766565b610191565b6040519081526020016100c2565b6101137f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c2565b6101336101b3565b005b5f546001600160a01b0316610113565b6101336101533660046127d0565b6101c6565b61013361016636600461274b565b610598565b6100de610179366004612881565b6105c3565b61013361018c36600461274b565b611865565b6001602052815f5260405f2081600281106101aa575f80fd5b01549150829050565b6101bb6118a7565b6101c45f6118d3565b565b6101ce6118a7565b6001600160a01b0385165f9081526002602052604090205460ff1615610207576040516372b89e9760e11b815260040160405180910390fd5b5f5b838110156102ac575f5b818110156102a35785858281811061022d5761022d61290d565b610243926020608090920201908101915061274b565b6001600160a01b031686868481811061025e5761025e61290d565b610274926020608090920201908101915061274b565b6001600160a01b03160361029b57604051635c1523a360e11b815260040160405180910390fd5b600101610213565b50600101610209565b505f5b8181101561050a575f5b81811015610347578383828181106102d3576102d361290d565b90506020020160208101906102e8919061274b565b6001600160a01b03168484848181106103035761030361290d565b9050602002016020810190610318919061274b565b6001600160a01b03160361033f57604051637542915f60e11b815260040160405180910390fd5b6001016102b9565b505f5b84811015610501578585828181106103645761036461290d565b61037a926020608090920201908101915061274b565b6001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d99190612921565b6001600160a01b03168484848181106103f4576103f461290d565b9050602002016020810190610409919061274b565b6001600160a01b031614806104db575085858281811061042b5761042b61290d565b610441926020608090920201908101915061274b565b6001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa15801561047c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a09190612921565b6001600160a01b03168484848181106104bb576104bb61290d565b90506020020160208101906104d0919061274b565b6001600160a01b0316145b156104f957604051637542915f60e11b815260040160405180910390fd5b60010161034a565b506001016102af565b50838360405160200161051e92919061294a565b60408051808303601f1901815282825280516020918201206001600160a01b0389165f90815260018352929092209190915561055e9184918491016129e4565b60408051808303601f1901815291815281516020928301206001600160a01b03979097165f90815260019283905220019490945550505050565b6105a06118a7565b6001600160a01b03165f908152600260205260409020805460ff19166001179055565b5f8080806105d385870187612cd2565b506001600160a01b038b165f90815260016020526040812093965091945092500154826040516020016106069190612e29565b604051602081830303815290604052805190602001201461063a576040516395241ae360e01b815260040160405180910390fd5b5f825160026106499190612eb8565b6001600160401b0381111561066057610660612a26565b604051908082528060200260200182016040528015610689578160200160208202803683370190505b509050885f5b8451811015611537575f5f5f8784815181106106ad576106ad61290d565b60200260200101515f01516001600160a01b03166305ecd0036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107179190612ecf565b905087848151811061072b5761072b61290d565b60200260200101516060015160020b61076d828b87815181106107505761075061290d565b60200260200101515f01516107659190612eea565b60020b611922565b131561078c57604051631510fe5b60e31b815260040160405180910390fd5b60605f5f8a87815181106107a2576107a261290d565b60200260200101515f01516001600160a01b031663011492288960018d8b815181106107d0576107d061290d565b60200260200101516040518463ffffffff1660e01b81526004016107f693929190612f0f565b5f60405180830381865afa158015610810573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108379190810190612fca565b50909550919350915061085890506001600160801b038083169084166130c2565b95506108648160801c90565b6001600160801b03166108778360801c90565b6001600160801b031661088a91906130c2565b945050505f8986815181106108a1576108a161290d565b60200260200101515f01516001600160a01b03166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090b9190612ecf565b90505f805b8a88815181106109225761092261290d565b602002602001015151811015610aa8575f8482815181106109455761094561290d565b60200260200101519050806001600160801b03165f0361097857604051632276762d60e11b815260040160405180910390fd5b5f8c8a8151811061098b5761098b61290d565b602002602001015183815181106109a4576109a461290d565b602002602001015190505f6109b882611940565b90505f5b81811015610a24576109ce838261197a565b60020b15610a1c575f5f6109ec896109e787868a611991565b6119fa565b90925090506109fb8584611a79565b5f03610a0e579b81019b9a8b019a610a19565b818d039c50808c039b505b50505b6001016109bc565b505f5f610a3384866001611a8b565b91509150610a3e8190565b600f0b82600f0b610a4f91906130c2565b610a59908d6130e8565b9b50610a658160801d90565b600f0b610a728360801d90565b600f0b610a7f91906130c2565b610a89908c6130e8565b9a50610a95838861310f565b9650506001909401935061091092505050565b508a8781518110610abb57610abb61290d565b60209081029190910101515160405163c79ee60d60e01b81526001600160a01b038a811660048301529091169063c79ee60d90602401602060405180830381865afa158015610b0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b309190613122565b8114610b4f57604051632276762d60e11b815260040160405180910390fd5b5050505f6001600160a01b0316888581518110610b6e57610b6e61290d565b6020026020010151602001516001600160a01b031603610bca5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee888581518110610baf57610baf61290d565b6020908102919091018101516001600160a01b039092169101525b5f808080805b8a51811015610d86578c8981518110610beb57610beb61290d565b6020026020010151602001516001600160a01b03168b8281518110610c1257610c1261290d565b60200260200101516001600160a01b031603610c2d57600192505b8c8981518110610c3f57610c3f61290d565b6020026020010151604001516001600160a01b03168b8281518110610c6657610c6661290d565b60200260200101516001600160a01b031603610c8157600191505b5f6001600160a01b03168b8281518110610c9d57610c9d61290d565b60200260200101516001600160a01b031603610d7e5782610d09578c8981518110610cca57610cca61290d565b6020026020010151602001518b8281518110610ce857610ce861290d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b81610d79578c8981518110610d2057610d2061290d565b6020026020010151604001518b84610d39576001610d3b565b5f5b610d489060ff168461310f565b81518110610d5857610d5861290d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b610d86565b600101610bd0565b5081610e735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168c8981518110610dbc57610dbc61290d565b6020026020010151602001516001600160a01b031614610e64578b8881518110610de857610de861290d565b60209081029190910181015101516040516370a0823160e01b81526001600160a01b038b81166004830152909116906370a0823190602401602060405180830381865afa158015610e3b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5f9190613122565b610e70565b886001600160a01b0316315b93505b80610f12578b8881518110610e8a57610e8a61290d565b6020026020010151604001516001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401610ed091906001600160a01b0391909116815260200190565b602060405180830381865afa158015610eeb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0f9190613122565b92505b5f8c8981518110610f2557610f2561290d565b60200260200101515f01516001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8f9190612921565b6040516370a0823160e01b81526001600160a01b038c8116600483015291909116906370a0823190602401602060405180830381865afa158015610fd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff99190613122565b90508c898151811061100d5761100d61290d565b60200260200101515f01516001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611053573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110779190612921565b6001600160a01b0316634cdad506826040518263ffffffff1660e01b81526004016110a491815260200190565b602060405180830381865afa1580156110bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e39190613122565b6110ed90896130e8565b97508c89815181106111015761110161290d565b60200260200101515f01516001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa158015611147573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116b9190612921565b6040516370a0823160e01b81526001600160a01b038c8116600483015291909116906370a0823190602401602060405180830381865afa1580156111b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d59190613122565b90508c89815181106111e9576111e961290d565b60200260200101515f01516001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112539190612921565b6001600160a01b0316634cdad506826040518263ffffffff1660e01b815260040161128091815260200190565b602060405180830381865afa15801561129b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bf9190613122565b6112c990886130e8565b96505050508e6001600160a01b03168a87815181106112ea576112ea61290d565b6020026020010151602001516001600160a01b0316146114245773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168a87815181106113345761133461290d565b6020026020010151602001516001600160a01b031614801561138757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168f6001600160a01b0316145b6114245789868151811061139d5761139d61290d565b60200260200101516060015160020b6113d88c88815181106113c1576113c161290d565b602002602001015160200151856107659190612eea565b13156113f757604051631510fe5b60e31b815260040160405180910390fd5b5f61140184611ae4565b905061140d8682611dff565b955082156114225761141f8382611dff565b92505b505b8e6001600160a01b03168a87815181106114405761144061290d565b6020026020010151604001516001600160a01b0316146114f35789868151811061146c5761146c61290d565b60200260200101516060015160020b6114a78c88815181106114905761149061290d565b602002602001015160400151856107659190612eea565b13156114c657604051631510fe5b60e31b815260040160405180910390fd5b5f6114d084611ae4565b90506114dc8582611e82565b945081156114f1576114ee8282611e82565b91505b505b61150661150085876130e8565b5f611eef565b611510828461310f565b61151a919061310f565b611524908d61310f565b9b50506001909401935061068f92505050565b505f611545888a018a612cd2565b6001600160a01b0386165f908152600160208190526040909120919550909350915061156e9050565b0154816040516020016115819190613139565b60405160208183030381529060405280519060200120146115b557604051637560978b60e11b815260040160405180910390fd5b5f5b815181101561178e578a6001600160a01b03168282815181106115dc576115dc61290d565b60200260200101516001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116439190612921565b6001600160a01b03161461166a57604051635de194d760e01b815260040160405180910390fd5b5f82828151811061167d5761167d61290d565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156116cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f19190613122565b90508282815181106117055761170561290d565b60200260200101516001600160a01b0316634cdad506826040518263ffffffff1660e01b815260040161173a91815260200190565b602060405180830381865afa158015611755573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117799190613122565b611783908a61310f565b9850506001016115b7565b505f9050805b83518110156117dc578a6001600160a01b03168482815181106117b9576117b961290d565b60200260200101516001600160a01b0316036117d457600191505b600101611794565b5080611857576040516370a0823160e01b81526001600160a01b0383811660048301528b16906370a0823190602401602060405180830381865afa158015611826573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190613122565b611854908861310f565b96505b505050505050949350505050565b61186d6118a7565b6001600160a01b03811661189b57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6118a4816118d3565b50565b5f546001600160a01b031633146101c45760405163118cdaa760e01b8152336004820152602401611892565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f82136119385761193382613179565b61193a565b815b92915050565b5f72fe0000000000fe0000000000fe0000000000fe604083901c165b6001603083021b81106119745781600101915061195c565b50919050565b5f6110006064603084020184901c5b069392505050565b5f808061199e8686611f04565b90925090505f6119ae8787611f3b565b6119c1906001600160801b038716612eb8565b90506119cd8787611f4d565b5f036119e8576119de838383611f5f565b93505050506119f3565b6119de838383612008565b9392505050565b5f5f611a068360e81c90565b60020b8460020b1215611a2357611a1c8361203c565b9150611a72565b611a2d8360d01c90565b60020b8460020b12611a4957611a42836120ae565b9050611a72565b611a5b611a5684866120f5565b61203c565b9150611a6f611a6a8486612115565b6120ae565b90505b9250929050565b5f60026048603084020184901c611989565b5f5f5f611a9786611940565b90505f5b818114611ada575f5f611ab08989858a612133565b9092509050611abf86836121d9565b9550611acb85826121d9565b94508260010192505050611a9b565b5050935093915050565b5f5f5f8360020b12611af9578260020b611b00565b8260020b5f035b9050620d89e8811115611b26576040516333a3bdff60e21b815260040160405180910390fd5b5f816001165f03611b3b57600160801b611b4d565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611b81576ffff97272373d413259a46990580e213a0260801c5b6004821615611ba0576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611bbf576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611bde576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611bfd576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611c1c576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611c3b576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611c5b576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611c7b576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611c9b576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611cbb576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611cdb576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611cfb576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611d1b576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611d3b576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611d5c576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611d7c576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611d9b576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611db8576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611dd757805f1981611dd357611dd3613193565b0490505b640100000000810615611deb576001611ded565b5f5b60ff16602082901c0192505050919050565b5f6001600160801b036001600160a01b0383161015611e5a575f611e3f611e3a611e288661225f565b6002866001600160a01b03160a61226f565b6122cd565b90505f8412611e4e5780611e52565b805f035b91505061193a565b5f611e3f611e3a611e6a8661225f565b611e7d6001600160a01b038716806122f6565b612354565b5f6001600160801b036001600160a01b0383161015611ec2575f611e3f611e3a611eab8661225f565b600160c01b6002876001600160a01b03160a6123b2565b5f611e3f611e3a611ed28661225f565b600160801b611eea6001600160a01b038816806122f6565b6123b2565b5f818313611efd57816119f3565b5090919050565b5f80611f30611f188585603002604c011c90565b611f22868661197a565b603087901c61ffff1661245c565b909590945092505050565b5f60806041603084020184901c611989565b5f60026040603084020184901c611989565b5f5f611f6a85611ae4565b90505f611f7685611ae4565b90505f611faa85611f99846001600160a01b0316866001600160a01b031661247a565b8585036001600160a01b03166123b2565b90506001600160801b03811115611fd45760405163528073f560e11b815260040160405180910390fd5b6001600160801b03811660d087901b62ffffff60d01b1660e889901b6001600160e81b03191601015b979650505050505050565b5f5f61201385611ae4565b90505f61201f85611ae4565b90505f611faa85600160601b8585036001600160a01b03166123b2565b5f5f61205061204b8460e81c90565b611ae4565b90505f61206061204b8560d01c90565b90506001600160a01b0382166120986060866001600160801b0316901b8484036001600160a01b0316846001600160a01b03166123b2565b816120a5576120a5613193565b04949350505050565b5f5f6120bd61204b8460e81c90565b90505f6120cd61204b8560d01c90565b90506120ed846001600160801b03168383036001600160a01b031661247a565b949350505050565b5f6119f36001600160e81b0384168360e81b6001600160e81b0319160190565b5f6119f362ffffff60d01b1984168360d01b62ffffff60d01b160190565b5f5f5f612142878787876124d8565b90505f61214f8887611a79565b15905061215c88876125ab565b5f0361219f57801561218c57612185612179836125bd565b6125bd565b6001600160801b031690565b92506121ce565b612198612179836125bd565b93506121ce565b80156121bb576121856121b56121748460801c90565b60801b90565b6121cb6121b56121748460801c90565b93505b505094509492505050565b5f5f6121e58360801d90565b600f0b6121f28560801d90565b600f0b019050805f84600f0b86600f0b0190505f8190508383600f0b14158061221e57508181600f0b14155b1561223c57604051633486405d60e21b815260040160405180910390fd5b608083901b6001600160801b03828701166001600160801b031987160101611ffd565b5f5f821361193857815f0361193a565b5f80805f19848609848602925082811083820303915050805f03612298575060c01c905061193a565b80600160c01b116122a7575f5ffd5b5f600160c01b85870980840360c01c9310909103600160401b0291909117949350505050565b5f6001600160ff1b038211156119385760405163b668004560e01b815260040160405180910390fd5b5f80805f19848609848602925082811083820303915050805f0361231f575060401c905061193a565b80600160401b1161232e575f5ffd5b5f600160401b85870980840360401c9310909103600160c01b0291909117949350505050565b5f80805f19848609848602925082811083820303915050805f0361237d575060801c905061193a565b80600160801b1161238c575f5ffd5b5f600160801b85870980840360801c9310909103600160801b0291909117949350505050565b5f80805f19858709858702925082811083820303915050805f036123e6575f84116123db575f5ffd5b5082900490506119f3565b8084116123f1575f5ffd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f5f5f5f61246a86866125e8565b9088039897019695505050505050565b5f80805f19848609848602925082811083820303915050805f036124a3575060601c905061193a565b80600160601b116124b2575f5ffd5b5f600160601b85870980840360601c9310909103600160a01b0291909117949350505050565b5f8080806124e6888761197a565b60020b1515905080612501576002606460308802011b880197505b5f61250d89888a611991565b90506125198988611a79565b1580156125235750855b8061253f57506125338988611a79565b1580159061253f575085155b80612548575081155b15612568576125568161262a565b93506125618161268b565b925061257f565b6125718161203c565b935061257c816120ae565b92505b61259e6001600160801b0385168460801b6001600160801b0319160190565b9998505050505050505050565b5f60026049603084020184901c611989565b805f600f82900b12156125e35760405163b668004560e01b815260040160405180910390fd5b919050565b5f8060026125f684866131a7565b61260091906131c6565b61261f61260d858761320a565b62ffffff166002808204910615150190565b915091509250929050565b5f5f61263961204b8460e81c90565b90505f61264961204b8560d01c90565b90506120ed61267a6060866001600160801b0316901b8484036001600160a01b0316846001600160a01b03166126ca565b6001846001600160a01b03166126ca565b5f5f61269a61204b8460e81c90565b90505f6126aa61204b8560d01c90565b90506120ed846001600160801b03168383036001600160a01b0316612706565b5f6126d68484846123b2565b90505f82806126e7576126e7613193565b84860911156119f3575f1981106126fc575f5ffd5b6001019392505050565b5f612711838361247a565b90505f600160601b838509111561193a575f19811061272e575f5ffd5b60010192915050565b6001600160a01b03811681146118a4575f5ffd5b5f6020828403121561275b575f5ffd5b81356119f381612737565b5f5f60408385031215612777575f5ffd5b823561278281612737565b946020939093013593505050565b5f5f83601f8401126127a0575f5ffd5b5081356001600160401b038111156127b6575f5ffd5b6020830191508360208260051b8501011115611a72575f5ffd5b5f5f5f5f5f606086880312156127e4575f5ffd5b85356127ef81612737565b945060208601356001600160401b03811115612809575f5ffd5b8601601f81018813612819575f5ffd5b80356001600160401b0381111561282e575f5ffd5b8860208260071b8401011115612842575f5ffd5b6020919091019450925060408601356001600160401b03811115612864575f5ffd5b61287088828901612790565b969995985093965092949392505050565b5f5f5f5f60608587031215612894575f5ffd5b843561289f81612737565b935060208501356128af81612737565b925060408501356001600160401b038111156128c9575f5ffd5b8501601f810187136128d9575f5ffd5b80356001600160401b038111156128ee575f5ffd5b8760208284010111156128ff575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612931575f5ffd5b81516119f381612737565b8060020b81146118a4575f5ffd5b602080825281018290525f8360408301825b858110156129da57823561296f81612737565b6001600160a01b03168252602083013561298881612737565b6001600160a01b0316602083015260408301356129a481612737565b6001600160a01b0316604083015260608301356129c08161293c565b60020b60608301526080928301929091019060010161295c565b5095945050505050565b602080825281018290525f8360408301825b858110156129da578235612a0981612737565b6001600160a01b03168252602092830192909101906001016129f6565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612a5c57612a5c612a26565b60405290565b604051606081016001600160401b0381118282101715612a5c57612a5c612a26565b604051601f8201601f191681016001600160401b0381118282101715612aac57612aac612a26565b604052919050565b5f6001600160401b03821115612acc57612acc612a26565b5060051b60200190565b5f82601f830112612ae5575f5ffd5b8135612af8612af382612ab4565b612a84565b8082825260208201915060208360071b860101925085831115612b19575f5ffd5b602085015b838110156129da5760808188031215612b35575f5ffd5b612b3d612a3a565b8135612b4881612737565b81526020820135612b5881612737565b60208201526040820135612b6b81612737565b60408201526060820135612b7e8161293c565b60608201528352602090920191608001612b1e565b5f82601f830112612ba2575f5ffd5b8135612bb0612af382612ab4565b8082825260208201915060208360051b860101925085831115612bd1575f5ffd5b602085015b838110156129da5780356001600160401b03811115612bf3575f5ffd5b8601603f81018813612c03575f5ffd5b6020810135612c14612af382612ab4565b808282526020820191506020808460051b8601010192508a831115612c37575f5ffd5b6040840193505b82841015612c59578335825260209384019390910190612c3e565b86525050602093840193919091019050612bd6565b5f82601f830112612c7d575f5ffd5b8135612c8b612af382612ab4565b8082825260208201915060208360051b860101925085831115612cac575f5ffd5b602085015b838110156129da578035612cc481612737565b835260209283019201612cb1565b5f5f5f5f60808587031215612ce5575f5ffd5b84356001600160401b03811115612cfa575f5ffd5b8501601f81018713612d0a575f5ffd5b8035612d18612af382612ab4565b80828252602082019150602060608402850101925089831115612d39575f5ffd5b6020840193505b82841015612da6576060848b031215612d57575f5ffd5b612d5f612a62565b8435612d6a8161293c565b81526020850135612d7a8161293c565b60208201526040850135612d8d8161293c565b6040820152825260609390930192602090910190612d40565b965050505060208501356001600160401b03811115612dc3575f5ffd5b612dcf87828801612ad6565b93505060408501356001600160401b03811115612dea575f5ffd5b612df687828801612b93565b92505060608501356001600160401b03811115612e11575f5ffd5b612e1d87828801612c6e565b91505092959194509250565b602080825282518282018190525f918401906040840190835b81811015612e9957835180516001600160a01b0390811685526020808301518216818701526040808401519092169186019190915260609182015160020b9185019190915290930192608090920191600101612e42565b509095945050505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761193a5761193a612ea4565b5f60208284031215612edf575f5ffd5b81516119f38161293c565b600282810b9082900b03627fffff198112627fffff8213171561193a5761193a612ea4565b6001600160a01b038416815282151560208083019190915260606040830181905283519083018190525f918401906080840190835b81811015612f62578351835260209384019390920191600101612f44565b5090979650505050505050565b5f82601f830112612f7e575f5ffd5b8151612f8c612af382612ab4565b8082825260208201915060208360051b860101925085831115612fad575f5ffd5b602085015b838110156129da578051835260209283019201612fb2565b5f5f5f5f5f60a08688031215612fde575f5ffd5b85516020870151604088015191965094506001600160401b03811115613002575f5ffd5b8601601f81018813613012575f5ffd5b8051613020612af382612ab4565b8082825260208201915060208360051b85010192508a831115613041575f5ffd5b6020840193505b82841015613063578351825260209384019390910190613048565b8096505050505060608601516001600160401b03811115613082575f5ffd5b61308e88828901612f6f565b92505060808601516001600160401b038111156130a9575f5ffd5b6130b588828901612f6f565b9150509295509295909350565b8181035f8312801583831316838312821617156130e1576130e1612ea4565b5092915050565b8082018281125f83128015821682158216171561310757613107612ea4565b505092915050565b8082018082111561193a5761193a612ea4565b5f60208284031215613132575f5ffd5b5051919050565b602080825282518282018190525f918401906040840190835b81811015612e995783516001600160a01b0316835260209384019390920191600101613152565b5f600160ff1b820161318d5761318d612ea4565b505f0390565b634e487b7160e01b5f52601260045260245ffd5b5f8260020b8260020b028060020b91508082146130e1576130e1612ea4565b5f8160020b8360020b806131e857634e487b7160e01b5f52601260045260245ffd5b627fffff1982145f198214161561320157613201612ea4565b90059392505050565b62ffffff81811683821602908116908181146130e1576130e1612ea456";
19321
- const BASE_ACCOUNTANT_ADDRESS = "0x345cA3407942f9d175c9eA8B90e83A36F570f852";
19322
- const MAINNET_ACCOUNTANT_ADDRESS = "0x65aA902AE3135658587FFC36ED51B61c927114e1";
19323
- const LEGACY_MAINNET_ACCOUNTANT_ADDRESS = "0xCCAA8adC2776786Fd0A14Fb1f22D6089E0637a49";
19324
- const SEPOLIA_ACCOUNTANT_ADDRESS = "0x25BBef1DF262c24aa1AACD1F7eCeEcc1a7AD08ab";
19325
- const TEST_ACCOUNTANT_ADDRESS = "0x3fE074e8131bE6D8B94700860E1D9E8ece97AA54";
19326
- const BASE_WETH_ADDRESS = "0x4200000000000000000000000000000000000006";
19327
- const MAINNET_WETH_ADDRESS = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
19328
- const SEPOLIA_WETH_ADDRESS = "0xfff9976782d46cc05630d1f6ebab18b2324d6b14";
19329
- const WETH_IMMUTABLE_OFFSETS = [241, 4947];
19330
- function normalizeAddressLower(address) {
19331
- return address.toLowerCase();
19720
+ //#region src/hypoVault/sharePrice/errors.ts
19721
+ var VaultApyPreInceptionBlockError = class extends Error {
19722
+ blockNumber;
19723
+ minBlockNumber;
19724
+ constructor({ blockNumber, minBlockNumber, context }) {
19725
+ super(`[vault-apy][pre-inception] ${context}: block ${blockNumber.toString()} < minBlock ${minBlockNumber.toString()}`);
19726
+ this.name = "VaultApyPreInceptionBlockError";
19727
+ this.blockNumber = blockNumber;
19728
+ this.minBlockNumber = minBlockNumber;
19729
+ }
19730
+ };
19731
+ function getVaultApyErrorMessage(error) {
19732
+ if (error instanceof Error) return error.message;
19733
+ if (typeof error === "string") return error;
19734
+ return "unknown error";
19332
19735
  }
19333
- function leftPadAddressToWord(address) {
19334
- return `${"0".repeat(24)}${normalizeAddressLower(address).slice(2)}`;
19736
+ function isExpectedHistoricalReadMiss(error) {
19737
+ const message = getVaultApyErrorMessage(error);
19738
+ return error instanceof VaultApyPreInceptionBlockError || message.includes("returned no data (\"0x\")") || message.includes("InvalidPools()") || message.includes("[computeNAV]") || message.includes("The contract function \"computeNAV\" reverted");
19335
19739
  }
19336
- function hydrateWethImmutables({ bytecode, wethAddress }) {
19337
- const bytes = bytecode.slice(2).toLowerCase();
19338
- const word = leftPadAddressToWord(wethAddress);
19339
- let hydrated = bytes;
19340
- for (const offset of WETH_IMMUTABLE_OFFSETS) {
19341
- const start = offset * 2;
19342
- const end = start + 64;
19343
- if (end > hydrated.length) continue;
19344
- hydrated = `${hydrated.slice(0, start)}${word}${hydrated.slice(end)}`;
19345
- }
19346
- return `0x${hydrated}`;
19347
- }
19348
- const STALE_ORACLE_OVERRIDE_BYTECODE_BY_ACCOUNTANT = {
19349
- [normalizeAddressLower(BASE_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
19350
- bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
19351
- wethAddress: BASE_WETH_ADDRESS
19352
- }),
19353
- [normalizeAddressLower(MAINNET_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
19354
- bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
19355
- wethAddress: MAINNET_WETH_ADDRESS
19356
- }),
19357
- [normalizeAddressLower(LEGACY_MAINNET_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
19358
- bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
19359
- wethAddress: MAINNET_WETH_ADDRESS
19360
- }),
19361
- [normalizeAddressLower(SEPOLIA_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
19362
- bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
19363
- wethAddress: SEPOLIA_WETH_ADDRESS
19364
- }),
19365
- [normalizeAddressLower(TEST_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
19366
- bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
19367
- wethAddress: SEPOLIA_WETH_ADDRESS
19368
- })
19369
- };
19370
- function getStaleOracleOverrideBytecodeForAccountant(accountantAddress) {
19371
- return STALE_ORACLE_OVERRIDE_BYTECODE_BY_ACCOUNTANT[normalizeAddressLower(accountantAddress)];
19372
- }
19373
- function getStaleOracleStateOverrideForAccountant(accountantAddress) {
19374
- const bytecode = getStaleOracleOverrideBytecodeForAccountant(accountantAddress);
19375
- if (bytecode === void 0) return void 0;
19376
- return [{
19377
- address: accountantAddress,
19378
- code: bytecode
19379
- }];
19380
- }
19381
-
19382
- //#endregion
19383
- //#region src/hypoVault/utils/merkleTreeHelper.ts
19384
- /**
19385
- * Efficiently hashes two bytes32 values together
19386
- * Equivalent to Solidity's keccak256(abi.encodePacked(a, b))
19387
- */
19388
- function efficientHash(a, b) {
19389
- return keccak256(encodePacked(["bytes32", "bytes32"], [a, b]));
19390
- }
19391
- /**
19392
- * Hashes a pair of bytes32 values in sorted order (mimics OpenZeppelin's approach)
19393
- * This ensures that hashPair(a, b) === hashPair(b, a)
19394
- */
19395
- function hashPair(a, b) {
19396
- return a < b ? efficientHash(a, b) : efficientHash(b, a);
19397
- }
19398
- /**
19399
- * Generates a Merkle proof for a given leaf within a Merkle tree
19400
- * @param leaf The leaf hash to generate a proof for
19401
- * @param tree The complete Merkle tree (array of layers, where tree[0] is the bottom layer)
19402
- * @returns Array of sibling hashes that form the proof
19403
- * @throws Error if the leaf is not found in the tree
19404
- */
19405
- function generateProof(leaf, tree) {
19406
- const treeLength = tree.length;
19407
- const proof = new Array(treeLength - 1);
19408
- let currentLeaf = leaf;
19409
- for (let i = 0; i < treeLength - 1; i++) {
19410
- const layer = tree[i];
19411
- let found = false;
19412
- for (let j = 0; j < layer.length; j++) if (currentLeaf === layer[j]) {
19413
- proof[i] = j % 2 === 0 ? layer[j + 1] : layer[j - 1];
19414
- currentLeaf = hashPair(currentLeaf, proof[i]);
19415
- found = true;
19416
- break;
19417
- }
19418
- if (!found) throw new Error("Leaf not found in tree");
19419
- }
19420
- return proof;
19421
- }
19422
- /**
19423
- * Generates Merkle proofs for multiple manage leaves using a pre-built Merkle tree
19424
- * @param manageLeafs Array of manage leaves to generate proofs for
19425
- * @param tree The complete Merkle tree structure
19426
- * @param rawDataDecoderAddress Address of the raw data decoder and sanitizer contract
19427
- * @returns Array of proofs, one for each manage leaf
19428
- */
19429
- function getProofsUsingTree(manageLeafs, tree, rawDataDecoderAddress) {
19430
- const proofs = [];
19431
- for (let i = 0; i < manageLeafs.length; i++) {
19432
- const manageLeaf = manageLeafs[i];
19433
- const selectorHash = keccak256(encodePacked(["string"], [manageLeaf.signature]));
19434
- const selector = selectorHash.slice(0, 10);
19435
- let rawDigest = encodePacked([
19436
- "address",
19437
- "address",
19438
- "bool",
19439
- "bytes4"
19440
- ], [
19441
- rawDataDecoderAddress,
19442
- manageLeaf.target,
19443
- manageLeaf.canSendValue,
19444
- selector
19445
- ]);
19446
- for (const argAddress of manageLeaf.argumentAddresses) rawDigest = encodePacked(["bytes", "address"], [rawDigest, argAddress]);
19447
- const leaf = keccak256(rawDigest);
19448
- proofs.push(generateProof(leaf, tree));
19449
- }
19450
- return proofs;
19451
- }
19452
- /**
19453
- * Generates Merkle proofs using pre-computed leaf digests
19454
- * @param leafDigests Array of pre-computed leaf digest hashes
19455
- * @param tree The complete Merkle tree structure (tree[0] is the leaf layer)
19456
- * @returns Array of proofs, one for each leaf digest
19457
- */
19458
- function getProofsFromDigests(leafDigests, tree) {
19459
- const proofs = [];
19460
- for (const leafDigest of leafDigests) proofs.push(generateProof(leafDigest, tree));
19461
- return proofs;
19462
- }
19463
- /**
19464
- * Converts a Merkle tree from JSON format to the expected format for proof generation
19465
- * JSON format stores layers as: { "0": [root], "1": [...], "N": [leaves] }
19466
- * Expected format: [[leaves], [...], [root]]
19467
- * @param jsonTree The tree structure from JSON (keyed by layer index)
19468
- * @returns Array of layers with leaves at index 0 and root at the end
19469
- */
19470
- function convertJsonTreeToArray(jsonTree) {
19471
- const layerIndices = Object.keys(jsonTree).map(Number).sort((a, b) => a - b);
19472
- const reversedIndices = [...layerIndices].reverse();
19473
- return reversedIndices.map((index) => [...jsonTree[index.toString()]]);
19474
- }
19475
-
19476
- //#endregion
19477
- //#region src/hypoVault/utils/buildManageArgs.ts
19478
- /**
19479
- * Finds a leaf by its description with full type safety and autocomplete.
19480
- * Throws if the leaf is not found.
19481
- *
19482
- * @param artifact - The strategist leaves artifact (e.g., SepoliaWETHPLPStrategistLeaves)
19483
- * @param description - The description of the leaf to find (autocomplete enabled)
19484
- * @returns The matching leaf
19485
- * @throws Error if no leaf matches the description
19486
- *
19487
- * @example
19488
- * ```ts
19489
- * // Autocomplete shows all valid descriptions for this artifact
19490
- * const approveLeaf = findLeaf(SepoliaWETHPLPStrategistLeaves, 'Approve poWETH to spend WETH')
19491
- * const depositLeaf = findLeaf(SepoliaUSDCPLPStrategistLeaves, 'Deposit USDC for poUSDC')
19492
- * ```
19493
- */
19494
- function findLeaf(artifact, description) {
19495
- const leaf = artifact.leafs.find((l) => l.Description === description);
19496
- if (!leaf) throw new Error(`Leaf not found: "${description}"`);
19497
- return leaf;
19498
- }
19499
- /**
19500
- * Transforms an array of ManageActions into the argument tuple required by
19501
- * manageVaultWithMerkleVerification.
19502
- *
19503
- * @param actions - Array of manage actions to execute
19504
- * @param artifact - The strategist leaves artifact (e.g., SepoliaWETHPLPStrategistLeaves)
19505
- * @returns Tuple of [proofs, decodersAndSanitizers, targets, targetData, values]
19506
- *
19507
- * @example
19508
- * ```ts
19509
- * const actions: ManageAction[] = [
19510
- * {
19511
- * leaf: findLeaf(SepoliaWETHPLPStrategistLeaves, 'Approve poWETH to spend WETH'),
19512
- * data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [spender, amount] }),
19513
- * },
19514
- * {
19515
- * leaf: findLeaf(SepoliaWETHPLPStrategistLeaves, 'Deposit WETH for poWETH'),
19516
- * data: encodeFunctionData({ abi: CollateralTrackerAbi, functionName: 'deposit', args: [assets, receiver] }),
19517
- * },
19518
- * ]
19519
- *
19520
- * const [proofs, decodersAndSanitizers, targets, targetData, values] = buildManageArgs(
19521
- * actions,
19522
- * SepoliaWETHPLPStrategistLeaves
19523
- * )
19524
- * ```
19525
- */
19526
- function buildManageArgs(actions, artifact) {
19527
- const leafDigests = actions.map((a) => a.leaf.LeafDigest);
19528
- const tree = convertJsonTreeToArray(artifact.MerkleTree);
19529
- const proofs = getProofsFromDigests(leafDigests, tree);
19530
- const decodersAndSanitizers = actions.map((a) => a.leaf.DecoderAndSanitizerAddress);
19531
- const targets = actions.map((a) => a.leaf.TargetAddress);
19532
- const targetData = actions.map((a) => a.data);
19533
- const values = actions.map((a) => a.value ?? 0n);
19534
- return [
19535
- proofs,
19536
- decodersAndSanitizers,
19537
- targets,
19538
- targetData,
19539
- values
19540
- ];
19541
- }
19542
-
19543
- //#endregion
19544
- //#region src/panoptic/v1/CollateralTracker/deposit.ts
19545
- function encodeDepositFunctionData({ assets, receiver }) {
19546
- return encodeFunctionData({
19547
- abi: CollateralTrackerAbi,
19548
- functionName: "deposit",
19549
- args: [assets, receiver]
19550
- });
19551
- }
19552
-
19553
- //#endregion
19554
- //#region src/panoptic/v1/CollateralTracker/withdraw.ts
19555
- function encodeWithdrawFunctionData({ assets, receiver, owner }) {
19556
- return encodeFunctionData({
19557
- abi: CollateralTrackerAbi,
19558
- functionName: "withdraw",
19559
- args: [
19560
- assets,
19561
- receiver,
19562
- owner
19563
- ]
19564
- });
19565
- }
19566
-
19567
- //#endregion
19568
- //#region src/token/erc20/approve.ts
19569
- function encodeApproveFunctionData({ spender, amount }) {
19570
- return encodeFunctionData({
19571
- abi: Erc20Abi,
19572
- functionName: "approve",
19573
- args: [spender, amount]
19574
- });
19575
- }
19576
-
19577
- //#endregion
19578
- //#region src/rpc.ts
19579
- const alchemyChains = {
19580
- 1: "eth-mainnet",
19581
- 137: "polygon-mainnet",
19582
- 42161: "arb-mainnet",
19583
- 8453: "base-mainnet",
19584
- 10: "opt-mainnet",
19585
- 130: "unichain-mainnet",
19586
- 11155111: "eth-sepolia"
19587
- };
19588
- function getAlchemyRpcUrl(chainId, alchemyApiKey) {
19589
- if (alchemyChains[chainId]) return `https://${alchemyChains[chainId]}.g.alchemy.com/v2/${alchemyApiKey}`;
19590
- else throw new Error(`Unsupported chainId: ${chainId}`);
19740
+ function isStaleOraclePriceError(error) {
19741
+ const message = getVaultApyErrorMessage(error);
19742
+ return message.includes("StaleOraclePrice()") || message.includes("0xa887f2d8");
19591
19743
  }
19592
- function getAlchemyWsRpcUrl(chainId, alchemyApiKey) {
19593
- if (alchemyChains[chainId]) return `wss://${alchemyChains[chainId]}.g.alchemy.com/v2/${alchemyApiKey}`;
19594
- else throw new Error(`Unsupported chainId: ${chainId}`);
19744
+ function isStaleOraclePriceReadError(error) {
19745
+ return isStaleOraclePriceError(error);
19595
19746
  }
19596
19747
 
19597
19748
  //#endregion
@@ -19999,5 +20150,668 @@ function getHypoVaultGraphQLClient(chainId) {
19999
20150
  }
20000
20151
 
20001
20152
  //#endregion
20002
- export { BASE_CHAIN_ID, BASE_DEPLOYMENT, BASE_ETH_USDC_5BPS_MARKET, BASE_HYPOVAULT_ADDRESSES, BASE_HYPOVAULT_CORE_ADDRESSES, BASE_HYPOVAULT_MANAGER_ADDRESSES, BASE_HYPOVAULT_MANAGER_TURNKEY_SIGNERS, BASE_PANOPTIC_POOL_ADDRESSES, BASE_PANOPTIC_V2_ADDRESSES, BORROW_INDEX_BITS, BPS_SCALE, BaseUSDCPLPStrategistLeaves, BaseUSDCPLPVaultPoolInfos, BaseWETHPLPStrategistLeaves, BaseWETHPLPVaultPoolInfos, CHAIN_DEPLOYMENTS, CollateralTrackerAbi, CollateralTrackerV1_1Abi, Erc1155Abi, Erc20Abi, HypoVaultAbi, HypoVaultManagerConfigSchema, HypoVaultManagerWithMerkleVerificationAbi, MAINNET_CHAIN_ID, MAINNET_DEPLOYMENT, MAINNET_PANOPTIC_V2_ADDRESSES, MARKET_EPOCH_BITS, MARKET_EPOCH_SHIFT, MainnetLegacyUSDCPLPStrategistLeaves, MainnetLegacyWETHPLPStrategistLeaves, MainnetUSDCPLPLegacyVaultPoolInfos, MainnetUSDCPLPStrategistLeaves, MainnetUSDCPLPVaultPoolInfos, MainnetWETHPLPLegacyVaultPoolInfos, MainnetWETHPLPStrategistLeaves, MainnetWETHPLPVaultPoolInfos, Multicall3Abi, NonFungiblePositionManagerAbi, PanopticFactoryV3Abi, PanopticFactoryV4Abi, PanopticHelperAbi, PanopticPoolAbi, PanopticPoolV1_1Abi, PanopticQueryV1_1Abi, PanopticVaultAccountantAbi, PanopticVaultAccountantManagerInputAbi, PoolManagerAbi, RATE_AT_TARGET_BITS, RescueDistributorAbi, SECONDS_PER_YEAR, SEPOLIA_CHAIN_ID, SEPOLIA_DEPLOYMENT, SEPOLIA_ETH_USDC_5BPS_MARKET, SEPOLIA_HYPOVAULT_ADDRESSES, SEPOLIA_HYPOVAULT_CORE_ADDRESSES, SEPOLIA_HYPOVAULT_MANAGER_ADDRESSES, SEPOLIA_HYPOVAULT_MANAGER_TURNKEY_SIGNERS, SEPOLIA_PANOPTIC_POOL_ADDRESSES, SEPOLIA_PANOPTIC_V2_ADDRESSES, SemiFungiblePositionManagerAbi, SemiFungiblePositionManagerV1_1Abi, SepoliaUSDCPLPStrategistLeaves, SepoliaUSDCPLPVaultPoolInfos, SepoliaWETHPLPStrategistLeaves, SepoliaWETHPLPVaultPoolInfos, Simple7702AccountAbi, StateViewAbi, UNREALIZED_INTEREST_BITS, UniswapHelperAbi, UniswapHelperV1_1Abi, UniswapMigratorAbi, UniswapV3FactoryAbi, UniswapV3PoolAbi, UsdcPlpVaultBaseProdConfig, UsdcPlpVaultMainnetLegacyConfig, UsdcPlpVaultMainnetProdConfig, UsdcPlpVaultSepoliaDevConfig, UsdcPlpVaultSepoliaProdConfig, VAULT_DISPLAY_NAMES_PER_CHAIN, VAULT_DISPLAY_NAME_RESOLVERS_PER_CHAIN, WAD, WETHAbi, WethPlpVaultBaseProdConfig, WethPlpVaultMainnetLegacyConfig, WethPlpVaultMainnetProdConfig, WethPlpVaultSepoliaDevConfig, WethPlpVaultSepoliaProdConfig, annualizePerSecondRateWad, buildExecuteDepositCalldatas, buildExecuteWithdrawalCalldatas, buildManageArgs, buildManagerInput, buildManagerInputAtBlock, buildRequestWithdrawalCalldatas, buildVaultManagerInput, buildVaultManagerInputAtBlock, builderFactoryAbi, builderWalletAbi, calculateAssetsFromShares, calculateAvailableShares, calculateClaimableAssetsFromQueuedWithdrawals, calculateClaimableSharesFromQueuedDeposits, calculateSharesFromAssets, cancelDeposit, chainToHypoVaultGraphQlAPI, collateralTrackerV2Abi as collateralTrackerAbi, collateralTrackerV2Abi, convertJsonTreeToArray, deriveSupplyRatePerSecWad, encodeApproveFunctionData, encodeCancelDepositFunctionData, encodeDepositFunctionData, encodeExecuteDepositFunctionData, encodeExecuteWithdrawalFunctionData, encodeExecuteWithdrawalMulticallFunctionData, encodeFulfillDepositsFunctionData, encodeFulfillWithdrawalsFunctionData, encodeRequestDepositFunctionData, encodeRequestWithdrawalFunctionData, encodeRequestWithdrawalMulticallFunctionData, encodeWithdrawFunctionData, executeWithdrawal, executeWithdrawalMulticall, findLeaf, formatPerSecondRateWadAsAprPct, formatPerSecondRateWadAsApyPct, generateProof, getAlchemyRpcUrl, getAlchemyWsRpcUrl, getCancelDepositContractConfig, getChainDeployment, getEthUsdcMarket, getExecuteWithdrawalContractConfig, getExecuteWithdrawalMulticallContractConfig, getHypoVaultConfigForVault, getHypoVaultGraphQLClient, getIrmCurrent, getIrmCurve, getLendingAllocationRows, getMinQueuedDepositEpoch, getProofsFromDigests, getProofsUsingTree, getRequestDepositContractConfig, getRequestWithdrawalContractConfig, getRequestWithdrawalMulticallContractConfig, getStaleOracleOverrideBytecodeForAccountant, getStaleOracleStateOverrideForAccountant, getVaultPoolInfos, isSupportedChain, packMarketState, panopticFactoryV4Abi as panopticFactoryAbi, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticPoolV2Abi as panopticPoolAbi, panopticPoolV2Abi, panopticQueryAbi, parseCustomError, ratePerSecWadToAprPct, requestDeposit, requestWithdrawal, requestWithdrawalMulticall, requireChainDeployment, resolveVaultDisplayName, resolveVaultHistoricalCandidatesByPool, resolveVaultTokenIdsByPool, riskEngineAbi, semiFungiblePositionManagerV4Abi as semiFungiblePositionManagerAbi, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, simulateCancelDeposit, simulateExecuteWithdrawal, simulateExecuteWithdrawalMulticall, simulateRequestDeposit, simulateRequestWithdrawal, simulateRequestWithdrawalMulticall, useCancelDeposit, useExecuteWithdrawal, useRequestDeposit, useRequestWithdrawal, utilizationBpsToWad, utilizationPctToWad, verifyVaultOpenTokenIdsAtBlock };
20153
+ //#region src/hypoVault/sharePrice/firstDeposit.ts
20154
+ function parseTimestampSec(value) {
20155
+ const parsed = Number(value);
20156
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
20157
+ }
20158
+ async function fetchFirstDepositTimestampForVault({ graphClient, vaultAddress }) {
20159
+ const response = await graphClient.request(`
20160
+ query FirstVaultDepositTimestamp($hypoVault: String!) {
20161
+ depositExecuteds(
20162
+ where: {
20163
+ hypoVault: $hypoVault
20164
+ assets_gt: "0"
20165
+ shares_gt: "0"
20166
+ }
20167
+ orderBy: blockTimestamp
20168
+ orderDirection: asc
20169
+ first: 1
20170
+ ) {
20171
+ blockTimestamp
20172
+ hypoVault {
20173
+ id
20174
+ }
20175
+ }
20176
+ depositsFulfilleds(
20177
+ where: {
20178
+ hypoVault: $hypoVault
20179
+ assetsFulfilled_gt: "0"
20180
+ sharesReceived_gt: "0"
20181
+ }
20182
+ orderBy: blockTimestamp
20183
+ orderDirection: asc
20184
+ first: 1
20185
+ ) {
20186
+ blockTimestamp
20187
+ hypoVault {
20188
+ id
20189
+ }
20190
+ }
20191
+ }
20192
+ `, { hypoVault: vaultAddress.toLowerCase() });
20193
+ const timestamps = [...response.depositExecuteds, ...response.depositsFulfilleds].map((event) => parseTimestampSec(event.blockTimestamp)).filter((timestamp) => timestamp !== null);
20194
+ if (timestamps.length === 0) return null;
20195
+ return Math.min(...timestamps);
20196
+ }
20197
+ async function fetchFirstDepositTimestampByVaultId({ chainId, vaultAddresses }) {
20198
+ const endpoint = chainToHypoVaultGraphQlAPI[chainId];
20199
+ if (endpoint === void 0 || vaultAddresses.length === 0) return {};
20200
+ const graphClient = new GraphQLClient(endpoint);
20201
+ const entries = await Promise.all(vaultAddresses.map(async (vaultAddress) => {
20202
+ const vaultAddressLower = vaultAddress.toLowerCase();
20203
+ const timestamp = await fetchFirstDepositTimestampForVault({
20204
+ graphClient,
20205
+ vaultAddress: vaultAddressLower
20206
+ }).catch((error) => {
20207
+ console.warn(`[vault-apy] Failed first deposit timestamp lookup for vault ${vaultAddressLower}`, error);
20208
+ return null;
20209
+ });
20210
+ return [vaultAddressLower, timestamp];
20211
+ }));
20212
+ return Object.fromEntries(entries.filter((entry) => entry[1] !== null));
20213
+ }
20214
+
20215
+ //#endregion
20216
+ //#region src/hypoVault/sharePrice/math.ts
20217
+ function computeSharePriceFromNavSnapshot({ nav, assetsDeposited, reservedWithdrawalAssets, shares }) {
20218
+ if (shares <= 0n) return null;
20219
+ const adjustedAssets = nav + 1n - assetsDeposited - reservedWithdrawalAssets;
20220
+ if (adjustedAssets <= 0n) return null;
20221
+ return new Decimal(adjustedAssets.toString()).div(new Decimal(shares.toString()));
20222
+ }
20223
+ function calculateAnnualizedApyPct({ currentSharePrice, previousSharePrice, days }) {
20224
+ if (days <= 0 || !Number.isFinite(days)) return null;
20225
+ if (currentSharePrice.lte(0) || previousSharePrice.lte(0)) return null;
20226
+ const annualizationExponent = new Decimal(365).div(new Decimal(days));
20227
+ const growthFactor = currentSharePrice.div(previousSharePrice);
20228
+ return Decimal.pow(growthFactor, annualizationExponent).minus(1).times(100).toNumber();
20229
+ }
20230
+
20231
+ //#endregion
20232
+ //#region src/hypoVault/staleOracleOverride.ts
20233
+ const PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE = "0x608060405234801561000f575f5ffd5b5060043610610090575f3560e01c80638da5cb5b116100635780638da5cb5b14610135578063995cac6d14610145578063a519c19814610158578063d597b7361461016b578063f2fde38b1461017e575f5ffd5b8063016ff32e1461009457806328d6ae4a146100cb5780634f0e0ef3146100ec578063715018a61461012b575b5f5ffd5b6100b66100a236600461274b565b60026020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100de6100d9366004612766565b610191565b6040519081526020016100c2565b6101137f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c2565b6101336101b3565b005b5f546001600160a01b0316610113565b6101336101533660046127d0565b6101c6565b61013361016636600461274b565b610598565b6100de610179366004612881565b6105c3565b61013361018c36600461274b565b611865565b6001602052815f5260405f2081600281106101aa575f80fd5b01549150829050565b6101bb6118a7565b6101c45f6118d3565b565b6101ce6118a7565b6001600160a01b0385165f9081526002602052604090205460ff1615610207576040516372b89e9760e11b815260040160405180910390fd5b5f5b838110156102ac575f5b818110156102a35785858281811061022d5761022d61290d565b610243926020608090920201908101915061274b565b6001600160a01b031686868481811061025e5761025e61290d565b610274926020608090920201908101915061274b565b6001600160a01b03160361029b57604051635c1523a360e11b815260040160405180910390fd5b600101610213565b50600101610209565b505f5b8181101561050a575f5b81811015610347578383828181106102d3576102d361290d565b90506020020160208101906102e8919061274b565b6001600160a01b03168484848181106103035761030361290d565b9050602002016020810190610318919061274b565b6001600160a01b03160361033f57604051637542915f60e11b815260040160405180910390fd5b6001016102b9565b505f5b84811015610501578585828181106103645761036461290d565b61037a926020608090920201908101915061274b565b6001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d99190612921565b6001600160a01b03168484848181106103f4576103f461290d565b9050602002016020810190610409919061274b565b6001600160a01b031614806104db575085858281811061042b5761042b61290d565b610441926020608090920201908101915061274b565b6001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa15801561047c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a09190612921565b6001600160a01b03168484848181106104bb576104bb61290d565b90506020020160208101906104d0919061274b565b6001600160a01b0316145b156104f957604051637542915f60e11b815260040160405180910390fd5b60010161034a565b506001016102af565b50838360405160200161051e92919061294a565b60408051808303601f1901815282825280516020918201206001600160a01b0389165f90815260018352929092209190915561055e9184918491016129e4565b60408051808303601f1901815291815281516020928301206001600160a01b03979097165f90815260019283905220019490945550505050565b6105a06118a7565b6001600160a01b03165f908152600260205260409020805460ff19166001179055565b5f8080806105d385870187612cd2565b506001600160a01b038b165f90815260016020526040812093965091945092500154826040516020016106069190612e29565b604051602081830303815290604052805190602001201461063a576040516395241ae360e01b815260040160405180910390fd5b5f825160026106499190612eb8565b6001600160401b0381111561066057610660612a26565b604051908082528060200260200182016040528015610689578160200160208202803683370190505b509050885f5b8451811015611537575f5f5f8784815181106106ad576106ad61290d565b60200260200101515f01516001600160a01b03166305ecd0036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107179190612ecf565b905087848151811061072b5761072b61290d565b60200260200101516060015160020b61076d828b87815181106107505761075061290d565b60200260200101515f01516107659190612eea565b60020b611922565b131561078c57604051631510fe5b60e31b815260040160405180910390fd5b60605f5f8a87815181106107a2576107a261290d565b60200260200101515f01516001600160a01b031663011492288960018d8b815181106107d0576107d061290d565b60200260200101516040518463ffffffff1660e01b81526004016107f693929190612f0f565b5f60405180830381865afa158015610810573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108379190810190612fca565b50909550919350915061085890506001600160801b038083169084166130c2565b95506108648160801c90565b6001600160801b03166108778360801c90565b6001600160801b031661088a91906130c2565b945050505f8986815181106108a1576108a161290d565b60200260200101515f01516001600160a01b03166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090b9190612ecf565b90505f805b8a88815181106109225761092261290d565b602002602001015151811015610aa8575f8482815181106109455761094561290d565b60200260200101519050806001600160801b03165f0361097857604051632276762d60e11b815260040160405180910390fd5b5f8c8a8151811061098b5761098b61290d565b602002602001015183815181106109a4576109a461290d565b602002602001015190505f6109b882611940565b90505f5b81811015610a24576109ce838261197a565b60020b15610a1c575f5f6109ec896109e787868a611991565b6119fa565b90925090506109fb8584611a79565b5f03610a0e579b81019b9a8b019a610a19565b818d039c50808c039b505b50505b6001016109bc565b505f5f610a3384866001611a8b565b91509150610a3e8190565b600f0b82600f0b610a4f91906130c2565b610a59908d6130e8565b9b50610a658160801d90565b600f0b610a728360801d90565b600f0b610a7f91906130c2565b610a89908c6130e8565b9a50610a95838861310f565b9650506001909401935061091092505050565b508a8781518110610abb57610abb61290d565b60209081029190910101515160405163c79ee60d60e01b81526001600160a01b038a811660048301529091169063c79ee60d90602401602060405180830381865afa158015610b0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b309190613122565b8114610b4f57604051632276762d60e11b815260040160405180910390fd5b5050505f6001600160a01b0316888581518110610b6e57610b6e61290d565b6020026020010151602001516001600160a01b031603610bca5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee888581518110610baf57610baf61290d565b6020908102919091018101516001600160a01b039092169101525b5f808080805b8a51811015610d86578c8981518110610beb57610beb61290d565b6020026020010151602001516001600160a01b03168b8281518110610c1257610c1261290d565b60200260200101516001600160a01b031603610c2d57600192505b8c8981518110610c3f57610c3f61290d565b6020026020010151604001516001600160a01b03168b8281518110610c6657610c6661290d565b60200260200101516001600160a01b031603610c8157600191505b5f6001600160a01b03168b8281518110610c9d57610c9d61290d565b60200260200101516001600160a01b031603610d7e5782610d09578c8981518110610cca57610cca61290d565b6020026020010151602001518b8281518110610ce857610ce861290d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b81610d79578c8981518110610d2057610d2061290d565b6020026020010151604001518b84610d39576001610d3b565b5f5b610d489060ff168461310f565b81518110610d5857610d5861290d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b610d86565b600101610bd0565b5081610e735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168c8981518110610dbc57610dbc61290d565b6020026020010151602001516001600160a01b031614610e64578b8881518110610de857610de861290d565b60209081029190910181015101516040516370a0823160e01b81526001600160a01b038b81166004830152909116906370a0823190602401602060405180830381865afa158015610e3b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5f9190613122565b610e70565b886001600160a01b0316315b93505b80610f12578b8881518110610e8a57610e8a61290d565b6020026020010151604001516001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401610ed091906001600160a01b0391909116815260200190565b602060405180830381865afa158015610eeb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0f9190613122565b92505b5f8c8981518110610f2557610f2561290d565b60200260200101515f01516001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8f9190612921565b6040516370a0823160e01b81526001600160a01b038c8116600483015291909116906370a0823190602401602060405180830381865afa158015610fd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff99190613122565b90508c898151811061100d5761100d61290d565b60200260200101515f01516001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611053573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110779190612921565b6001600160a01b0316634cdad506826040518263ffffffff1660e01b81526004016110a491815260200190565b602060405180830381865afa1580156110bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e39190613122565b6110ed90896130e8565b97508c89815181106111015761110161290d565b60200260200101515f01516001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa158015611147573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116b9190612921565b6040516370a0823160e01b81526001600160a01b038c8116600483015291909116906370a0823190602401602060405180830381865afa1580156111b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d59190613122565b90508c89815181106111e9576111e961290d565b60200260200101515f01516001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112539190612921565b6001600160a01b0316634cdad506826040518263ffffffff1660e01b815260040161128091815260200190565b602060405180830381865afa15801561129b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bf9190613122565b6112c990886130e8565b96505050508e6001600160a01b03168a87815181106112ea576112ea61290d565b6020026020010151602001516001600160a01b0316146114245773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168a87815181106113345761133461290d565b6020026020010151602001516001600160a01b031614801561138757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168f6001600160a01b0316145b6114245789868151811061139d5761139d61290d565b60200260200101516060015160020b6113d88c88815181106113c1576113c161290d565b602002602001015160200151856107659190612eea565b13156113f757604051631510fe5b60e31b815260040160405180910390fd5b5f61140184611ae4565b905061140d8682611dff565b955082156114225761141f8382611dff565b92505b505b8e6001600160a01b03168a87815181106114405761144061290d565b6020026020010151604001516001600160a01b0316146114f35789868151811061146c5761146c61290d565b60200260200101516060015160020b6114a78c88815181106114905761149061290d565b602002602001015160400151856107659190612eea565b13156114c657604051631510fe5b60e31b815260040160405180910390fd5b5f6114d084611ae4565b90506114dc8582611e82565b945081156114f1576114ee8282611e82565b91505b505b61150661150085876130e8565b5f611eef565b611510828461310f565b61151a919061310f565b611524908d61310f565b9b50506001909401935061068f92505050565b505f611545888a018a612cd2565b6001600160a01b0386165f908152600160208190526040909120919550909350915061156e9050565b0154816040516020016115819190613139565b60405160208183030381529060405280519060200120146115b557604051637560978b60e11b815260040160405180910390fd5b5f5b815181101561178e578a6001600160a01b03168282815181106115dc576115dc61290d565b60200260200101516001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116439190612921565b6001600160a01b03161461166a57604051635de194d760e01b815260040160405180910390fd5b5f82828151811061167d5761167d61290d565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156116cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f19190613122565b90508282815181106117055761170561290d565b60200260200101516001600160a01b0316634cdad506826040518263ffffffff1660e01b815260040161173a91815260200190565b602060405180830381865afa158015611755573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117799190613122565b611783908a61310f565b9850506001016115b7565b505f9050805b83518110156117dc578a6001600160a01b03168482815181106117b9576117b961290d565b60200260200101516001600160a01b0316036117d457600191505b600101611794565b5080611857576040516370a0823160e01b81526001600160a01b0383811660048301528b16906370a0823190602401602060405180830381865afa158015611826573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190613122565b611854908861310f565b96505b505050505050949350505050565b61186d6118a7565b6001600160a01b03811661189b57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6118a4816118d3565b50565b5f546001600160a01b031633146101c45760405163118cdaa760e01b8152336004820152602401611892565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f82136119385761193382613179565b61193a565b815b92915050565b5f72fe0000000000fe0000000000fe0000000000fe604083901c165b6001603083021b81106119745781600101915061195c565b50919050565b5f6110006064603084020184901c5b069392505050565b5f808061199e8686611f04565b90925090505f6119ae8787611f3b565b6119c1906001600160801b038716612eb8565b90506119cd8787611f4d565b5f036119e8576119de838383611f5f565b93505050506119f3565b6119de838383612008565b9392505050565b5f5f611a068360e81c90565b60020b8460020b1215611a2357611a1c8361203c565b9150611a72565b611a2d8360d01c90565b60020b8460020b12611a4957611a42836120ae565b9050611a72565b611a5b611a5684866120f5565b61203c565b9150611a6f611a6a8486612115565b6120ae565b90505b9250929050565b5f60026048603084020184901c611989565b5f5f5f611a9786611940565b90505f5b818114611ada575f5f611ab08989858a612133565b9092509050611abf86836121d9565b9550611acb85826121d9565b94508260010192505050611a9b565b5050935093915050565b5f5f5f8360020b12611af9578260020b611b00565b8260020b5f035b9050620d89e8811115611b26576040516333a3bdff60e21b815260040160405180910390fd5b5f816001165f03611b3b57600160801b611b4d565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611b81576ffff97272373d413259a46990580e213a0260801c5b6004821615611ba0576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611bbf576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611bde576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611bfd576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611c1c576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611c3b576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611c5b576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611c7b576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611c9b576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611cbb576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611cdb576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611cfb576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611d1b576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611d3b576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611d5c576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611d7c576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611d9b576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611db8576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611dd757805f1981611dd357611dd3613193565b0490505b640100000000810615611deb576001611ded565b5f5b60ff16602082901c0192505050919050565b5f6001600160801b036001600160a01b0383161015611e5a575f611e3f611e3a611e288661225f565b6002866001600160a01b03160a61226f565b6122cd565b90505f8412611e4e5780611e52565b805f035b91505061193a565b5f611e3f611e3a611e6a8661225f565b611e7d6001600160a01b038716806122f6565b612354565b5f6001600160801b036001600160a01b0383161015611ec2575f611e3f611e3a611eab8661225f565b600160c01b6002876001600160a01b03160a6123b2565b5f611e3f611e3a611ed28661225f565b600160801b611eea6001600160a01b038816806122f6565b6123b2565b5f818313611efd57816119f3565b5090919050565b5f80611f30611f188585603002604c011c90565b611f22868661197a565b603087901c61ffff1661245c565b909590945092505050565b5f60806041603084020184901c611989565b5f60026040603084020184901c611989565b5f5f611f6a85611ae4565b90505f611f7685611ae4565b90505f611faa85611f99846001600160a01b0316866001600160a01b031661247a565b8585036001600160a01b03166123b2565b90506001600160801b03811115611fd45760405163528073f560e11b815260040160405180910390fd5b6001600160801b03811660d087901b62ffffff60d01b1660e889901b6001600160e81b03191601015b979650505050505050565b5f5f61201385611ae4565b90505f61201f85611ae4565b90505f611faa85600160601b8585036001600160a01b03166123b2565b5f5f61205061204b8460e81c90565b611ae4565b90505f61206061204b8560d01c90565b90506001600160a01b0382166120986060866001600160801b0316901b8484036001600160a01b0316846001600160a01b03166123b2565b816120a5576120a5613193565b04949350505050565b5f5f6120bd61204b8460e81c90565b90505f6120cd61204b8560d01c90565b90506120ed846001600160801b03168383036001600160a01b031661247a565b949350505050565b5f6119f36001600160e81b0384168360e81b6001600160e81b0319160190565b5f6119f362ffffff60d01b1984168360d01b62ffffff60d01b160190565b5f5f5f612142878787876124d8565b90505f61214f8887611a79565b15905061215c88876125ab565b5f0361219f57801561218c57612185612179836125bd565b6125bd565b6001600160801b031690565b92506121ce565b612198612179836125bd565b93506121ce565b80156121bb576121856121b56121748460801c90565b60801b90565b6121cb6121b56121748460801c90565b93505b505094509492505050565b5f5f6121e58360801d90565b600f0b6121f28560801d90565b600f0b019050805f84600f0b86600f0b0190505f8190508383600f0b14158061221e57508181600f0b14155b1561223c57604051633486405d60e21b815260040160405180910390fd5b608083901b6001600160801b03828701166001600160801b031987160101611ffd565b5f5f821361193857815f0361193a565b5f80805f19848609848602925082811083820303915050805f03612298575060c01c905061193a565b80600160c01b116122a7575f5ffd5b5f600160c01b85870980840360c01c9310909103600160401b0291909117949350505050565b5f6001600160ff1b038211156119385760405163b668004560e01b815260040160405180910390fd5b5f80805f19848609848602925082811083820303915050805f0361231f575060401c905061193a565b80600160401b1161232e575f5ffd5b5f600160401b85870980840360401c9310909103600160c01b0291909117949350505050565b5f80805f19848609848602925082811083820303915050805f0361237d575060801c905061193a565b80600160801b1161238c575f5ffd5b5f600160801b85870980840360801c9310909103600160801b0291909117949350505050565b5f80805f19858709858702925082811083820303915050805f036123e6575f84116123db575f5ffd5b5082900490506119f3565b8084116123f1575f5ffd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f5f5f5f61246a86866125e8565b9088039897019695505050505050565b5f80805f19848609848602925082811083820303915050805f036124a3575060601c905061193a565b80600160601b116124b2575f5ffd5b5f600160601b85870980840360601c9310909103600160a01b0291909117949350505050565b5f8080806124e6888761197a565b60020b1515905080612501576002606460308802011b880197505b5f61250d89888a611991565b90506125198988611a79565b1580156125235750855b8061253f57506125338988611a79565b1580159061253f575085155b80612548575081155b15612568576125568161262a565b93506125618161268b565b925061257f565b6125718161203c565b935061257c816120ae565b92505b61259e6001600160801b0385168460801b6001600160801b0319160190565b9998505050505050505050565b5f60026049603084020184901c611989565b805f600f82900b12156125e35760405163b668004560e01b815260040160405180910390fd5b919050565b5f8060026125f684866131a7565b61260091906131c6565b61261f61260d858761320a565b62ffffff166002808204910615150190565b915091509250929050565b5f5f61263961204b8460e81c90565b90505f61264961204b8560d01c90565b90506120ed61267a6060866001600160801b0316901b8484036001600160a01b0316846001600160a01b03166126ca565b6001846001600160a01b03166126ca565b5f5f61269a61204b8460e81c90565b90505f6126aa61204b8560d01c90565b90506120ed846001600160801b03168383036001600160a01b0316612706565b5f6126d68484846123b2565b90505f82806126e7576126e7613193565b84860911156119f3575f1981106126fc575f5ffd5b6001019392505050565b5f612711838361247a565b90505f600160601b838509111561193a575f19811061272e575f5ffd5b60010192915050565b6001600160a01b03811681146118a4575f5ffd5b5f6020828403121561275b575f5ffd5b81356119f381612737565b5f5f60408385031215612777575f5ffd5b823561278281612737565b946020939093013593505050565b5f5f83601f8401126127a0575f5ffd5b5081356001600160401b038111156127b6575f5ffd5b6020830191508360208260051b8501011115611a72575f5ffd5b5f5f5f5f5f606086880312156127e4575f5ffd5b85356127ef81612737565b945060208601356001600160401b03811115612809575f5ffd5b8601601f81018813612819575f5ffd5b80356001600160401b0381111561282e575f5ffd5b8860208260071b8401011115612842575f5ffd5b6020919091019450925060408601356001600160401b03811115612864575f5ffd5b61287088828901612790565b969995985093965092949392505050565b5f5f5f5f60608587031215612894575f5ffd5b843561289f81612737565b935060208501356128af81612737565b925060408501356001600160401b038111156128c9575f5ffd5b8501601f810187136128d9575f5ffd5b80356001600160401b038111156128ee575f5ffd5b8760208284010111156128ff575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612931575f5ffd5b81516119f381612737565b8060020b81146118a4575f5ffd5b602080825281018290525f8360408301825b858110156129da57823561296f81612737565b6001600160a01b03168252602083013561298881612737565b6001600160a01b0316602083015260408301356129a481612737565b6001600160a01b0316604083015260608301356129c08161293c565b60020b60608301526080928301929091019060010161295c565b5095945050505050565b602080825281018290525f8360408301825b858110156129da578235612a0981612737565b6001600160a01b03168252602092830192909101906001016129f6565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612a5c57612a5c612a26565b60405290565b604051606081016001600160401b0381118282101715612a5c57612a5c612a26565b604051601f8201601f191681016001600160401b0381118282101715612aac57612aac612a26565b604052919050565b5f6001600160401b03821115612acc57612acc612a26565b5060051b60200190565b5f82601f830112612ae5575f5ffd5b8135612af8612af382612ab4565b612a84565b8082825260208201915060208360071b860101925085831115612b19575f5ffd5b602085015b838110156129da5760808188031215612b35575f5ffd5b612b3d612a3a565b8135612b4881612737565b81526020820135612b5881612737565b60208201526040820135612b6b81612737565b60408201526060820135612b7e8161293c565b60608201528352602090920191608001612b1e565b5f82601f830112612ba2575f5ffd5b8135612bb0612af382612ab4565b8082825260208201915060208360051b860101925085831115612bd1575f5ffd5b602085015b838110156129da5780356001600160401b03811115612bf3575f5ffd5b8601603f81018813612c03575f5ffd5b6020810135612c14612af382612ab4565b808282526020820191506020808460051b8601010192508a831115612c37575f5ffd5b6040840193505b82841015612c59578335825260209384019390910190612c3e565b86525050602093840193919091019050612bd6565b5f82601f830112612c7d575f5ffd5b8135612c8b612af382612ab4565b8082825260208201915060208360051b860101925085831115612cac575f5ffd5b602085015b838110156129da578035612cc481612737565b835260209283019201612cb1565b5f5f5f5f60808587031215612ce5575f5ffd5b84356001600160401b03811115612cfa575f5ffd5b8501601f81018713612d0a575f5ffd5b8035612d18612af382612ab4565b80828252602082019150602060608402850101925089831115612d39575f5ffd5b6020840193505b82841015612da6576060848b031215612d57575f5ffd5b612d5f612a62565b8435612d6a8161293c565b81526020850135612d7a8161293c565b60208201526040850135612d8d8161293c565b6040820152825260609390930192602090910190612d40565b965050505060208501356001600160401b03811115612dc3575f5ffd5b612dcf87828801612ad6565b93505060408501356001600160401b03811115612dea575f5ffd5b612df687828801612b93565b92505060608501356001600160401b03811115612e11575f5ffd5b612e1d87828801612c6e565b91505092959194509250565b602080825282518282018190525f918401906040840190835b81811015612e9957835180516001600160a01b0390811685526020808301518216818701526040808401519092169186019190915260609182015160020b9185019190915290930192608090920191600101612e42565b509095945050505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761193a5761193a612ea4565b5f60208284031215612edf575f5ffd5b81516119f38161293c565b600282810b9082900b03627fffff198112627fffff8213171561193a5761193a612ea4565b6001600160a01b038416815282151560208083019190915260606040830181905283519083018190525f918401906080840190835b81811015612f62578351835260209384019390920191600101612f44565b5090979650505050505050565b5f82601f830112612f7e575f5ffd5b8151612f8c612af382612ab4565b8082825260208201915060208360051b860101925085831115612fad575f5ffd5b602085015b838110156129da578051835260209283019201612fb2565b5f5f5f5f5f60a08688031215612fde575f5ffd5b85516020870151604088015191965094506001600160401b03811115613002575f5ffd5b8601601f81018813613012575f5ffd5b8051613020612af382612ab4565b8082825260208201915060208360051b85010192508a831115613041575f5ffd5b6020840193505b82841015613063578351825260209384019390910190613048565b8096505050505060608601516001600160401b03811115613082575f5ffd5b61308e88828901612f6f565b92505060808601516001600160401b038111156130a9575f5ffd5b6130b588828901612f6f565b9150509295509295909350565b8181035f8312801583831316838312821617156130e1576130e1612ea4565b5092915050565b8082018281125f83128015821682158216171561310757613107612ea4565b505092915050565b8082018082111561193a5761193a612ea4565b5f60208284031215613132575f5ffd5b5051919050565b602080825282518282018190525f918401906040840190835b81811015612e995783516001600160a01b0316835260209384019390920191600101613152565b5f600160ff1b820161318d5761318d612ea4565b505f0390565b634e487b7160e01b5f52601260045260245ffd5b5f8260020b8260020b028060020b91508082146130e1576130e1612ea4565b5f8160020b8360020b806131e857634e487b7160e01b5f52601260045260245ffd5b627fffff1982145f198214161561320157613201612ea4565b90059392505050565b62ffffff81811683821602908116908181146130e1576130e1612ea456";
20234
+ const BASE_ACCOUNTANT_ADDRESS = "0x345cA3407942f9d175c9eA8B90e83A36F570f852";
20235
+ const MAINNET_ACCOUNTANT_ADDRESS = "0x65aA902AE3135658587FFC36ED51B61c927114e1";
20236
+ const LEGACY_MAINNET_ACCOUNTANT_ADDRESS = "0xCCAA8adC2776786Fd0A14Fb1f22D6089E0637a49";
20237
+ const SEPOLIA_ACCOUNTANT_ADDRESS = "0x25BBef1DF262c24aa1AACD1F7eCeEcc1a7AD08ab";
20238
+ const TEST_ACCOUNTANT_ADDRESS = "0x3fE074e8131bE6D8B94700860E1D9E8ece97AA54";
20239
+ const BASE_WETH_ADDRESS = "0x4200000000000000000000000000000000000006";
20240
+ const MAINNET_WETH_ADDRESS = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
20241
+ const SEPOLIA_WETH_ADDRESS = "0xfff9976782d46cc05630d1f6ebab18b2324d6b14";
20242
+ const WETH_IMMUTABLE_OFFSETS = [241, 4947];
20243
+ function normalizeAddressLower(address) {
20244
+ return address.toLowerCase();
20245
+ }
20246
+ function leftPadAddressToWord(address) {
20247
+ return `${"0".repeat(24)}${normalizeAddressLower(address).slice(2)}`;
20248
+ }
20249
+ function hydrateWethImmutables({ bytecode, wethAddress }) {
20250
+ const bytes = bytecode.slice(2).toLowerCase();
20251
+ const word = leftPadAddressToWord(wethAddress);
20252
+ let hydrated = bytes;
20253
+ for (const offset of WETH_IMMUTABLE_OFFSETS) {
20254
+ const start = offset * 2;
20255
+ const end = start + 64;
20256
+ if (end > hydrated.length) continue;
20257
+ hydrated = `${hydrated.slice(0, start)}${word}${hydrated.slice(end)}`;
20258
+ }
20259
+ return `0x${hydrated}`;
20260
+ }
20261
+ const STALE_ORACLE_OVERRIDE_BYTECODE_BY_ACCOUNTANT = {
20262
+ [normalizeAddressLower(BASE_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
20263
+ bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
20264
+ wethAddress: BASE_WETH_ADDRESS
20265
+ }),
20266
+ [normalizeAddressLower(MAINNET_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
20267
+ bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
20268
+ wethAddress: MAINNET_WETH_ADDRESS
20269
+ }),
20270
+ [normalizeAddressLower(LEGACY_MAINNET_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
20271
+ bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
20272
+ wethAddress: MAINNET_WETH_ADDRESS
20273
+ }),
20274
+ [normalizeAddressLower(SEPOLIA_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
20275
+ bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
20276
+ wethAddress: SEPOLIA_WETH_ADDRESS
20277
+ }),
20278
+ [normalizeAddressLower(TEST_ACCOUNTANT_ADDRESS)]: hydrateWethImmutables({
20279
+ bytecode: PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE,
20280
+ wethAddress: SEPOLIA_WETH_ADDRESS
20281
+ })
20282
+ };
20283
+ function getStaleOracleOverrideBytecodeForAccountant(accountantAddress) {
20284
+ return STALE_ORACLE_OVERRIDE_BYTECODE_BY_ACCOUNTANT[normalizeAddressLower(accountantAddress)];
20285
+ }
20286
+ function getStaleOracleStateOverrideForAccountant(accountantAddress) {
20287
+ const bytecode = getStaleOracleOverrideBytecodeForAccountant(accountantAddress);
20288
+ if (bytecode === void 0) return void 0;
20289
+ return [{
20290
+ address: accountantAddress,
20291
+ code: bytecode
20292
+ }];
20293
+ }
20294
+
20295
+ //#endregion
20296
+ //#region src/hypoVault/sharePrice/strategies.ts
20297
+ const DEFAULT_MANAGER_INPUT = "0x";
20298
+ function buildVaultStrategyKey(chainId, vaultAddress) {
20299
+ return `${chainId}:${vaultAddress.toLowerCase()}`;
20300
+ }
20301
+ function resolveChainWethAddress(chainId) {
20302
+ let deployment;
20303
+ try {
20304
+ deployment = requireChainDeployment(chainId);
20305
+ } catch {
20306
+ return void 0;
20307
+ }
20308
+ const wethVaultAddress = deployment.hypovault.vaults.wethPlpVault;
20309
+ return getHypoVaultConfigForVault(wethVaultAddress, chainId)?.addresses?.underlyingToken;
20310
+ }
20311
+ function getPlpManagerAddress(chainId, vaultAddress) {
20312
+ return getHypoVaultConfigForVault(vaultAddress, chainId)?.addresses?.hypoVaultManagerWithMerkleVerification ?? null;
20313
+ }
20314
+ function createPlpManagerInputStrategy(minBlock) {
20315
+ return {
20316
+ enabledMetrics: ["nav"],
20317
+ resolveCandidates: async ({ chainId, vault }) => {
20318
+ const vaultAddress = vault.id;
20319
+ const poolInfos = getVaultPoolInfos(vaultAddress, chainId);
20320
+ if (poolInfos.length === 0) return [];
20321
+ return resolveVaultHistoricalCandidatesByPool({
20322
+ chainId,
20323
+ vaultAddress,
20324
+ managerAddress: getPlpManagerAddress(chainId, vaultAddress),
20325
+ poolInfos
20326
+ });
20327
+ },
20328
+ managerInputProvider: async ({ chainId, client, vault, blockNumber, candidates }) => {
20329
+ const vaultAddress = vault.id;
20330
+ if (minBlock !== void 0 && blockNumber < minBlock) throw new VaultApyPreInceptionBlockError({
20331
+ blockNumber,
20332
+ minBlockNumber: minBlock,
20333
+ context: `PLP manager input for vault ${vault.id}`
20334
+ });
20335
+ const poolInfos = getVaultPoolInfos(vaultAddress, chainId);
20336
+ if (poolInfos.length === 0) return DEFAULT_MANAGER_INPUT;
20337
+ const tokenIds = candidates === void 0 ? await resolveVaultTokenIdsByPool({
20338
+ viemClient: client,
20339
+ chainId,
20340
+ vaultAddress,
20341
+ managerAddress: getPlpManagerAddress(chainId, vaultAddress),
20342
+ poolInfos,
20343
+ verificationBlockNumber: blockNumber
20344
+ }) : await verifyVaultOpenTokenIdsAtBlock({
20345
+ viemClient: client,
20346
+ vaultAddress,
20347
+ candidatesByPool: candidates,
20348
+ blockNumber
20349
+ });
20350
+ const wethAddress = resolveChainWethAddress(chainId);
20351
+ const managerInput = await buildManagerInputAtBlock({
20352
+ viemClient: client,
20353
+ poolInfos,
20354
+ tokenIds,
20355
+ underlyingToken: vault.underlyingToken.id,
20356
+ ...wethAddress === void 0 ? {} : { wethAddress },
20357
+ blockNumber
20358
+ });
20359
+ return {
20360
+ managerInput,
20361
+ diagnostics: {
20362
+ poolAddresses: poolInfos.map((poolInfo) => poolInfo.pool),
20363
+ tokenIdsByPool: tokenIds
20364
+ }
20365
+ };
20366
+ }
20367
+ };
20368
+ }
20369
+ const SEPOLIA_PLP_POOL_MIN_BLOCK = 10268542n;
20370
+ const defaultStrategy = {
20371
+ enabledMetrics: ["nav"],
20372
+ managerInputProvider: async () => DEFAULT_MANAGER_INPUT
20373
+ };
20374
+ const strategyOverridesByVaultKey = {
20375
+ [buildVaultStrategyKey(MAINNET_CHAIN_ID, MainnetUSDCPLPVaultPoolInfos.vaultAddress)]: createPlpManagerInputStrategy(),
20376
+ [buildVaultStrategyKey(MAINNET_CHAIN_ID, MainnetWETHPLPVaultPoolInfos.vaultAddress)]: createPlpManagerInputStrategy(),
20377
+ [buildVaultStrategyKey(BASE_CHAIN_ID, BaseUSDCPLPVaultPoolInfos.vaultAddress)]: createPlpManagerInputStrategy(),
20378
+ [buildVaultStrategyKey(BASE_CHAIN_ID, BaseWETHPLPVaultPoolInfos.vaultAddress)]: createPlpManagerInputStrategy(),
20379
+ [buildVaultStrategyKey(SEPOLIA_CHAIN_ID, SepoliaUSDCPLPVaultPoolInfos.vaultAddress)]: createPlpManagerInputStrategy(SEPOLIA_PLP_POOL_MIN_BLOCK),
20380
+ [buildVaultStrategyKey(SEPOLIA_CHAIN_ID, SepoliaWETHPLPVaultPoolInfos.vaultAddress)]: createPlpManagerInputStrategy(SEPOLIA_PLP_POOL_MIN_BLOCK)
20381
+ };
20382
+ function getVaultApyStrategy({ chainId, vaultAddress }) {
20383
+ const key = buildVaultStrategyKey(chainId, vaultAddress);
20384
+ return strategyOverridesByVaultKey[key] ?? defaultStrategy;
20385
+ }
20386
+ function setVaultApyStrategyOverride({ chainId, vaultAddress, strategy }) {
20387
+ const key = buildVaultStrategyKey(chainId, vaultAddress);
20388
+ strategyOverridesByVaultKey[key] = strategy;
20389
+ }
20390
+
20391
+ //#endregion
20392
+ //#region src/hypoVault/sharePrice/snapshot.ts
20393
+ function toBigInt(value) {
20394
+ if (typeof value === "bigint") return value;
20395
+ if (typeof value === "string" || typeof value === "number") return BigInt(value);
20396
+ return null;
20397
+ }
20398
+ function getAssetsDepositedFromDepositEpochState(value) {
20399
+ if (Array.isArray(value) && value.length > 0) return toBigInt(value[0]);
20400
+ if (typeof value === "object" && value !== null && "assetsDeposited" in value) {
20401
+ const state = value;
20402
+ return state.assetsDeposited === void 0 ? null : toBigInt(state.assetsDeposited);
20403
+ }
20404
+ return null;
20405
+ }
20406
+ async function estimateNavOffchainFromPoolState({ client, chainId, vaultAddress, underlyingTokenAddress, blockNumber, assetsDeposited }) {
20407
+ try {
20408
+ const allocationRows = await fetchVaultLendingAllocation({
20409
+ client,
20410
+ chainId,
20411
+ vaultAddress,
20412
+ underlyingTokenAddress,
20413
+ blockNumber
20414
+ });
20415
+ const totalUnderlying = allocationRows.reduce((sum, row) => sum + row.allocationUnderlying, 0n);
20416
+ const totalAssetsEstimate = totalUnderlying + assetsDeposited;
20417
+ return totalAssetsEstimate === 0n ? 0n : totalAssetsEstimate - 1n;
20418
+ } catch {
20419
+ return null;
20420
+ }
20421
+ }
20422
+ async function fetchVaultSharePriceSnapshot({ client, vault, chainId, windowLabel, blockNumber, readContractFn, candidates, includeTokenIdsInDiagnostics = false }) {
20423
+ const vaultAddress = vault.id;
20424
+ const accountantAddress = vault.accountant;
20425
+ const underlyingTokenAddress = vault.underlyingToken.id;
20426
+ const strategy = getVaultApyStrategy({
20427
+ chainId,
20428
+ vaultAddress
20429
+ });
20430
+ const managerInputProviderResult = await strategy.managerInputProvider({
20431
+ chainId,
20432
+ vault,
20433
+ client,
20434
+ blockNumber,
20435
+ candidates
20436
+ });
20437
+ const managerInput = typeof managerInputProviderResult === "string" ? managerInputProviderResult : managerInputProviderResult.managerInput;
20438
+ const managerInputDiagnostics = typeof managerInputProviderResult === "string" ? void 0 : managerInputProviderResult.diagnostics;
20439
+ const managerInputHash = keccak256(managerInput);
20440
+ const tokenIdCountsByPool = managerInputDiagnostics === void 0 ? null : managerInputDiagnostics.tokenIdsByPool.map((tokenIds, index) => ({
20441
+ poolAddress: managerInputDiagnostics.poolAddresses[index] ?? null,
20442
+ tokenCount: tokenIds.length
20443
+ }));
20444
+ const tokenIdsByPool = !includeTokenIdsInDiagnostics || managerInputDiagnostics === void 0 ? null : managerInputDiagnostics.tokenIdsByPool.map((tokenIds, index) => ({
20445
+ poolAddress: managerInputDiagnostics.poolAddresses[index] ?? null,
20446
+ tokenIds: tokenIds.map((tokenId) => tokenId.toString())
20447
+ }));
20448
+ const readWithContext = async ({ callName, request }) => {
20449
+ try {
20450
+ return await readContractFn(client, request);
20451
+ } catch (error) {
20452
+ const details = error instanceof Error ? error.message : typeof error === "string" ? error : "unknown error";
20453
+ throw new Error(`[${callName}] ${details}`);
20454
+ }
20455
+ };
20456
+ const [depositEpochRaw, reservedWithdrawalAssetsRaw, sharesRaw] = await Promise.all([
20457
+ readWithContext({
20458
+ callName: "depositEpoch",
20459
+ request: {
20460
+ address: vaultAddress,
20461
+ abi: HypoVaultAbi,
20462
+ functionName: "depositEpoch",
20463
+ blockNumber
20464
+ }
20465
+ }),
20466
+ readWithContext({
20467
+ callName: "reservedWithdrawalAssets",
20468
+ request: {
20469
+ address: vaultAddress,
20470
+ abi: HypoVaultAbi,
20471
+ functionName: "reservedWithdrawalAssets",
20472
+ blockNumber
20473
+ }
20474
+ }),
20475
+ readWithContext({
20476
+ callName: "totalSupply",
20477
+ request: {
20478
+ address: vaultAddress,
20479
+ abi: HypoVaultAbi,
20480
+ functionName: "totalSupply",
20481
+ blockNumber
20482
+ }
20483
+ })
20484
+ ]);
20485
+ const depositEpoch = toBigInt(depositEpochRaw);
20486
+ if (depositEpoch === null) throw new Error(`Unexpected depositEpoch output type for vault ${vault.id}`);
20487
+ const depositEpochStateRaw = await readWithContext({
20488
+ callName: "depositEpochState",
20489
+ request: {
20490
+ address: vaultAddress,
20491
+ abi: HypoVaultAbi,
20492
+ functionName: "depositEpochState",
20493
+ args: [depositEpoch],
20494
+ blockNumber
20495
+ }
20496
+ });
20497
+ const reservedWithdrawalAssets = toBigInt(reservedWithdrawalAssetsRaw);
20498
+ const shares = toBigInt(sharesRaw);
20499
+ const assetsDeposited = getAssetsDepositedFromDepositEpochState(depositEpochStateRaw);
20500
+ if (reservedWithdrawalAssets === null || shares === null || assetsDeposited === null) throw new Error(`Unexpected readContract output types for vault ${vault.id}`);
20501
+ let nav = null;
20502
+ let navSource = "computeNAV";
20503
+ const staleOracleStateOverride = getStaleOracleStateOverrideForAccountant(accountantAddress);
20504
+ const navRequest = {
20505
+ address: accountantAddress,
20506
+ abi: PanopticVaultAccountantAbi,
20507
+ functionName: "computeNAV",
20508
+ args: [
20509
+ vaultAddress,
20510
+ underlyingTokenAddress,
20511
+ managerInput
20512
+ ],
20513
+ blockNumber
20514
+ };
20515
+ try {
20516
+ const navRaw = await readWithContext({
20517
+ callName: "computeNAV",
20518
+ request: navRequest
20519
+ });
20520
+ nav = toBigInt(navRaw);
20521
+ navSource = "computeNAV";
20522
+ } catch (error) {
20523
+ if (!isStaleOraclePriceReadError(error)) throw error;
20524
+ if (staleOracleStateOverride !== void 0) try {
20525
+ const navRawWithOverride = await readWithContext({
20526
+ callName: "computeNAV",
20527
+ request: {
20528
+ ...navRequest,
20529
+ stateOverride: staleOracleStateOverride
20530
+ }
20531
+ });
20532
+ nav = toBigInt(navRawWithOverride);
20533
+ navSource = "computeNAVStateOverride";
20534
+ } catch {}
20535
+ if (nav === null) {
20536
+ nav = await estimateNavOffchainFromPoolState({
20537
+ client,
20538
+ chainId,
20539
+ vaultAddress,
20540
+ underlyingTokenAddress,
20541
+ blockNumber,
20542
+ assetsDeposited
20543
+ });
20544
+ if (nav === null) throw error;
20545
+ navSource = "offchainLendingEstimate";
20546
+ }
20547
+ }
20548
+ if (nav === null) throw new Error(`Unexpected computeNAV output type for vault ${vault.id}`);
20549
+ const sharePrice = computeSharePriceFromNavSnapshot({
20550
+ nav,
20551
+ assetsDeposited,
20552
+ reservedWithdrawalAssets,
20553
+ shares
20554
+ });
20555
+ return {
20556
+ sharePrice: sharePrice?.toString() ?? null,
20557
+ nav,
20558
+ assetsDeposited,
20559
+ reservedWithdrawalAssets,
20560
+ shares,
20561
+ blockNumber,
20562
+ navSource,
20563
+ managerInputBytes: managerInput,
20564
+ managerInputByteLength: (managerInput.length - 2) / 2,
20565
+ managerInputHash,
20566
+ tokenIdCountsByPool,
20567
+ tokenIdsByPool
20568
+ };
20569
+ }
20570
+
20571
+ //#endregion
20572
+ //#region src/hypoVault/sharePrice/timeseries.ts
20573
+ const SECONDS_PER_DAY = 86400;
20574
+ /**
20575
+ * Pure derivation: turn an (unordered) share-price series into an annualized
20576
+ * APY series. Each point annualizes the growth between consecutive share
20577
+ * prices over their actual time gap.
20578
+ */
20579
+ function deriveVaultApyTimeseriesFromSharePrices(sharePricePoints) {
20580
+ const sorted = [...sharePricePoints].sort((a, b) => a.timestampSec - b.timestampSec);
20581
+ const points = [];
20582
+ for (let i = 1; i < sorted.length; i += 1) {
20583
+ const previous = sorted[i - 1];
20584
+ const current = sorted[i];
20585
+ const days = (current.timestampSec - previous.timestampSec) / SECONDS_PER_DAY;
20586
+ const apyPct = calculateAnnualizedApyPct({
20587
+ currentSharePrice: new Decimal(current.sharePrice),
20588
+ previousSharePrice: new Decimal(previous.sharePrice),
20589
+ days
20590
+ });
20591
+ if (apyPct === null || !Number.isFinite(apyPct)) continue;
20592
+ points.push({
20593
+ timestampSec: current.timestampSec,
20594
+ apyPct
20595
+ });
20596
+ }
20597
+ return points;
20598
+ }
20599
+
20600
+ //#endregion
20601
+ //#region src/hypoVault/utils/merkleTreeHelper.ts
20602
+ /**
20603
+ * Efficiently hashes two bytes32 values together
20604
+ * Equivalent to Solidity's keccak256(abi.encodePacked(a, b))
20605
+ */
20606
+ function efficientHash(a, b) {
20607
+ return keccak256(encodePacked(["bytes32", "bytes32"], [a, b]));
20608
+ }
20609
+ /**
20610
+ * Hashes a pair of bytes32 values in sorted order (mimics OpenZeppelin's approach)
20611
+ * This ensures that hashPair(a, b) === hashPair(b, a)
20612
+ */
20613
+ function hashPair(a, b) {
20614
+ return a < b ? efficientHash(a, b) : efficientHash(b, a);
20615
+ }
20616
+ /**
20617
+ * Generates a Merkle proof for a given leaf within a Merkle tree
20618
+ * @param leaf The leaf hash to generate a proof for
20619
+ * @param tree The complete Merkle tree (array of layers, where tree[0] is the bottom layer)
20620
+ * @returns Array of sibling hashes that form the proof
20621
+ * @throws Error if the leaf is not found in the tree
20622
+ */
20623
+ function generateProof(leaf, tree) {
20624
+ const treeLength = tree.length;
20625
+ const proof = new Array(treeLength - 1);
20626
+ let currentLeaf = leaf;
20627
+ for (let i = 0; i < treeLength - 1; i++) {
20628
+ const layer = tree[i];
20629
+ let found = false;
20630
+ for (let j = 0; j < layer.length; j++) if (currentLeaf === layer[j]) {
20631
+ proof[i] = j % 2 === 0 ? layer[j + 1] : layer[j - 1];
20632
+ currentLeaf = hashPair(currentLeaf, proof[i]);
20633
+ found = true;
20634
+ break;
20635
+ }
20636
+ if (!found) throw new Error("Leaf not found in tree");
20637
+ }
20638
+ return proof;
20639
+ }
20640
+ /**
20641
+ * Generates Merkle proofs for multiple manage leaves using a pre-built Merkle tree
20642
+ * @param manageLeafs Array of manage leaves to generate proofs for
20643
+ * @param tree The complete Merkle tree structure
20644
+ * @param rawDataDecoderAddress Address of the raw data decoder and sanitizer contract
20645
+ * @returns Array of proofs, one for each manage leaf
20646
+ */
20647
+ function getProofsUsingTree(manageLeafs, tree, rawDataDecoderAddress) {
20648
+ const proofs = [];
20649
+ for (let i = 0; i < manageLeafs.length; i++) {
20650
+ const manageLeaf = manageLeafs[i];
20651
+ const selectorHash = keccak256(encodePacked(["string"], [manageLeaf.signature]));
20652
+ const selector = selectorHash.slice(0, 10);
20653
+ let rawDigest = encodePacked([
20654
+ "address",
20655
+ "address",
20656
+ "bool",
20657
+ "bytes4"
20658
+ ], [
20659
+ rawDataDecoderAddress,
20660
+ manageLeaf.target,
20661
+ manageLeaf.canSendValue,
20662
+ selector
20663
+ ]);
20664
+ for (const argAddress of manageLeaf.argumentAddresses) rawDigest = encodePacked(["bytes", "address"], [rawDigest, argAddress]);
20665
+ const leaf = keccak256(rawDigest);
20666
+ proofs.push(generateProof(leaf, tree));
20667
+ }
20668
+ return proofs;
20669
+ }
20670
+ /**
20671
+ * Generates Merkle proofs using pre-computed leaf digests
20672
+ * @param leafDigests Array of pre-computed leaf digest hashes
20673
+ * @param tree The complete Merkle tree structure (tree[0] is the leaf layer)
20674
+ * @returns Array of proofs, one for each leaf digest
20675
+ */
20676
+ function getProofsFromDigests(leafDigests, tree) {
20677
+ const proofs = [];
20678
+ for (const leafDigest of leafDigests) proofs.push(generateProof(leafDigest, tree));
20679
+ return proofs;
20680
+ }
20681
+ /**
20682
+ * Converts a Merkle tree from JSON format to the expected format for proof generation
20683
+ * JSON format stores layers as: { "0": [root], "1": [...], "N": [leaves] }
20684
+ * Expected format: [[leaves], [...], [root]]
20685
+ * @param jsonTree The tree structure from JSON (keyed by layer index)
20686
+ * @returns Array of layers with leaves at index 0 and root at the end
20687
+ */
20688
+ function convertJsonTreeToArray(jsonTree) {
20689
+ const layerIndices = Object.keys(jsonTree).map(Number).sort((a, b) => a - b);
20690
+ const reversedIndices = [...layerIndices].reverse();
20691
+ return reversedIndices.map((index) => [...jsonTree[index.toString()]]);
20692
+ }
20693
+
20694
+ //#endregion
20695
+ //#region src/hypoVault/utils/buildManageArgs.ts
20696
+ /**
20697
+ * Finds a leaf by its description with full type safety and autocomplete.
20698
+ * Throws if the leaf is not found.
20699
+ *
20700
+ * @param artifact - The strategist leaves artifact (e.g., SepoliaWETHPLPStrategistLeaves)
20701
+ * @param description - The description of the leaf to find (autocomplete enabled)
20702
+ * @returns The matching leaf
20703
+ * @throws Error if no leaf matches the description
20704
+ *
20705
+ * @example
20706
+ * ```ts
20707
+ * // Autocomplete shows all valid descriptions for this artifact
20708
+ * const approveLeaf = findLeaf(SepoliaWETHPLPStrategistLeaves, 'Approve poWETH to spend WETH')
20709
+ * const depositLeaf = findLeaf(SepoliaUSDCPLPStrategistLeaves, 'Deposit USDC for poUSDC')
20710
+ * ```
20711
+ */
20712
+ function findLeaf(artifact, description) {
20713
+ const leaf = artifact.leafs.find((l) => l.Description === description);
20714
+ if (!leaf) throw new Error(`Leaf not found: "${description}"`);
20715
+ return leaf;
20716
+ }
20717
+ /**
20718
+ * Transforms an array of ManageActions into the argument tuple required by
20719
+ * manageVaultWithMerkleVerification.
20720
+ *
20721
+ * @param actions - Array of manage actions to execute
20722
+ * @param artifact - The strategist leaves artifact (e.g., SepoliaWETHPLPStrategistLeaves)
20723
+ * @returns Tuple of [proofs, decodersAndSanitizers, targets, targetData, values]
20724
+ *
20725
+ * @example
20726
+ * ```ts
20727
+ * const actions: ManageAction[] = [
20728
+ * {
20729
+ * leaf: findLeaf(SepoliaWETHPLPStrategistLeaves, 'Approve poWETH to spend WETH'),
20730
+ * data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [spender, amount] }),
20731
+ * },
20732
+ * {
20733
+ * leaf: findLeaf(SepoliaWETHPLPStrategistLeaves, 'Deposit WETH for poWETH'),
20734
+ * data: encodeFunctionData({ abi: CollateralTrackerAbi, functionName: 'deposit', args: [assets, receiver] }),
20735
+ * },
20736
+ * ]
20737
+ *
20738
+ * const [proofs, decodersAndSanitizers, targets, targetData, values] = buildManageArgs(
20739
+ * actions,
20740
+ * SepoliaWETHPLPStrategistLeaves
20741
+ * )
20742
+ * ```
20743
+ */
20744
+ function buildManageArgs(actions, artifact) {
20745
+ const leafDigests = actions.map((a) => a.leaf.LeafDigest);
20746
+ const tree = convertJsonTreeToArray(artifact.MerkleTree);
20747
+ const proofs = getProofsFromDigests(leafDigests, tree);
20748
+ const decodersAndSanitizers = actions.map((a) => a.leaf.DecoderAndSanitizerAddress);
20749
+ const targets = actions.map((a) => a.leaf.TargetAddress);
20750
+ const targetData = actions.map((a) => a.data);
20751
+ const values = actions.map((a) => a.value ?? 0n);
20752
+ return [
20753
+ proofs,
20754
+ decodersAndSanitizers,
20755
+ targets,
20756
+ targetData,
20757
+ values
20758
+ ];
20759
+ }
20760
+
20761
+ //#endregion
20762
+ //#region src/panoptic/v1/CollateralTracker/deposit.ts
20763
+ function encodeDepositFunctionData({ assets, receiver }) {
20764
+ return encodeFunctionData({
20765
+ abi: CollateralTrackerAbi,
20766
+ functionName: "deposit",
20767
+ args: [assets, receiver]
20768
+ });
20769
+ }
20770
+
20771
+ //#endregion
20772
+ //#region src/panoptic/v1/CollateralTracker/withdraw.ts
20773
+ function encodeWithdrawFunctionData({ assets, receiver, owner }) {
20774
+ return encodeFunctionData({
20775
+ abi: CollateralTrackerAbi,
20776
+ functionName: "withdraw",
20777
+ args: [
20778
+ assets,
20779
+ receiver,
20780
+ owner
20781
+ ]
20782
+ });
20783
+ }
20784
+
20785
+ //#endregion
20786
+ //#region src/token/erc20/approve.ts
20787
+ function encodeApproveFunctionData({ spender, amount }) {
20788
+ return encodeFunctionData({
20789
+ abi: Erc20Abi,
20790
+ functionName: "approve",
20791
+ args: [spender, amount]
20792
+ });
20793
+ }
20794
+
20795
+ //#endregion
20796
+ //#region src/rpc.ts
20797
+ const alchemyChains = {
20798
+ 1: "eth-mainnet",
20799
+ 137: "polygon-mainnet",
20800
+ 42161: "arb-mainnet",
20801
+ 8453: "base-mainnet",
20802
+ 10: "opt-mainnet",
20803
+ 130: "unichain-mainnet",
20804
+ 11155111: "eth-sepolia"
20805
+ };
20806
+ function getAlchemyRpcUrl(chainId, alchemyApiKey) {
20807
+ if (alchemyChains[chainId]) return `https://${alchemyChains[chainId]}.g.alchemy.com/v2/${alchemyApiKey}`;
20808
+ else throw new Error(`Unsupported chainId: ${chainId}`);
20809
+ }
20810
+ function getAlchemyWsRpcUrl(chainId, alchemyApiKey) {
20811
+ if (alchemyChains[chainId]) return `wss://${alchemyChains[chainId]}.g.alchemy.com/v2/${alchemyApiKey}`;
20812
+ else throw new Error(`Unsupported chainId: ${chainId}`);
20813
+ }
20814
+
20815
+ //#endregion
20816
+ export { BASE_CHAIN_ID, BASE_DEPLOYMENT, BASE_ETH_USDC_5BPS_MARKET, BASE_HYPOVAULT_ADDRESSES, BASE_HYPOVAULT_CORE_ADDRESSES, BASE_HYPOVAULT_MANAGER_ADDRESSES, BASE_HYPOVAULT_MANAGER_TURNKEY_SIGNERS, BASE_PANOPTIC_POOL_ADDRESSES, BASE_PANOPTIC_V2_ADDRESSES, BORROW_INDEX_BITS, BPS_SCALE, BaseUSDCPLPStrategistLeaves, BaseUSDCPLPVaultPoolInfos, BaseWETHPLPStrategistLeaves, BaseWETHPLPVaultPoolInfos, CHAIN_DEPLOYMENTS, CollateralTrackerAbi, CollateralTrackerV1_1Abi, Erc1155Abi, Erc20Abi, HypoVaultAbi, HypoVaultManagerConfigSchema, HypoVaultManagerWithMerkleVerificationAbi, MAINNET_CHAIN_ID, MAINNET_DEPLOYMENT, MAINNET_PANOPTIC_V2_ADDRESSES, MARKET_EPOCH_BITS, MARKET_EPOCH_SHIFT, MainnetLegacyUSDCPLPStrategistLeaves, MainnetLegacyWETHPLPStrategistLeaves, MainnetUSDCPLPLegacyVaultPoolInfos, MainnetUSDCPLPStrategistLeaves, MainnetUSDCPLPVaultPoolInfos, MainnetWETHPLPLegacyVaultPoolInfos, MainnetWETHPLPStrategistLeaves, MainnetWETHPLPVaultPoolInfos, Multicall3Abi, NonFungiblePositionManagerAbi, PanopticFactoryV3Abi, PanopticFactoryV4Abi, PanopticHelperAbi, PanopticPoolAbi, PanopticPoolV1_1Abi, PanopticQueryV1_1Abi, PanopticVaultAccountantAbi, PanopticVaultAccountantManagerInputAbi, PoolManagerAbi, RATE_AT_TARGET_BITS, RescueDistributorAbi, SECONDS_PER_YEAR, SEPOLIA_CHAIN_ID, SEPOLIA_DEPLOYMENT, SEPOLIA_ETH_USDC_5BPS_MARKET, SEPOLIA_HYPOVAULT_ADDRESSES, SEPOLIA_HYPOVAULT_CORE_ADDRESSES, SEPOLIA_HYPOVAULT_MANAGER_ADDRESSES, SEPOLIA_HYPOVAULT_MANAGER_TURNKEY_SIGNERS, SEPOLIA_PANOPTIC_POOL_ADDRESSES, SEPOLIA_PANOPTIC_V2_ADDRESSES, SemiFungiblePositionManagerAbi, SemiFungiblePositionManagerV1_1Abi, SepoliaUSDCPLPStrategistLeaves, SepoliaUSDCPLPVaultPoolInfos, SepoliaWETHPLPStrategistLeaves, SepoliaWETHPLPVaultPoolInfos, Simple7702AccountAbi, StateViewAbi, UNREALIZED_INTEREST_BITS, UniswapHelperAbi, UniswapHelperV1_1Abi, UniswapMigratorAbi, UniswapV3FactoryAbi, UniswapV3PoolAbi, UsdcPlpVaultBaseProdConfig, UsdcPlpVaultMainnetLegacyConfig, UsdcPlpVaultMainnetProdConfig, UsdcPlpVaultSepoliaDevConfig, UsdcPlpVaultSepoliaProdConfig, VAULT_DISPLAY_NAMES_PER_CHAIN, VAULT_DISPLAY_NAME_RESOLVERS_PER_CHAIN, VaultApyPreInceptionBlockError, WAD, WETHAbi, WethPlpVaultBaseProdConfig, WethPlpVaultMainnetLegacyConfig, WethPlpVaultMainnetProdConfig, WethPlpVaultSepoliaDevConfig, WethPlpVaultSepoliaProdConfig, adjustUnderlyingIdleBalance, annualizePerSecondRateWad, buildExecuteDepositCalldatas, buildExecuteWithdrawalCalldatas, buildManageArgs, buildManagerInput, buildManagerInputAtBlock, buildRequestWithdrawalCalldatas, buildVaultManagerInput, buildVaultManagerInputAtBlock, builderFactoryAbi, builderWalletAbi, calculateAnnualizedApyPct, calculateAssetsFromShares, calculateAvailableShares, calculateClaimableAssetsFromQueuedWithdrawals, calculateClaimableSharesFromQueuedDeposits, calculateSharesFromAssets, calculateVaultNetLendingApyPctFromTrackerInputs, calculateVaultNetLendingYieldUnderlyingFromTrackerInputs, cancelDeposit, chainToHypoVaultGraphQlAPI, collateralTrackerV2Abi as collateralTrackerAbi, collateralTrackerV2Abi, computeSharePriceFromNavSnapshot, convertJsonTreeToArray, deriveSupplyRatePerSecWad, deriveVaultApyTimeseriesFromSharePrices, encodeApproveFunctionData, encodeCancelDepositFunctionData, encodeDepositFunctionData, encodeExecuteDepositFunctionData, encodeExecuteWithdrawalFunctionData, encodeExecuteWithdrawalMulticallFunctionData, encodeFulfillDepositsFunctionData, encodeFulfillWithdrawalsFunctionData, encodeRequestDepositFunctionData, encodeRequestWithdrawalFunctionData, encodeRequestWithdrawalMulticallFunctionData, encodeWithdrawFunctionData, executeWithdrawal, executeWithdrawalMulticall, fetchFirstDepositTimestampByVaultId, fetchVaultLendingAllocation, fetchVaultNetLendingApyPct, fetchVaultNetLendingYieldUnderlying, fetchVaultSharePriceSnapshot, findLeaf, formatPerSecondRateWadAsAprPct, formatPerSecondRateWadAsApyPct, generateProof, getAlchemyRpcUrl, getAlchemyWsRpcUrl, getCancelDepositContractConfig, getChainDeployment, getEthUsdcMarket, getExecuteWithdrawalContractConfig, getExecuteWithdrawalMulticallContractConfig, getHypoVaultConfigForVault, getHypoVaultGraphQLClient, getIrmCurrent, getIrmCurve, getLendingAllocationRows, getMinQueuedDepositEpoch, getProofsFromDigests, getProofsUsingTree, getRequestDepositContractConfig, getRequestWithdrawalContractConfig, getRequestWithdrawalMulticallContractConfig, getStaleOracleOverrideBytecodeForAccountant, getStaleOracleStateOverrideForAccountant, getVaultApyErrorMessage, getVaultApyStrategy, getVaultPoolInfos, isExpectedHistoricalReadMiss, isStaleOraclePriceError, isStaleOraclePriceReadError, isSupportedChain, packMarketState, panopticFactoryV4Abi as panopticFactoryAbi, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticPoolV2Abi as panopticPoolAbi, panopticPoolV2Abi, panopticQueryAbi, parseCustomError, ratePerSecWadToAprPct, requestDeposit, requestWithdrawal, requestWithdrawalMulticall, requireChainDeployment, resolveVaultDisplayName, resolveVaultHistoricalCandidatesByPool, resolveVaultTokenIdsByPool, riskEngineAbi, semiFungiblePositionManagerV4Abi as semiFungiblePositionManagerAbi, semiFungiblePositionManagerV3Abi, semiFungiblePositionManagerV4Abi, setVaultApyStrategyOverride, simulateCancelDeposit, simulateExecuteWithdrawal, simulateExecuteWithdrawalMulticall, simulateRequestDeposit, simulateRequestWithdrawal, simulateRequestWithdrawalMulticall, useCancelDeposit, useExecuteWithdrawal, useRequestDeposit, useRequestWithdrawal, utilizationBpsToWad, utilizationPctToWad, verifyVaultOpenTokenIdsAtBlock };
20003
20817
  //# sourceMappingURL=index.js.map