@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.d.ts +696 -5907
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1393 -579
- package/dist/index.js.map +1 -1
- package/dist/irm-C7OUVANR.d.ts +5641 -0
- package/dist/irm-C7OUVANR.d.ts.map +1 -0
- package/dist/{irm-CfM383Ku.js → irm-DNK3N7qk.js} +300 -2
- package/dist/irm-DNK3N7qk.js.map +1 -0
- package/dist/panoptic/v2/index.d.ts +2 -2
- package/dist/panoptic/v2/index.js +3 -3
- package/dist/{router-CMrp245w.js → router-BZvOeloX.js} +89 -39
- package/dist/router-BZvOeloX.js.map +1 -0
- package/dist/test/index.d.ts +2 -2
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +1 -1
- package/dist/uniswap/index.d.ts +118 -1
- package/dist/uniswap/index.d.ts.map +1 -1
- package/dist/uniswap/index.js +227 -3
- package/dist/uniswap/index.js.map +1 -0
- package/dist/zodiac/index.d.ts +444 -0
- package/dist/zodiac/index.d.ts.map +1 -0
- package/dist/zodiac/index.js +949 -0
- package/dist/zodiac/index.js.map +1 -0
- package/package.json +6 -1
- package/dist/irm-CfM383Ku.js.map +0 -1
- package/dist/irm-zWjtffWA.d.ts +0 -85
- package/dist/irm-zWjtffWA.d.ts.map +0 -1
- package/dist/router-CMrp245w.js.map +0 -1
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-
|
|
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/
|
|
19320
|
-
const PANOPTIC_VAULT_ACCOUNTANT_RUNTIME_BYTECODE = "0x608060405234801561000f575f5ffd5b5060043610610090575f3560e01c80638da5cb5b116100635780638da5cb5b14610135578063995cac6d14610145578063a519c19814610158578063d597b7361461016b578063f2fde38b1461017e575f5ffd5b8063016ff32e1461009457806328d6ae4a146100cb5780634f0e0ef3146100ec578063715018a61461012b575b5f5ffd5b6100b66100a236600461274b565b60026020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100de6100d9366004612766565b610191565b6040519081526020016100c2565b6101137f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c2565b6101336101b3565b005b5f546001600160a01b0316610113565b6101336101533660046127d0565b6101c6565b61013361016636600461274b565b610598565b6100de610179366004612881565b6105c3565b61013361018c36600461274b565b611865565b6001602052815f5260405f2081600281106101aa575f80fd5b01549150829050565b6101bb6118a7565b6101c45f6118d3565b565b6101ce6118a7565b6001600160a01b0385165f9081526002602052604090205460ff1615610207576040516372b89e9760e11b815260040160405180910390fd5b5f5b838110156102ac575f5b818110156102a35785858281811061022d5761022d61290d565b610243926020608090920201908101915061274b565b6001600160a01b031686868481811061025e5761025e61290d565b610274926020608090920201908101915061274b565b6001600160a01b03160361029b57604051635c1523a360e11b815260040160405180910390fd5b600101610213565b50600101610209565b505f5b8181101561050a575f5b81811015610347578383828181106102d3576102d361290d565b90506020020160208101906102e8919061274b565b6001600160a01b03168484848181106103035761030361290d565b9050602002016020810190610318919061274b565b6001600160a01b03160361033f57604051637542915f60e11b815260040160405180910390fd5b6001016102b9565b505f5b84811015610501578585828181106103645761036461290d565b61037a926020608090920201908101915061274b565b6001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d99190612921565b6001600160a01b03168484848181106103f4576103f461290d565b9050602002016020810190610409919061274b565b6001600160a01b031614806104db575085858281811061042b5761042b61290d565b610441926020608090920201908101915061274b565b6001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa15801561047c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a09190612921565b6001600160a01b03168484848181106104bb576104bb61290d565b90506020020160208101906104d0919061274b565b6001600160a01b0316145b156104f957604051637542915f60e11b815260040160405180910390fd5b60010161034a565b506001016102af565b50838360405160200161051e92919061294a565b60408051808303601f1901815282825280516020918201206001600160a01b0389165f90815260018352929092209190915561055e9184918491016129e4565b60408051808303601f1901815291815281516020928301206001600160a01b03979097165f90815260019283905220019490945550505050565b6105a06118a7565b6001600160a01b03165f908152600260205260409020805460ff19166001179055565b5f8080806105d385870187612cd2565b506001600160a01b038b165f90815260016020526040812093965091945092500154826040516020016106069190612e29565b604051602081830303815290604052805190602001201461063a576040516395241ae360e01b815260040160405180910390fd5b5f825160026106499190612eb8565b6001600160401b0381111561066057610660612a26565b604051908082528060200260200182016040528015610689578160200160208202803683370190505b509050885f5b8451811015611537575f5f5f8784815181106106ad576106ad61290d565b60200260200101515f01516001600160a01b03166305ecd0036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107179190612ecf565b905087848151811061072b5761072b61290d565b60200260200101516060015160020b61076d828b87815181106107505761075061290d565b60200260200101515f01516107659190612eea565b60020b611922565b131561078c57604051631510fe5b60e31b815260040160405180910390fd5b60605f5f8a87815181106107a2576107a261290d565b60200260200101515f01516001600160a01b031663011492288960018d8b815181106107d0576107d061290d565b60200260200101516040518463ffffffff1660e01b81526004016107f693929190612f0f565b5f60405180830381865afa158015610810573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108379190810190612fca565b50909550919350915061085890506001600160801b038083169084166130c2565b95506108648160801c90565b6001600160801b03166108778360801c90565b6001600160801b031661088a91906130c2565b945050505f8986815181106108a1576108a161290d565b60200260200101515f01516001600160a01b03166353aad1d96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090b9190612ecf565b90505f805b8a88815181106109225761092261290d565b602002602001015151811015610aa8575f8482815181106109455761094561290d565b60200260200101519050806001600160801b03165f0361097857604051632276762d60e11b815260040160405180910390fd5b5f8c8a8151811061098b5761098b61290d565b602002602001015183815181106109a4576109a461290d565b602002602001015190505f6109b882611940565b90505f5b81811015610a24576109ce838261197a565b60020b15610a1c575f5f6109ec896109e787868a611991565b6119fa565b90925090506109fb8584611a79565b5f03610a0e579b81019b9a8b019a610a19565b818d039c50808c039b505b50505b6001016109bc565b505f5f610a3384866001611a8b565b91509150610a3e8190565b600f0b82600f0b610a4f91906130c2565b610a59908d6130e8565b9b50610a658160801d90565b600f0b610a728360801d90565b600f0b610a7f91906130c2565b610a89908c6130e8565b9a50610a95838861310f565b9650506001909401935061091092505050565b508a8781518110610abb57610abb61290d565b60209081029190910101515160405163c79ee60d60e01b81526001600160a01b038a811660048301529091169063c79ee60d90602401602060405180830381865afa158015610b0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b309190613122565b8114610b4f57604051632276762d60e11b815260040160405180910390fd5b5050505f6001600160a01b0316888581518110610b6e57610b6e61290d565b6020026020010151602001516001600160a01b031603610bca5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee888581518110610baf57610baf61290d565b6020908102919091018101516001600160a01b039092169101525b5f808080805b8a51811015610d86578c8981518110610beb57610beb61290d565b6020026020010151602001516001600160a01b03168b8281518110610c1257610c1261290d565b60200260200101516001600160a01b031603610c2d57600192505b8c8981518110610c3f57610c3f61290d565b6020026020010151604001516001600160a01b03168b8281518110610c6657610c6661290d565b60200260200101516001600160a01b031603610c8157600191505b5f6001600160a01b03168b8281518110610c9d57610c9d61290d565b60200260200101516001600160a01b031603610d7e5782610d09578c8981518110610cca57610cca61290d565b6020026020010151602001518b8281518110610ce857610ce861290d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b81610d79578c8981518110610d2057610d2061290d565b6020026020010151604001518b84610d39576001610d3b565b5f5b610d489060ff168461310f565b81518110610d5857610d5861290d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b610d86565b600101610bd0565b5081610e735773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168c8981518110610dbc57610dbc61290d565b6020026020010151602001516001600160a01b031614610e64578b8881518110610de857610de861290d565b60209081029190910181015101516040516370a0823160e01b81526001600160a01b038b81166004830152909116906370a0823190602401602060405180830381865afa158015610e3b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5f9190613122565b610e70565b886001600160a01b0316315b93505b80610f12578b8881518110610e8a57610e8a61290d565b6020026020010151604001516001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401610ed091906001600160a01b0391909116815260200190565b602060405180830381865afa158015610eeb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0f9190613122565b92505b5f8c8981518110610f2557610f2561290d565b60200260200101515f01516001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8f9190612921565b6040516370a0823160e01b81526001600160a01b038c8116600483015291909116906370a0823190602401602060405180830381865afa158015610fd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff99190613122565b90508c898151811061100d5761100d61290d565b60200260200101515f01516001600160a01b0316637594cdc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611053573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110779190612921565b6001600160a01b0316634cdad506826040518263ffffffff1660e01b81526004016110a491815260200190565b602060405180830381865afa1580156110bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e39190613122565b6110ed90896130e8565b97508c89815181106111015761110161290d565b60200260200101515f01516001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa158015611147573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116b9190612921565b6040516370a0823160e01b81526001600160a01b038c8116600483015291909116906370a0823190602401602060405180830381865afa1580156111b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d59190613122565b90508c89815181106111e9576111e961290d565b60200260200101515f01516001600160a01b0316634d7b09006040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112539190612921565b6001600160a01b0316634cdad506826040518263ffffffff1660e01b815260040161128091815260200190565b602060405180830381865afa15801561129b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bf9190613122565b6112c990886130e8565b96505050508e6001600160a01b03168a87815181106112ea576112ea61290d565b6020026020010151602001516001600160a01b0316146114245773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03168a87815181106113345761133461290d565b6020026020010151602001516001600160a01b031614801561138757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168f6001600160a01b0316145b6114245789868151811061139d5761139d61290d565b60200260200101516060015160020b6113d88c88815181106113c1576113c161290d565b602002602001015160200151856107659190612eea565b13156113f757604051631510fe5b60e31b815260040160405180910390fd5b5f61140184611ae4565b905061140d8682611dff565b955082156114225761141f8382611dff565b92505b505b8e6001600160a01b03168a87815181106114405761144061290d565b6020026020010151604001516001600160a01b0316146114f35789868151811061146c5761146c61290d565b60200260200101516060015160020b6114a78c88815181106114905761149061290d565b602002602001015160400151856107659190612eea565b13156114c657604051631510fe5b60e31b815260040160405180910390fd5b5f6114d084611ae4565b90506114dc8582611e82565b945081156114f1576114ee8282611e82565b91505b505b61150661150085876130e8565b5f611eef565b611510828461310f565b61151a919061310f565b611524908d61310f565b9b50506001909401935061068f92505050565b505f611545888a018a612cd2565b6001600160a01b0386165f908152600160208190526040909120919550909350915061156e9050565b0154816040516020016115819190613139565b60405160208183030381529060405280519060200120146115b557604051637560978b60e11b815260040160405180910390fd5b5f5b815181101561178e578a6001600160a01b03168282815181106115dc576115dc61290d565b60200260200101516001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116439190612921565b6001600160a01b03161461166a57604051635de194d760e01b815260040160405180910390fd5b5f82828151811061167d5761167d61290d565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156116cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f19190613122565b90508282815181106117055761170561290d565b60200260200101516001600160a01b0316634cdad506826040518263ffffffff1660e01b815260040161173a91815260200190565b602060405180830381865afa158015611755573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117799190613122565b611783908a61310f565b9850506001016115b7565b505f9050805b83518110156117dc578a6001600160a01b03168482815181106117b9576117b961290d565b60200260200101516001600160a01b0316036117d457600191505b600101611794565b5080611857576040516370a0823160e01b81526001600160a01b0383811660048301528b16906370a0823190602401602060405180830381865afa158015611826573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190613122565b611854908861310f565b96505b505050505050949350505050565b61186d6118a7565b6001600160a01b03811661189b57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6118a4816118d3565b50565b5f546001600160a01b031633146101c45760405163118cdaa760e01b8152336004820152602401611892565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f82136119385761193382613179565b61193a565b815b92915050565b5f72fe0000000000fe0000000000fe0000000000fe604083901c165b6001603083021b81106119745781600101915061195c565b50919050565b5f6110006064603084020184901c5b069392505050565b5f808061199e8686611f04565b90925090505f6119ae8787611f3b565b6119c1906001600160801b038716612eb8565b90506119cd8787611f4d565b5f036119e8576119de838383611f5f565b93505050506119f3565b6119de838383612008565b9392505050565b5f5f611a068360e81c90565b60020b8460020b1215611a2357611a1c8361203c565b9150611a72565b611a2d8360d01c90565b60020b8460020b12611a4957611a42836120ae565b9050611a72565b611a5b611a5684866120f5565b61203c565b9150611a6f611a6a8486612115565b6120ae565b90505b9250929050565b5f60026048603084020184901c611989565b5f5f5f611a9786611940565b90505f5b818114611ada575f5f611ab08989858a612133565b9092509050611abf86836121d9565b9550611acb85826121d9565b94508260010192505050611a9b565b5050935093915050565b5f5f5f8360020b12611af9578260020b611b00565b8260020b5f035b9050620d89e8811115611b26576040516333a3bdff60e21b815260040160405180910390fd5b5f816001165f03611b3b57600160801b611b4d565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611b81576ffff97272373d413259a46990580e213a0260801c5b6004821615611ba0576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611bbf576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611bde576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611bfd576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615611c1c576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611c3b576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611c5b576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611c7b576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611c9b576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611cbb576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611cdb576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611cfb576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611d1b576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611d3b576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611d5c576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611d7c576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611d9b576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611db8576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315611dd757805f1981611dd357611dd3613193565b0490505b640100000000810615611deb576001611ded565b5f5b60ff16602082901c0192505050919050565b5f6001600160801b036001600160a01b0383161015611e5a575f611e3f611e3a611e288661225f565b6002866001600160a01b03160a61226f565b6122cd565b90505f8412611e4e5780611e52565b805f035b91505061193a565b5f611e3f611e3a611e6a8661225f565b611e7d6001600160a01b038716806122f6565b612354565b5f6001600160801b036001600160a01b0383161015611ec2575f611e3f611e3a611eab8661225f565b600160c01b6002876001600160a01b03160a6123b2565b5f611e3f611e3a611ed28661225f565b600160801b611eea6001600160a01b038816806122f6565b6123b2565b5f818313611efd57816119f3565b5090919050565b5f80611f30611f188585603002604c011c90565b611f22868661197a565b603087901c61ffff1661245c565b909590945092505050565b5f60806041603084020184901c611989565b5f60026040603084020184901c611989565b5f5f611f6a85611ae4565b90505f611f7685611ae4565b90505f611faa85611f99846001600160a01b0316866001600160a01b031661247a565b8585036001600160a01b03166123b2565b90506001600160801b03811115611fd45760405163528073f560e11b815260040160405180910390fd5b6001600160801b03811660d087901b62ffffff60d01b1660e889901b6001600160e81b03191601015b979650505050505050565b5f5f61201385611ae4565b90505f61201f85611ae4565b90505f611faa85600160601b8585036001600160a01b03166123b2565b5f5f61205061204b8460e81c90565b611ae4565b90505f61206061204b8560d01c90565b90506001600160a01b0382166120986060866001600160801b0316901b8484036001600160a01b0316846001600160a01b03166123b2565b816120a5576120a5613193565b04949350505050565b5f5f6120bd61204b8460e81c90565b90505f6120cd61204b8560d01c90565b90506120ed846001600160801b03168383036001600160a01b031661247a565b949350505050565b5f6119f36001600160e81b0384168360e81b6001600160e81b0319160190565b5f6119f362ffffff60d01b1984168360d01b62ffffff60d01b160190565b5f5f5f612142878787876124d8565b90505f61214f8887611a79565b15905061215c88876125ab565b5f0361219f57801561218c57612185612179836125bd565b6125bd565b6001600160801b031690565b92506121ce565b612198612179836125bd565b93506121ce565b80156121bb576121856121b56121748460801c90565b60801b90565b6121cb6121b56121748460801c90565b93505b505094509492505050565b5f5f6121e58360801d90565b600f0b6121f28560801d90565b600f0b019050805f84600f0b86600f0b0190505f8190508383600f0b14158061221e57508181600f0b14155b1561223c57604051633486405d60e21b815260040160405180910390fd5b608083901b6001600160801b03828701166001600160801b031987160101611ffd565b5f5f821361193857815f0361193a565b5f80805f19848609848602925082811083820303915050805f03612298575060c01c905061193a565b80600160c01b116122a7575f5ffd5b5f600160c01b85870980840360c01c9310909103600160401b0291909117949350505050565b5f6001600160ff1b038211156119385760405163b668004560e01b815260040160405180910390fd5b5f80805f19848609848602925082811083820303915050805f0361231f575060401c905061193a565b80600160401b1161232e575f5ffd5b5f600160401b85870980840360401c9310909103600160c01b0291909117949350505050565b5f80805f19848609848602925082811083820303915050805f0361237d575060801c905061193a565b80600160801b1161238c575f5ffd5b5f600160801b85870980840360801c9310909103600160801b0291909117949350505050565b5f80805f19858709858702925082811083820303915050805f036123e6575f84116123db575f5ffd5b5082900490506119f3565b8084116123f1575f5ffd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f5f5f5f61246a86866125e8565b9088039897019695505050505050565b5f80805f19848609848602925082811083820303915050805f036124a3575060601c905061193a565b80600160601b116124b2575f5ffd5b5f600160601b85870980840360601c9310909103600160a01b0291909117949350505050565b5f8080806124e6888761197a565b60020b1515905080612501576002606460308802011b880197505b5f61250d89888a611991565b90506125198988611a79565b1580156125235750855b8061253f57506125338988611a79565b1580159061253f575085155b80612548575081155b15612568576125568161262a565b93506125618161268b565b925061257f565b6125718161203c565b935061257c816120ae565b92505b61259e6001600160801b0385168460801b6001600160801b0319160190565b9998505050505050505050565b5f60026049603084020184901c611989565b805f600f82900b12156125e35760405163b668004560e01b815260040160405180910390fd5b919050565b5f8060026125f684866131a7565b61260091906131c6565b61261f61260d858761320a565b62ffffff166002808204910615150190565b915091509250929050565b5f5f61263961204b8460e81c90565b90505f61264961204b8560d01c90565b90506120ed61267a6060866001600160801b0316901b8484036001600160a01b0316846001600160a01b03166126ca565b6001846001600160a01b03166126ca565b5f5f61269a61204b8460e81c90565b90505f6126aa61204b8560d01c90565b90506120ed846001600160801b03168383036001600160a01b0316612706565b5f6126d68484846123b2565b90505f82806126e7576126e7613193565b84860911156119f3575f1981106126fc575f5ffd5b6001019392505050565b5f612711838361247a565b90505f600160601b838509111561193a575f19811061272e575f5ffd5b60010192915050565b6001600160a01b03811681146118a4575f5ffd5b5f6020828403121561275b575f5ffd5b81356119f381612737565b5f5f60408385031215612777575f5ffd5b823561278281612737565b946020939093013593505050565b5f5f83601f8401126127a0575f5ffd5b5081356001600160401b038111156127b6575f5ffd5b6020830191508360208260051b8501011115611a72575f5ffd5b5f5f5f5f5f606086880312156127e4575f5ffd5b85356127ef81612737565b945060208601356001600160401b03811115612809575f5ffd5b8601601f81018813612819575f5ffd5b80356001600160401b0381111561282e575f5ffd5b8860208260071b8401011115612842575f5ffd5b6020919091019450925060408601356001600160401b03811115612864575f5ffd5b61287088828901612790565b969995985093965092949392505050565b5f5f5f5f60608587031215612894575f5ffd5b843561289f81612737565b935060208501356128af81612737565b925060408501356001600160401b038111156128c9575f5ffd5b8501601f810187136128d9575f5ffd5b80356001600160401b038111156128ee575f5ffd5b8760208284010111156128ff575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612931575f5ffd5b81516119f381612737565b8060020b81146118a4575f5ffd5b602080825281018290525f8360408301825b858110156129da57823561296f81612737565b6001600160a01b03168252602083013561298881612737565b6001600160a01b0316602083015260408301356129a481612737565b6001600160a01b0316604083015260608301356129c08161293c565b60020b60608301526080928301929091019060010161295c565b5095945050505050565b602080825281018290525f8360408301825b858110156129da578235612a0981612737565b6001600160a01b03168252602092830192909101906001016129f6565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b0381118282101715612a5c57612a5c612a26565b60405290565b604051606081016001600160401b0381118282101715612a5c57612a5c612a26565b604051601f8201601f191681016001600160401b0381118282101715612aac57612aac612a26565b604052919050565b5f6001600160401b03821115612acc57612acc612a26565b5060051b60200190565b5f82601f830112612ae5575f5ffd5b8135612af8612af382612ab4565b612a84565b8082825260208201915060208360071b860101925085831115612b19575f5ffd5b602085015b838110156129da5760808188031215612b35575f5ffd5b612b3d612a3a565b8135612b4881612737565b81526020820135612b5881612737565b60208201526040820135612b6b81612737565b60408201526060820135612b7e8161293c565b60608201528352602090920191608001612b1e565b5f82601f830112612ba2575f5ffd5b8135612bb0612af382612ab4565b8082825260208201915060208360051b860101925085831115612bd1575f5ffd5b602085015b838110156129da5780356001600160401b03811115612bf3575f5ffd5b8601603f81018813612c03575f5ffd5b6020810135612c14612af382612ab4565b808282526020820191506020808460051b8601010192508a831115612c37575f5ffd5b6040840193505b82841015612c59578335825260209384019390910190612c3e565b86525050602093840193919091019050612bd6565b5f82601f830112612c7d575f5ffd5b8135612c8b612af382612ab4565b8082825260208201915060208360051b860101925085831115612cac575f5ffd5b602085015b838110156129da578035612cc481612737565b835260209283019201612cb1565b5f5f5f5f60808587031215612ce5575f5ffd5b84356001600160401b03811115612cfa575f5ffd5b8501601f81018713612d0a575f5ffd5b8035612d18612af382612ab4565b80828252602082019150602060608402850101925089831115612d39575f5ffd5b6020840193505b82841015612da6576060848b031215612d57575f5ffd5b612d5f612a62565b8435612d6a8161293c565b81526020850135612d7a8161293c565b60208201526040850135612d8d8161293c565b6040820152825260609390930192602090910190612d40565b965050505060208501356001600160401b03811115612dc3575f5ffd5b612dcf87828801612ad6565b93505060408501356001600160401b03811115612dea575f5ffd5b612df687828801612b93565b92505060608501356001600160401b03811115612e11575f5ffd5b612e1d87828801612c6e565b91505092959194509250565b602080825282518282018190525f918401906040840190835b81811015612e9957835180516001600160a01b0390811685526020808301518216818701526040808401519092169186019190915260609182015160020b9185019190915290930192608090920191600101612e42565b509095945050505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761193a5761193a612ea4565b5f60208284031215612edf575f5ffd5b81516119f38161293c565b600282810b9082900b03627fffff198112627fffff8213171561193a5761193a612ea4565b6001600160a01b038416815282151560208083019190915260606040830181905283519083018190525f918401906080840190835b81811015612f62578351835260209384019390920191600101612f44565b5090979650505050505050565b5f82601f830112612f7e575f5ffd5b8151612f8c612af382612ab4565b8082825260208201915060208360051b860101925085831115612fad575f5ffd5b602085015b838110156129da578051835260209283019201612fb2565b5f5f5f5f5f60a08688031215612fde575f5ffd5b85516020870151604088015191965094506001600160401b03811115613002575f5ffd5b8601601f81018813613012575f5ffd5b8051613020612af382612ab4565b8082825260208201915060208360051b85010192508a831115613041575f5ffd5b6020840193505b82841015613063578351825260209384019390910190613048565b8096505050505060608601516001600160401b03811115613082575f5ffd5b61308e88828901612f6f565b92505060808601516001600160401b038111156130a9575f5ffd5b6130b588828901612f6f565b9150509295509295909350565b8181035f8312801583831316838312821617156130e1576130e1612ea4565b5092915050565b8082018281125f83128015821682158216171561310757613107612ea4565b505092915050565b8082018082111561193a5761193a612ea4565b5f60208284031215613132575f5ffd5b5051919050565b602080825282518282018190525f918401906040840190835b81811015612e995783516001600160a01b0316835260209384019390920191600101613152565b5f600160ff1b820161318d5761318d612ea4565b505f0390565b634e487b7160e01b5f52601260045260245ffd5b5f8260020b8260020b028060020b91508082146130e1576130e1612ea4565b5f8160020b8360020b806131e857634e487b7160e01b5f52601260045260245ffd5b627fffff1982145f198214161561320157613201612ea4565b90059392505050565b62ffffff81811683821602908116908181146130e1576130e1612ea456";
|
|
19321
|
-
|
|
19322
|
-
|
|
19323
|
-
|
|
19324
|
-
|
|
19325
|
-
|
|
19326
|
-
|
|
19327
|
-
|
|
19328
|
-
|
|
19329
|
-
|
|
19330
|
-
function
|
|
19331
|
-
return
|
|
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
|
|
19334
|
-
|
|
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
|
|
19337
|
-
const
|
|
19338
|
-
|
|
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
|
|
19593
|
-
|
|
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
|
-
|
|
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
|