Skip to content

Commit 1cd6140

Browse files
authored
add Pendle PT 24Sep25 tests (#121)
1 parent b799d96 commit 1cd6140

File tree

3 files changed

+1157
-0
lines changed

3 files changed

+1157
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.13;
3+
4+
import "forge-std/Test.sol";
5+
import "./MarketBaseForkTest.sol";
6+
import {USDeNavBeforeMaturityFeed} from "src/feeds/USDeNavBeforeMaturityFeed.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 PendlePTsUSDe24Sep25MarketForkTest is MarketBaseForkTest {
12+
address USDeFeed = address(0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961);
13+
address sUSDeFeed = address(0xFF3BC18cCBd5999CE63E788A1c250a88626aD099);
14+
address sUSDe = address(0x9D39A5DE30e57443BfF2A8307A4256c8797A3497);
15+
address pendlePT = address(0x9F56094C450763769BA0EA9Fe2876070c0fD5F77); // PT sUSDe 24 Sep 25
16+
address pendlePTHolder =
17+
address(0x5c14F9573697176b1cBd8af8378Cff9583DE4166);
18+
19+
ChainlinkBasePriceFeed sUSDeWrappedFeed;
20+
USDeNavBeforeMaturityFeed beforeMaturityFeed;
21+
ChainlinkBasePriceFeed afterMaturityFeed;
22+
address navFeed;
23+
24+
uint256 baseDiscount = 0.2 ether; // 20%
25+
FeedSwitch feedSwitch;
26+
27+
address feedAddr; //FeedSwitch
28+
address marketAddr;
29+
30+
function setUp() public virtual {
31+
//This will fail if there's no mainnet variable in foundry.toml
32+
string memory url = vm.rpcUrl("mainnet");
33+
vm.createSelectFork(url,22590519);
34+
35+
feedAddr = _deployFeed();
36+
37+
marketAddr = address(
38+
new Market(
39+
gov,
40+
lender,
41+
pauseGuardian,
42+
simpleERC20EscrowAddr,
43+
IDolaBorrowingRights(dbrAddr),
44+
IERC20(pendlePT),
45+
IOracle(oracleAddr),
46+
9150,
47+
5000,
48+
500,
49+
false
50+
)
51+
);
52+
_advancedInit(marketAddr, feedAddr, false);
53+
}
54+
55+
function _deployFeed() internal returns (address feed) {
56+
sUSDeWrappedFeed = new ChainlinkBasePriceFeed(
57+
gov,
58+
sUSDeFeed,
59+
address(0),
60+
24 hours
61+
);
62+
navFeed = address(new PendleNAVFeed(pendlePT, baseDiscount));
63+
beforeMaturityFeed = new USDeNavBeforeMaturityFeed(
64+
address(sUSDeWrappedFeed),
65+
address(sUSDe),
66+
address(navFeed)
67+
);
68+
afterMaturityFeed = new ChainlinkBasePriceFeed(
69+
gov,
70+
USDeFeed,
71+
address(0),
72+
24 hours
73+
);
74+
75+
feedSwitch = new FeedSwitch(
76+
address(navFeed),
77+
address(beforeMaturityFeed),
78+
address(afterMaturityFeed),
79+
18 hours,
80+
pendlePT,
81+
pauseGuardian
82+
);
83+
return address(feedSwitch);
84+
}
85+
86+
// Override the function to use the PendlePTHolder to avoid error revert: stdStorage find(StdStorage): Slot(s) not found
87+
function gibCollateral(
88+
address _address,
89+
uint _amount
90+
) internal virtual override {
91+
vm.prank(pendlePTHolder);
92+
IERC20(pendlePT).transfer(_address, _amount);
93+
}
94+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.18;
3+
4+
import {FeedSwitch, IChainlinkFeed} from "src/util/FeedSwitch.sol";
5+
import {BaseFeedSwitchNavForkTest} from "test/util/BaseFeedSwitchNavFork.t.sol";
6+
import {USDeNavBeforeMaturityFeed} from "src/feeds/USDeNavBeforeMaturityFeed.sol";
7+
import {PendleNAVFeed} from "src/feeds/PendleNAVFeed.sol";
8+
9+
contract FeedSwitchNavSUSDe24Sep25Test is BaseFeedSwitchNavForkTest {
10+
address _beforeMaturityFeed;
11+
address _afterMaturityFeed = address(0xB3C1D801A02d88adC96A294123c2Daa382345058); // USDe Chainlink Wrapper
12+
address _pendlePT = address(0x9F56094C450763769BA0EA9Fe2876070c0fD5F77); // PT sUSDe 24 Sep 25
13+
uint256 _baseDiscount = 0.2 ether; // 20%
14+
address sUSDeWrapper = address(0xD723a0910e261de49A90779d38A94aFaAA028F15);
15+
address sUSDe = address(0x9D39A5DE30e57443BfF2A8307A4256c8797A3497);
16+
17+
function setUp() public {
18+
string memory url = vm.rpcUrl("mainnet");
19+
vm.createSelectFork(url, 22590519);
20+
21+
PendleNAVFeed _navFeed = new PendleNAVFeed(_pendlePT, _baseDiscount);
22+
_beforeMaturityFeed = address(new USDeNavBeforeMaturityFeed(sUSDeWrapper,sUSDe,address(_navFeed))); // USDeBeforeMaturityFeed: USDe/USD Feed using sUSDe Chainlink feed and sUSDe/USDe rate and NAV
23+
24+
initialize(address(_beforeMaturityFeed), address(_afterMaturityFeed), _pendlePT , _baseDiscount, address(_navFeed));
25+
}
26+
}

0 commit comments

Comments
 (0)