Fix & Optimize contract

This commit is contained in:
2025-12-23 14:05:41 +08:00
parent b927acf3b7
commit d2e9377f78
117 changed files with 745 additions and 191 deletions

View File

@@ -2,14 +2,15 @@
pragma solidity ^0.8.0;
import "forge-std/Test.sol";
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import "../contracts/ytLp/tokens/USDY.sol";
import "../contracts/ytLp/tokens/YTLPToken.sol";
import "../contracts/ytLp/core/YTPriceFeed.sol";
import "../contracts/ytLp/core/YTVault.sol";
import "../contracts/ytLp/core/YTPoolManager.sol";
import "../contracts/ytLp/core/YTRewardRouter.sol";
import "../contracts/vault/YTAssetVault.sol";
import "../contracts/vault/YTAssetFactory.sol";
import "../contracts/ytVault/YTAssetVault.sol";
import "../contracts/ytVault/YTAssetFactory.sol";
import "../contracts/ytLp/tokens/WUSD.sol";
contract YTLpTest is Test {
@@ -44,49 +45,83 @@ contract YTLpTest is Test {
vm.deal(user2, 100 ether);
vm.deal(user3, 100 ether);
// 部署WUSD
wusd = new WUSD();
wusd.initialize("Wrapped USD", "WUSD");
// ✅ 使用代理模式部署 WUSD
WUSD wusdImpl = new WUSD();
bytes memory wusdInitData = abi.encodeWithSelector(
WUSD.initialize.selector,
"Wrapped USD",
"WUSD"
);
ERC1967Proxy wusdProxy = new ERC1967Proxy(address(wusdImpl), wusdInitData);
wusd = WUSD(address(wusdProxy));
// 部署代币(可升级合约)
usdy = new USDY();
usdy.initialize();
// ✅ 使用代理模式部署 USDY
USDY usdyImpl = new USDY();
bytes memory usdyInitData = abi.encodeWithSelector(USDY.initialize.selector);
ERC1967Proxy usdyProxy = new ERC1967Proxy(address(usdyImpl), usdyInitData);
usdy = USDY(address(usdyProxy));
ytlp = new YTLPToken();
ytlp.initialize();
// ✅ 使用代理模式部署 YTLPToken
YTLPToken ytlpImpl = new YTLPToken();
bytes memory ytlpInitData = abi.encodeWithSelector(YTLPToken.initialize.selector);
ERC1967Proxy ytlpProxy = new ERC1967Proxy(address(ytlpImpl), ytlpInitData);
ytlp = YTLPToken(address(ytlpProxy));
// 部署核心合约(可升级合约)
priceFeed = new YTPriceFeed();
priceFeed.initialize(address(wusd));
// ✅ 使用代理模式部署 YTPriceFeed
YTPriceFeed priceFeedImpl = new YTPriceFeed();
bytes memory priceFeedInitData = abi.encodeWithSelector(
YTPriceFeed.initialize.selector,
address(wusd)
);
ERC1967Proxy priceFeedProxy = new ERC1967Proxy(address(priceFeedImpl), priceFeedInitData);
priceFeed = YTPriceFeed(address(priceFeedProxy));
vault = new YTVault();
vault.initialize(address(usdy), address(priceFeed));
// ✅ 使用代理模式部署 YTVault
YTVault vaultImpl = new YTVault();
bytes memory vaultInitData = abi.encodeWithSelector(
YTVault.initialize.selector,
address(usdy),
address(priceFeed)
);
ERC1967Proxy vaultProxy = new ERC1967Proxy(address(vaultImpl), vaultInitData);
vault = YTVault(address(vaultProxy));
poolManager = new YTPoolManager();
poolManager.initialize(
// ✅ 使用代理模式部署 YTPoolManager
YTPoolManager poolManagerImpl = new YTPoolManager();
bytes memory poolManagerInitData = abi.encodeWithSelector(
YTPoolManager.initialize.selector,
address(vault),
address(usdy),
address(ytlp),
15 * 60
);
ERC1967Proxy poolManagerProxy = new ERC1967Proxy(address(poolManagerImpl), poolManagerInitData);
poolManager = YTPoolManager(address(poolManagerProxy));
router = new YTRewardRouter();
router.initialize(
// ✅ 使用代理模式部署 YTRewardRouter
YTRewardRouter routerImpl = new YTRewardRouter();
bytes memory routerInitData = abi.encodeWithSelector(
YTRewardRouter.initialize.selector,
address(usdy),
address(ytlp),
address(poolManager),
address(vault)
);
ERC1967Proxy routerProxy = new ERC1967Proxy(address(routerImpl), routerInitData);
router = YTRewardRouter(address(routerProxy));
// 部署YTAssetVault实现合约
YTAssetVault vaultImpl = new YTAssetVault();
// 部署YTAssetVault实现合约(不初始化)
YTAssetVault ytVaultImpl = new YTAssetVault();
// 部署YTAssetFactory
factory = new YTAssetFactory();
factory.initialize(
address(vaultImpl),
// ✅ 使用代理模式部署 YTAssetFactory
YTAssetFactory factoryImpl = new YTAssetFactory();
bytes memory factoryInitData = abi.encodeWithSelector(
YTAssetFactory.initialize.selector,
address(ytVaultImpl),
1000000 ether // defaultHardCap
);
ERC1967Proxy factoryProxy = new ERC1967Proxy(address(factoryImpl), factoryInitData);
factory = YTAssetFactory(address(factoryProxy));
// 通过factory创建YTAssetVault代币
address ytTokenAAddr = factory.createVault(
@@ -631,7 +666,7 @@ contract YTLpTest is Test {
assertEq(ytlp.balanceOf(user1), ytLPBefore, "ytLP balance should not change");
}
function test_23_GetSwapFeeBasisPoints() public {
function test_23_GetSwapFeeBasisPoints() public view {
uint256 usdyAmount = 1000 ether;
// YT代币之间互换
@@ -778,7 +813,7 @@ contract YTLpTest is Test {
// ==================== 12. 动态手续费测试 ====================
function test_30_DynamicFeesDisabled() public {
function test_30_DynamicFeesDisabled() public view {
assertFalse(vault.hasDynamicFees());
uint256 feeBps = vault.getFeeBasisPoints(
@@ -1196,7 +1231,7 @@ contract YTLpTest is Test {
function test_51_GetPriceInfo() public view {
(
uint256 currentPrice,
uint256 cachedPrice,
,
uint256 maxPrice,
uint256 minPrice,
uint256 spread

View File

@@ -2,8 +2,8 @@
pragma solidity ^0.8.0;
import "forge-std/Test.sol";
import "../contracts/vault/YTAssetVault.sol";
import "../contracts/vault/YTAssetFactory.sol";
import "../contracts/ytVault/YTAssetVault.sol";
import "../contracts/ytVault/YTAssetFactory.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
@@ -100,7 +100,7 @@ contract VaultTest is Test {
return YTAssetVault(vaultAddr);
}
function test_01_FactoryInitialization() public {
function test_01_FactoryInitialization() public view {
assertEq(factory.vaultImplementation(), address(vaultImplementation));
assertEq(factory.defaultHardCap(), HARD_CAP);
assertEq(factory.owner(), owner);