1+ // SPDX-License-Identifier: UNLICENSED
2+ pragma solidity ^ 0.8.13 ;
3+
4+ import "forge-std/Test.sol " ;
5+ import "./MarketBaseForkTest.sol " ;
6+ import {NavBeforeMaturityFeed} from "src/feeds/NavBeforeMaturityFeed.sol " ;
7+ import {ChainlinkBasePriceFeed} from "src/feeds/ChainlinkBasePriceFeed.sol " ;
8+ import {FeedSwitch} from "src/util/FeedSwitch.sol " ;
9+ import {PendleNAVFeed} from "src/feeds/PendleNAVFeed.sol " ;
10+
11+ contract PendlePTUSDe27Nov25MarketForkTest is MarketBaseForkTest {
12+ address pendlePT = address (0x62C6E813b9589C3631Ba0Cdb013acdB8544038B7 ); // PT USDe 27 Nov 25
13+ address pendlePTHolder =
14+ address (0xAc5CE72d29836f41d235F643F6f0190E8c12db8A );
15+
16+ ChainlinkBasePriceFeed usdeWrappedFeed = ChainlinkBasePriceFeed (0xB3C1D801A02d88adC96A294123c2Daa382345058 ); // USDe/USD wrapped
17+ NavBeforeMaturityFeed beforeMaturityFeed;
18+ ChainlinkBasePriceFeed afterMaturityFeed = ChainlinkBasePriceFeed (0xB3C1D801A02d88adC96A294123c2Daa382345058 );
19+ address navFeed;
20+
21+ uint256 baseDiscount = 0.20 ether ; // 20%
22+ FeedSwitch feedSwitch;
23+
24+ address feedAddr; //FeedSwitch
25+ address marketAddr;
26+
27+ function setUp () public virtual {
28+ //This will fail if there's no mainnet variable in foundry.toml
29+ string memory url = vm.rpcUrl ("mainnet " );
30+ vm.createSelectFork (url, 23225429 );
31+
32+ feedAddr = _deployFeed ();
33+
34+ marketAddr = address (
35+ new Market (
36+ gov,
37+ lender,
38+ pauseGuardian,
39+ simpleERC20EscrowAddr,
40+ IDolaBorrowingRights (dbrAddr),
41+ IERC20 (pendlePT),
42+ IOracle (oracleAddr),
43+ 9150 ,
44+ 5000 ,
45+ 500 ,
46+ false
47+ )
48+ );
49+ _advancedInit (marketAddr, feedAddr, false );
50+ }
51+
52+ function _deployFeed () internal returns (address feed ) {
53+ navFeed = address (new PendleNAVFeed (pendlePT, baseDiscount));
54+ beforeMaturityFeed = new NavBeforeMaturityFeed (
55+ address (usdeWrappedFeed),
56+ address (navFeed)
57+ );
58+
59+ feedSwitch = new FeedSwitch (
60+ address (navFeed),
61+ address (beforeMaturityFeed),
62+ address (afterMaturityFeed),
63+ 18 hours,
64+ pendlePT,
65+ pauseGuardian
66+ );
67+ return address (feedSwitch);
68+ }
69+
70+ // Override the function to use the PendlePTHolder to avoid error revert: stdStorage find(StdStorage): Slot(s) not found
71+ function gibCollateral (
72+ address _address ,
73+ uint _amount
74+ ) internal virtual override {
75+ vm.prank (pendlePTHolder);
76+ IERC20 (pendlePT).transfer (_address, _amount);
77+ }
78+ }
0 commit comments