Skip to content

Commit b799d96

Browse files
0xtj2408xmt
andauthored
Feat: sUSDe PT July 25 (#120)
* add market, feed and ALE test for sUSDe July PT * Reduce min ratio to 0 --------- Co-authored-by: 08xmt <markus.08xmt@gmail.com>
1 parent 59dd4cd commit b799d96

4 files changed

Lines changed: 1161 additions & 0 deletions

File tree

test/feedForkTests/CvxCrvFeedFork.t.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ contract CvxCrvFeedFork is Test {
2626
string memory url = vm.rpcUrl("mainnet");
2727
vm.createSelectFork(url);
2828
feed = new ConvexCurvePriceFeed();
29+
vm.prank(feed.gov());
30+
feed.setMinCrvPerCvxCrvRatio(0);
2931
}
3032

3133
function testNominalCase() public {
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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 PendlePTsUSDe31July25MarketForkTest is MarketBaseForkTest {
12+
address USDeFeed = address(0xa569d910839Ae8865Da8F8e70FfFb0cBA869F961);
13+
address sUSDeFeed = address(0xFF3BC18cCBd5999CE63E788A1c250a88626aD099);
14+
address sUSDe = address(0x9D39A5DE30e57443BfF2A8307A4256c8797A3497);
15+
address pendlePT = address(0x3b3fB9C57858EF816833dC91565EFcd85D96f634); // PT sUSDe 31 July 25
16+
address pendlePTHolder =
17+
address(0x520A816aA9E220a24590862bed50E91047349142);
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,22582482);
34+
35+
36+
address marketAddr = address(
37+
new Market(
38+
gov,
39+
lender,
40+
pauseGuardian,
41+
simpleERC20EscrowAddr,
42+
IDolaBorrowingRights(dbrAddr),
43+
IERC20(pendlePT),
44+
IOracle(oracleAddr),
45+
9150,
46+
5000,
47+
500,
48+
false
49+
)
50+
);
51+
52+
address feedAddr = _deployFeed();
53+
54+
_advancedInit(marketAddr, feedAddr, false);
55+
}
56+
57+
function _deployFeed() internal returns (address feed) {
58+
sUSDeWrappedFeed = new ChainlinkBasePriceFeed(
59+
gov,
60+
sUSDeFeed,
61+
address(0),
62+
24 hours
63+
);
64+
navFeed = address(new PendleNAVFeed(pendlePT, baseDiscount));
65+
beforeMaturityFeed = new USDeNavBeforeMaturityFeed(
66+
address(sUSDeWrappedFeed),
67+
address(sUSDe),
68+
navFeed
69+
);
70+
71+
afterMaturityFeed = new ChainlinkBasePriceFeed(
72+
gov,
73+
USDeFeed,
74+
address(0),
75+
24 hours
76+
);
77+
78+
feedSwitch = new FeedSwitch(
79+
address(navFeed),
80+
address(beforeMaturityFeed),
81+
address(afterMaturityFeed),
82+
18 hours,
83+
pendlePT,
84+
pauseGuardian
85+
);
86+
return address(feedSwitch);
87+
}
88+
89+
// Override the function to use the PendlePTHolder to avoid error revert: stdStorage find(StdStorage): Slot(s) not found
90+
function gibCollateral(
91+
address _address,
92+
uint _amount
93+
) internal virtual override {
94+
vm.prank(pendlePTHolder);
95+
IERC20(pendlePT).transfer(_address, _amount);
96+
}
97+
}
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 FeedSwitchNavSUSDe31July25Test is BaseFeedSwitchNavForkTest {
10+
address _beforeMaturityFeed;
11+
address _afterMaturityFeed = address(0xB3C1D801A02d88adC96A294123c2Daa382345058); // USDe Chainlink Wrapper
12+
address _pendlePT = address(0x3b3fB9C57858EF816833dC91565EFcd85D96f634); // PT sUSDe 31 July 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, 22582482);
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)