fix contract

This commit is contained in:
2026-01-12 14:33:16 +08:00
parent a18b9a42e4
commit d56f83726b
70 changed files with 1988 additions and 142 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -43,6 +43,25 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "bool",
"name": "_maximise",
"type": "bool"
}
],
"name": "getAumInUsdy",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {
@@ -62,6 +81,24 @@
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
}
],
"name": "onLPTransfer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {

View File

@@ -83,6 +83,11 @@
"name": "OwnableUnauthorizedAccount", "name": "OwnableUnauthorizedAccount",
"type": "error" "type": "error"
}, },
{
"inputs": [],
"name": "StalePrice",
"type": "error"
},
{ {
"inputs": [], "inputs": [],
"name": "UUPSUnauthorizedCallContext", "name": "UUPSUnauthorizedCallContext",
@@ -207,6 +212,19 @@
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{
"inputs": [],
"name": "priceStalenesThreshold",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "proxiableUUID", "name": "proxiableUUID",
@@ -227,6 +245,19 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "uint256",
"name": "_threshold",
"type": "uint256"
}
],
"name": "setPriceStalenessThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {

View File

@@ -677,6 +677,24 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "address",
"name": "_vault",
"type": "address"
},
{
"internalType": "uint256",
"name": "_threshold",
"type": "uint256"
}
],
"name": "setPriceStalenessThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {

View File

@@ -218,6 +218,11 @@
"name": "SafeERC20FailedOperation", "name": "SafeERC20FailedOperation",
"type": "error" "type": "error"
}, },
{
"inputs": [],
"name": "StalePrice",
"type": "error"
},
{ {
"inputs": [], "inputs": [],
"name": "StillInLockPeriod", "name": "StillInLockPeriod",
@@ -1166,6 +1171,19 @@
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{
"inputs": [],
"name": "priceStalenesThreshold",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {
@@ -1268,6 +1286,19 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "uint256",
"name": "_threshold",
"type": "uint256"
}
],
"name": "setPriceStalenessThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "symbol", "name": "symbol",

View File

@@ -132,6 +132,11 @@
"name": "InvalidMinter", "name": "InvalidMinter",
"type": "error" "type": "error"
}, },
{
"inputs": [],
"name": "InvalidPoolManager",
"type": "error"
},
{ {
"inputs": [], "inputs": [],
"name": "NotInitializing", "name": "NotInitializing",
@@ -475,6 +480,19 @@
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{
"inputs": [],
"name": "poolManager",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "proxiableUUID", "name": "proxiableUUID",
@@ -513,6 +531,19 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "address",
"name": "_poolManager",
"type": "address"
}
],
"name": "setPoolManager",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "symbol", "name": "symbol",

View File

@@ -194,6 +194,31 @@
"name": "CooldownDurationSet", "name": "CooldownDurationSet",
"type": "event" "type": "event"
}, },
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "cooldownTime",
"type": "uint256"
}
],
"name": "CooldownInherited",
"type": "event"
},
{ {
"anonymous": false, "anonymous": false,
"inputs": [ "inputs": [
@@ -572,6 +597,24 @@
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
}
],
"name": "onLPTransfer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "proxiableUUID", "name": "proxiableUUID",

View File

@@ -76,6 +76,11 @@
"name": "SpreadTooHigh", "name": "SpreadTooHigh",
"type": "error" "type": "error"
}, },
{
"inputs": [],
"name": "StalePrice",
"type": "error"
},
{ {
"inputs": [], "inputs": [],
"name": "UUPSUnauthorizedCallContext", "name": "UUPSUnauthorizedCallContext",
@@ -440,6 +445,19 @@
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{
"inputs": [],
"name": "priceStalenesThreshold",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "proxiableUUID", "name": "proxiableUUID",
@@ -484,6 +502,19 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [
{
"internalType": "uint256",
"name": "_threshold",
"type": "uint256"
}
],
"name": "setPriceStalenessThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{ {
"inputs": [ "inputs": [
{ {

File diff suppressed because one or more lines are too long

View File

@@ -20,5 +20,7 @@ interface IYTPoolManager {
) external returns (uint256); ) external returns (uint256);
function getPrice(bool _maximise) external view returns (uint256); function getPrice(bool _maximise) external view returns (uint256);
function getAumInUsdy(bool _maximise) external view returns (uint256);
function onLPTransfer(address _from, address _to) external;
} }

View File

@@ -543,8 +543,9 @@ contract Lending is
function getBalance(address account) external view override returns (int256) { function getBalance(address account) external view override returns (int256) {
int104 principal = userBasic[account].principal; int104 principal = userBasic[account].principal;
// 使用 supplyIndex 计算实际余额(含利息) // 根据余额正负使用对应的索引正余额用supplyIndex负余额用borrowIndex
return LendingMath.principalToBalance(principal, supplyIndex); uint256 index = principal >= 0 ? supplyIndex : borrowIndex;
return LendingMath.principalToBalance(principal, index);
} }
function supplyBalanceOf(address account) external view override returns (uint256) { function supplyBalanceOf(address account) external view override returns (uint256) {

View File

@@ -9,10 +9,14 @@ import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interf
contract LendingPriceFeed is OwnableUpgradeable, UUPSUpgradeable { contract LendingPriceFeed is OwnableUpgradeable, UUPSUpgradeable {
address public usdcAddress; address public usdcAddress;
AggregatorV3Interface internal usdcPriceFeed; AggregatorV3Interface internal usdcPriceFeed;
/// @notice 价格过期阈值(秒)
uint256 public priceStalenesThreshold;
error InvalidUsdcAddress(); error InvalidUsdcAddress();
error InvalidUsdcPriceFeedAddress(); error InvalidUsdcPriceFeedAddress();
error InvalidChainlinkPrice(); error InvalidChainlinkPrice();
error StalePrice();
/// @custom:oz-upgrades-unsafe-allow constructor /// @custom:oz-upgrades-unsafe-allow constructor
constructor() { constructor() {
@@ -26,6 +30,7 @@ contract LendingPriceFeed is OwnableUpgradeable, UUPSUpgradeable {
if (_usdcPriceFeed == address(0)) revert InvalidUsdcPriceFeedAddress(); if (_usdcPriceFeed == address(0)) revert InvalidUsdcPriceFeedAddress();
usdcAddress = _usdcAddress; usdcAddress = _usdcAddress;
usdcPriceFeed = AggregatorV3Interface(_usdcPriceFeed); usdcPriceFeed = AggregatorV3Interface(_usdcPriceFeed);
priceStalenesThreshold = 3600; // 默认1小时
} }
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
@@ -35,6 +40,15 @@ contract LendingPriceFeed is OwnableUpgradeable, UUPSUpgradeable {
usdcAddress = _usdcAddress; usdcAddress = _usdcAddress;
} }
/**
* @notice 设置价格过期阈值
* @param _threshold 阈值例如3600 = 1小时86400 = 24小时
*/
function setPriceStalenessThreshold(uint256 _threshold) external onlyOwner {
require(_threshold > 0 && _threshold <= 7 days, "Invalid threshold");
priceStalenesThreshold = _threshold;
}
function getPrice(address _token) external view returns (uint256) { function getPrice(address _token) external view returns (uint256) {
if (_token == usdcAddress) { if (_token == usdcAddress) {
return _getUSDCPrice(); return _getUSDCPrice();
@@ -44,15 +58,21 @@ contract LendingPriceFeed is OwnableUpgradeable, UUPSUpgradeable {
function _getUSDCPrice() internal view returns (uint256) { function _getUSDCPrice() internal view returns (uint256) {
( (
/* uint80 roundId */, uint80 roundId,
int256 price, int256 price,
/* uint256 startedAt */, /* uint256 startedAt */,
/* uint256 updatedAt */, uint256 updatedAt,
/* uint80 answeredInRound */ uint80 answeredInRound
) = usdcPriceFeed.latestRoundData(); ) = usdcPriceFeed.latestRoundData();
// 价格有效性检查
if (price <= 0) revert InvalidChainlinkPrice(); if (price <= 0) revert InvalidChainlinkPrice();
// 新鲜度检查:确保价格数据不过期
if (updatedAt == 0) revert StalePrice();
if (answeredInRound < roundId) revert StalePrice();
if (block.timestamp - updatedAt > priceStalenesThreshold) revert StalePrice();
return uint256(price) * 1e22; // 1e22 = 10^(30-8) return uint256(price) * 1e22; // 1e22 = 10^(30-8)
} }
} }

View File

@@ -71,6 +71,7 @@ contract YTPoolManager is Initializable, UUPSUpgradeable, ReentrancyGuardUpgrade
event HandlerSet(address indexed handler, bool isActive); event HandlerSet(address indexed handler, bool isActive);
event GovChanged(address indexed oldGov, address indexed newGov); event GovChanged(address indexed oldGov, address indexed newGov);
event AumAdjustmentChanged(uint256 addition, uint256 deduction); event AumAdjustmentChanged(uint256 addition, uint256 deduction);
event CooldownInherited(address indexed from, address indexed to, uint256 cooldownTime);
modifier onlyGov() { modifier onlyGov() {
if (msg.sender != gov) revert Forbidden(); if (msg.sender != gov) revert Forbidden();
@@ -138,6 +139,24 @@ contract YTPoolManager is Initializable, UUPSUpgradeable, ReentrancyGuardUpgrade
emit AumAdjustmentChanged(_addition, _deduction); emit AumAdjustmentChanged(_addition, _deduction);
} }
/**
* @notice LP 代币转账时的回调函数
* @param _from 发送方地址
* @param _to 接收方地址
* @dev 当 LP 代币转账时,接收方继承发送方的冷却时间,防止绕过冷却期
*/
function onLPTransfer(address _from, address _to) external {
// 只允许 ytLP 代币合约调用
if (msg.sender != ytLP) revert Forbidden();
// 如果发送方有冷却时间记录,且接收方的冷却时间更早(或没有记录)
// 则将发送方的冷却时间继承给接收方
if (lastAddedAt[_from] > 0 && lastAddedAt[_to] < lastAddedAt[_from]) {
lastAddedAt[_to] = lastAddedAt[_from];
emit CooldownInherited(_from, _to, lastAddedAt[_from]);
}
}
/** /**
* @notice 为指定账户添加流动性Handler调用 * @notice 为指定账户添加流动性Handler调用
*/ */

View File

@@ -24,6 +24,7 @@ contract YTPriceFeed is Initializable, UUPSUpgradeable {
error SpreadTooHigh(); error SpreadTooHigh();
error InvalidAddress(); error InvalidAddress();
error InvalidChainlinkPrice(); error InvalidChainlinkPrice();
error StalePrice();
address public gov; address public gov;
@@ -35,6 +36,7 @@ contract YTPriceFeed is Initializable, UUPSUpgradeable {
// 价格保护参数 // 价格保护参数
uint256 public maxPriceChangeBps; // 5% 最大价格变动 uint256 public maxPriceChangeBps; // 5% 最大价格变动
uint256 public priceStalenesThreshold; // 价格过期阈值(秒)
/// @notice USDC价格Feed /// @notice USDC价格Feed
AggregatorV3Interface internal usdcPriceFeed; AggregatorV3Interface internal usdcPriceFeed;
@@ -72,6 +74,7 @@ contract YTPriceFeed is Initializable, UUPSUpgradeable {
usdcPriceFeed = AggregatorV3Interface(_usdcPriceFeed); usdcPriceFeed = AggregatorV3Interface(_usdcPriceFeed);
gov = msg.sender; gov = msg.sender;
maxPriceChangeBps = 500; // 5% 最大价格变动 maxPriceChangeBps = 500; // 5% 最大价格变动
priceStalenesThreshold = 3600; // 默认1小时
} }
/** /**
@@ -116,6 +119,15 @@ contract YTPriceFeed is Initializable, UUPSUpgradeable {
maxPriceChangeBps = _maxPriceChangeBps; maxPriceChangeBps = _maxPriceChangeBps;
} }
/**
* @notice 设置价格过期阈值
* @param _threshold 阈值例如3600 = 1小时86400 = 24小时
*/
function setPriceStalenessThreshold(uint256 _threshold) external onlyGov {
require(_threshold > 0 && _threshold <= 7 days, "Invalid threshold");
priceStalenesThreshold = _threshold;
}
/** /**
* @notice 设置代币价差 * @notice 设置代币价差
* @param _token 代币地址 * @param _token 代币地址
@@ -220,15 +232,21 @@ contract YTPriceFeed is Initializable, UUPSUpgradeable {
*/ */
function _getUSDCPrice() internal view returns (uint256) { function _getUSDCPrice() internal view returns (uint256) {
( (
/* uint80 roundId */, uint80 roundId,
int256 price, int256 price,
/* uint256 startedAt */, /* uint256 startedAt */,
/* uint256 updatedAt */, uint256 updatedAt,
/* uint80 answeredInRound */ uint80 answeredInRound
) = usdcPriceFeed.latestRoundData(); ) = usdcPriceFeed.latestRoundData();
// 价格有效性检查
if (price <= 0) revert InvalidChainlinkPrice(); if (price <= 0) revert InvalidChainlinkPrice();
// 新鲜度检查:确保价格数据不过期
if (updatedAt == 0) revert StalePrice();
if (answeredInRound < roundId) revert StalePrice();
if (block.timestamp - updatedAt > priceStalenesThreshold) revert StalePrice();
return uint256(price) * 1e22; // 1e22 = 10^(30-8) return uint256(price) * 1e22; // 1e22 = 10^(30-8)
} }

View File

@@ -20,9 +20,12 @@ contract YTLPToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSU
error NotMinter(); error NotMinter();
error InvalidMinter(); error InvalidMinter();
error InvalidPoolManager();
mapping(address => bool) public isMinter; mapping(address => bool) public isMinter;
address public poolManager;
event MinterSet(address indexed minter, bool isActive); event MinterSet(address indexed minter, bool isActive);
/** /**
@@ -56,6 +59,16 @@ contract YTLPToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSU
emit MinterSet(_minter, _isActive); emit MinterSet(_minter, _isActive);
} }
/**
* @notice 设置 PoolManager 地址
* @param _poolManager PoolManager 合约地址
* @dev 用于在转账时通知 PoolManager 更新冷却时间
*/
function setPoolManager(address _poolManager) external onlyOwner {
if (_poolManager == address(0)) revert InvalidPoolManager();
poolManager = _poolManager;
}
/** /**
* @notice 铸造ytLP代币 * @notice 铸造ytLP代币
* @param _to 接收地址 * @param _to 接收地址
@@ -74,6 +87,22 @@ contract YTLPToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSU
_burn(_from, _amount); _burn(_from, _amount);
} }
/**
* @notice 重写 _update 函数,在转账时更新冷却时间
* @dev 当 LP 代币转账时,接收方继承发送方的冷却时间,防止绕过冷却期
*/
function _update(address from, address to, uint256 value) internal override {
super._update(from, to, value);
// 只在实际转账时触发(不包括 mint 和 burn
if (from != address(0) && to != address(0) && poolManager != address(0)) {
// 通知 PoolManager 更新接收方的冷却时间
(bool success, ) = poolManager.call(
abi.encodeWithSignature("onLPTransfer(address,address)", from, to)
);
}
}
/** /**
* @dev 预留存储空间,用于未来升级时添加新的状态变量 * @dev 预留存储空间,用于未来升级时添加新的状态变量
* 50个slot = 50 * 32 bytes = 1600 bytes * 50个slot = 50 * 32 bytes = 1600 bytes

View File

@@ -238,6 +238,17 @@ contract YTAssetFactory is Initializable, UUPSUpgradeable, OwnableUpgradeable {
YTAssetVault(_vault).setManager(_manager); YTAssetVault(_vault).setManager(_manager);
} }
/**
* @notice 设置vault的价格过期阈值
* @param _vault vault地址
* @param _threshold 阈值(秒)
*/
function setPriceStalenessThreshold(address _vault, uint256 _threshold) external onlyOwner {
if (!isVault[_vault]) revert VaultNotExists();
YTAssetVault(_vault).setPriceStalenessThreshold(_threshold);
}
/** /**
* @notice 设置vault的下一个赎回时间 * @notice 设置vault的下一个赎回时间
* @param _vault vault地址 * @param _vault vault地址

View File

@@ -43,6 +43,7 @@ contract YTAssetVault is
error InvalidBatchSize(); error InvalidBatchSize();
error InvalidPriceFeed(); error InvalidPriceFeed();
error InvalidChainlinkPrice(); error InvalidChainlinkPrice();
error StalePrice();
/// @notice 工厂合约地址 /// @notice 工厂合约地址
address public factory; address public factory;
@@ -71,6 +72,9 @@ contract YTAssetVault is
/// @notice Chainlink价格精度 /// @notice Chainlink价格精度
uint256 public constant CHAINLINK_PRICE_PRECISION = 1e8; uint256 public constant CHAINLINK_PRICE_PRECISION = 1e8;
/// @notice 价格过期阈值(秒)
uint256 public priceStalenesThreshold;
/// @notice 下一个赎回开放时间(所有用户统一) /// @notice 下一个赎回开放时间(所有用户统一)
uint256 public nextRedemptionTime; uint256 public nextRedemptionTime;
@@ -165,6 +169,9 @@ contract YTAssetVault is
// 设置赎回时间 // 设置赎回时间
nextRedemptionTime = _redemptionTime; nextRedemptionTime = _redemptionTime;
// 设置默认价格过期阈值1小时
priceStalenesThreshold = 3600;
} }
/** /**
@@ -179,15 +186,21 @@ contract YTAssetVault is
*/ */
function _getUSDCPrice() internal view returns (uint256) { function _getUSDCPrice() internal view returns (uint256) {
( (
/* uint80 roundId */, uint80 roundId,
int256 price, int256 price,
/* uint256 startedAt */, /* uint256 startedAt */,
/* uint256 updatedAt */, uint256 updatedAt,
/* uint80 answeredInRound */ uint80 answeredInRound
) = usdcPriceFeed.latestRoundData(); ) = usdcPriceFeed.latestRoundData();
// 价格有效性检查
if (price <= 0) revert InvalidChainlinkPrice(); if (price <= 0) revert InvalidChainlinkPrice();
// 新鲜度检查:确保价格数据不过期
if (updatedAt == 0) revert StalePrice();
if (answeredInRound < roundId) revert StalePrice();
if (block.timestamp - updatedAt > priceStalenesThreshold) revert StalePrice();
return uint256(price); return uint256(price);
} }
@@ -228,6 +241,15 @@ contract YTAssetVault is
emit ManagerSet(_manager); emit ManagerSet(_manager);
} }
/**
* @notice 设置价格过期阈值
* @param _threshold 阈值例如3600 = 1小时86400 = 24小时
*/
function setPriceStalenessThreshold(uint256 _threshold) external onlyFactory {
require(_threshold > 0 && _threshold <= 7 days, "Invalid threshold");
priceStalenesThreshold = _threshold;
}
/** /**
* @notice 暂停合约仅factory可调用 * @notice 暂停合约仅factory可调用
* @dev 暂停后,所有资金流动操作将被禁止 * @dev 暂停后,所有资金流动操作将被禁止

View File

@@ -1,44 +1,34 @@
{ {
"97": { "97": {
"lendingFactory": "0x41857cc92a74fa5FB776e5D7091dD79faaaA973C", "lendingFactory": "0x10E6Ad7b8a801857F3A96A5178D7baf5C34a5B83",
"lendingPriceFeedProxy": "0x13bD017E5837b5451447508ebd4Fe65A2B1d4f30", "lendingPriceFeedProxy": "0xa280F5FD7AA093572BEb791d7f9CC8Ec8EA57A15",
"lendingPriceFeed": "0x13bD017E5837b5451447508ebd4Fe65A2B1d4f30", "lendingPriceFeed": "0xa280F5FD7AA093572BEb791d7f9CC8Ec8EA57A15",
"lendingPriceFeedImpl": "0xff09A4EBC7F871b8B2CdCfE4c94e30E46DE559d5", "lendingPriceFeedImpl": "0xF1aAd358d6E20Ba946786Bb3E5d34D42F4740dd2",
"configuratorProxy": "0xB9676f3482D332210C5c630Fa265c92171958F92", "configuratorProxy": "0x189Fe9dbB2f7dA538D3191159fd661779D7BCBd6",
"configuratorImpl": "0xF553843cb7F35378Fd4020d2DFceb90BfD760552", "configuratorImpl": "0xF553843cb7F35378Fd4020d2DFceb90BfD760552",
"lendingImpl": "0x5336FE1bC5c7c1dE35CB053f2f649EA9D4dA3E5F", "lendingImpl": "0xc20e1Dd1eb781C344489828CE3BFCA318CB51430",
"usdcAddress": "0x939cf46F7A4d05da2a37213E7379a8b04528F590", "usdcAddress": "0x939cf46F7A4d05da2a37213E7379a8b04528F590",
"usdcPriceFeed": "0x90c069C4538adAc136E051052E14c1cD799C41B7", "usdcPriceFeed": "0x90c069C4538adAc136E051052E14c1cD799C41B7",
"deployTimestamp": "2026-01-07T03:58:01.816Z", "deployTimestamp": "2026-01-12T05:59:53.030Z",
"deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"lendingProxy": "0x1E60013A6eb8966a1b59BC31cE0D07054E591eE7", "lendingProxy": "0xfdbFD4656b74aD16F23264121eD9F58219f5C3Cf",
"collateralAssets": [ "collateralAssets": [
{ {
"name": "YT Token A", "name": "YT Token A",
"symbol": "YT-A", "symbol": "YT-A",
"address": "0x0cA35994F033685E7a57ef9bc5d00dd3cf927330" "address": "0x7f9eEA491eE53045594ee4669327f0355aCd0e58"
}, },
{ {
"name": "YT Token B", "name": "YT Token B",
"symbol": "YT-B", "symbol": "YT-B",
"address": "0x333805C9EE75f59Aa2Cc79DfDe2499F920c7b408" "address": "0x20B94C5E5b7361552E0548161a58696aA6FeDBd4"
}, },
{ {
"name": "YT Token C", "name": "YT Token C",
"symbol": "YT-C", "symbol": "YT-C",
"address": "0x6DF0ED6f0345F601A206974973dE9fC970598587" "address": "0x0EF308D70cf35460E26a3Eb42F3442Ff28cbE07C"
} }
], ],
"configTimestamp": "2026-01-07T03:58:41.420Z", "configTimestamp": "2026-01-12T06:00:25.232Z"
"upgradeHistory": [
{
"timestamp": "2026-01-08T03:26:13.317Z",
"contract": "Lending",
"oldImplementation": "0xe443B92e052e72C39a7833cD723276f8e337144A",
"newImplementation": "0x5336FE1bC5c7c1dE35CB053f2f649EA9D4dA3E5F",
"upgrader": "0xa013422A5918CD099C63c8CC35283EACa99a705d"
}
],
"lendingUpgradeTimestamp": "2026-01-08T03:26:13.317Z"
} }
} }

View File

@@ -2,7 +2,7 @@
"network": "bscTestnet", "network": "bscTestnet",
"chainId": "97", "chainId": "97",
"deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"timestamp": "2026-01-07T03:50:12.838Z", "timestamp": "2026-01-12T05:52:56.820Z",
"contracts": { "contracts": {
"USDC": { "USDC": {
"address": "0x939cf46F7A4d05da2a37213E7379a8b04528F590", "address": "0x939cf46F7A4d05da2a37213E7379a8b04528F590",

View File

@@ -2,50 +2,50 @@
"network": "bscTestnet", "network": "bscTestnet",
"chainId": "97", "chainId": "97",
"deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"timestamp": "2026-01-07T03:53:55.098Z", "timestamp": "2026-01-12T05:54:13.800Z",
"usdcAddress": "0x939cf46F7A4d05da2a37213E7379a8b04528F590", "usdcAddress": "0x939cf46F7A4d05da2a37213E7379a8b04528F590",
"usdcPriceFeedAddress": "0x90c069C4538adAc136E051052E14c1cD799C41B7", "usdcPriceFeedAddress": "0x90c069C4538adAc136E051052E14c1cD799C41B7",
"defaultHardCap": "10000000000000000000000000", "defaultHardCap": "10000000000000000000000000",
"contracts": { "contracts": {
"YTAssetVault": { "YTAssetVault": {
"implementation": "0x6cBD32731742004471ce16FcB80a6db0844E8b13" "implementation": "0xB9a9c4d1a8f81a479040fcD30Bf3fca413c203bf"
}, },
"YTAssetFactory": { "YTAssetFactory": {
"proxy": "0x6DaB73519DbaFf23F36FEd24110e2ef5Cfc8aAC9", "proxy": "0x37B2CD7D94ba1400a6FEB34804a32EfD555bbfc8",
"implementation": "0xc22a07Cf4bbDc323bC3288a82E85d1367a470b75" "implementation": "0x6137aAF5903A480888bC72c7b091909421bef45D"
} }
}, },
"vaults": [ "vaults": [
{ {
"name": "YT Token A", "name": "YT Token A",
"symbol": "YT-A", "symbol": "YT-A",
"address": "0x0cA35994F033685E7a57ef9bc5d00dd3cf927330", "address": "0x7f9eEA491eE53045594ee4669327f0355aCd0e58",
"index": "0", "index": "0",
"manager": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "manager": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"hardCap": "10000000000000000000000000", "hardCap": "10000000000000000000000000",
"redemptionTime": 1799294058, "redemptionTime": 1799733295,
"ytPrice": "1000000000000000000000000000000" "ytPrice": "1000000000000000000000000000000"
}, },
{ {
"name": "YT Token B", "name": "YT Token B",
"symbol": "YT-B", "symbol": "YT-B",
"address": "0x333805C9EE75f59Aa2Cc79DfDe2499F920c7b408", "address": "0x20B94C5E5b7361552E0548161a58696aA6FeDBd4",
"index": "1", "index": "1",
"manager": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "manager": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"hardCap": "10000000000000000000000000", "hardCap": "10000000000000000000000000",
"redemptionTime": 1799294058, "redemptionTime": 1799733295,
"ytPrice": "1000000000000000000000000000000" "ytPrice": "1000000000000000000000000000000"
}, },
{ {
"name": "YT Token C", "name": "YT Token C",
"symbol": "YT-C", "symbol": "YT-C",
"address": "0x6DF0ED6f0345F601A206974973dE9fC970598587", "address": "0x0EF308D70cf35460E26a3Eb42F3442Ff28cbE07C",
"index": "2", "index": "2",
"manager": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "manager": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"hardCap": "10000000000000000000000000", "hardCap": "10000000000000000000000000",
"redemptionTime": 1799294058, "redemptionTime": 1799733295,
"ytPrice": "1000000000000000000000000000000" "ytPrice": "1000000000000000000000000000000"
} }
], ],
"lastUpdate": "2026-01-07T03:54:28.113Z" "lastUpdate": "2026-01-12T05:55:05.405Z"
} }

View File

@@ -1,12 +1,12 @@
{ {
"timestamp": "2026-01-07T03:56:07.469Z", "timestamp": "2026-01-12T05:56:01.673Z",
"operator": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "operator": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"whitelistedTokens": { "whitelistedTokens": {
"ytTokens": [ "ytTokens": [
{ {
"name": "YT Token A", "name": "YT Token A",
"symbol": "YT-A", "symbol": "YT-A",
"address": "0x0cA35994F033685E7a57ef9bc5d00dd3cf927330", "address": "0x7f9eEA491eE53045594ee4669327f0355aCd0e58",
"weight": 4000, "weight": 4000,
"maxUsdyAmount": "45000000000000000000000000", "maxUsdyAmount": "45000000000000000000000000",
"price": "1000000000000000000000000000000", "price": "1000000000000000000000000000000",
@@ -15,7 +15,7 @@
{ {
"name": "YT Token B", "name": "YT Token B",
"symbol": "YT-B", "symbol": "YT-B",
"address": "0x333805C9EE75f59Aa2Cc79DfDe2499F920c7b408", "address": "0x20B94C5E5b7361552E0548161a58696aA6FeDBd4",
"weight": 3000, "weight": 3000,
"maxUsdyAmount": "35000000000000000000000000", "maxUsdyAmount": "35000000000000000000000000",
"price": "1000000000000000000000000000000", "price": "1000000000000000000000000000000",
@@ -24,7 +24,7 @@
{ {
"name": "YT Token C", "name": "YT Token C",
"symbol": "YT-C", "symbol": "YT-C",
"address": "0x6DF0ED6f0345F601A206974973dE9fC970598587", "address": "0x0EF308D70cf35460E26a3Eb42F3442Ff28cbE07C",
"weight": 2000, "weight": 2000,
"maxUsdyAmount": "25000000000000000000000000", "maxUsdyAmount": "25000000000000000000000000",
"price": "1000000000000000000000000000000", "price": "1000000000000000000000000000000",

View File

@@ -2,22 +2,23 @@
"network": "bscTestnet", "network": "bscTestnet",
"chainId": "97", "chainId": "97",
"configurer": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "configurer": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"timestamp": "2026-01-07T03:55:26.868Z", "timestamp": "2026-01-12T05:55:25.677Z",
"configuration": { "configuration": {
"permissions": { "permissions": {
"usdyVaults": [ "usdyVaults": [
"0x19982e5145ca5401A1084c0BF916c0E0bB343Af9", "0xA6CD153c2fa0C2725605880668538660Ca21a790",
"0x14246886a1E1202cb6b5a2db793eF3359d536302" "0xb11824eAA659F8A4648711709dA60720d5Cdabd2"
], ],
"ytlpMinters": [ "ytlpMinters": [
"0x14246886a1E1202cb6b5a2db793eF3359d536302" "0xb11824eAA659F8A4648711709dA60720d5Cdabd2"
], ],
"vaultPoolManager": "0x14246886a1E1202cb6b5a2db793eF3359d536302", "ytlpPoolManager": "0xb11824eAA659F8A4648711709dA60720d5Cdabd2",
"vaultPoolManager": "0xb11824eAA659F8A4648711709dA60720d5Cdabd2",
"vaultSwappers": [ "vaultSwappers": [
"0x51eEF57eC57c867AC23945f0ce21aA5A9a2C246c" "0x5af5A51F7702024E7387bba7497DC9965C00F16E"
], ],
"poolManagerHandlers": [ "poolManagerHandlers": [
"0x51eEF57eC57c867AC23945f0ce21aA5A9a2C246c" "0x5af5A51F7702024E7387bba7497DC9965C00F16E"
], ],
"priceFeedKeepers": [ "priceFeedKeepers": [
"0xa013422A5918CD099C63c8CC35283EACa99a705d" "0xa013422A5918CD099C63c8CC35283EACa99a705d"

View File

@@ -2,30 +2,30 @@
"network": "bscTestnet", "network": "bscTestnet",
"chainId": "97", "chainId": "97",
"deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d", "deployer": "0xa013422A5918CD099C63c8CC35283EACa99a705d",
"timestamp": "2026-01-07T03:52:50.659Z", "timestamp": "2026-01-12T05:53:28.316Z",
"contracts": { "contracts": {
"USDY": { "USDY": {
"proxy": "0x631Bd6834C50f6d2B07035c9253b4a19132E888c", "proxy": "0x29774970556407fAE16BC07e87704fE0E9559BC4",
"implementation": "0xb14d186d4EAcE8131a449126c6208165a3F5FC5b" "implementation": "0xb14d186d4EAcE8131a449126c6208165a3F5FC5b"
}, },
"YTLPToken": { "YTLPToken": {
"proxy": "0x1b96F219E8aeE557DD8bD905a6c72cc64eA5BD7B", "proxy": "0x17c1100b02d560549b499561dB8d7D48fc391cf3",
"implementation": "0x0C3fa01b2D0596B4190edEF1B77534237231C77e" "implementation": "0x48aeC139406e97784eaD3fc8205863387a5639D7"
}, },
"YTPriceFeed": { "YTPriceFeed": {
"proxy": "0x0f2d930EE73972132E3a36b7eD6F709Af6E5B879", "proxy": "0x293d00fB683f15eA5a3143ecb551a0aCCbEC42Be",
"implementation": "0x2201c2B382E1decD933fc8d3503bEcE221B6C46c" "implementation": "0xD8EE97333D42d8121c877840928288A121E3Cdef"
}, },
"YTVault": { "YTVault": {
"proxy": "0x19982e5145ca5401A1084c0BF916c0E0bB343Af9", "proxy": "0xA6CD153c2fa0C2725605880668538660Ca21a790",
"implementation": "0x61278a2EBFC07eF0F7f84407291aAD07DA596AB2" "implementation": "0x61278a2EBFC07eF0F7f84407291aAD07DA596AB2"
}, },
"YTPoolManager": { "YTPoolManager": {
"proxy": "0x14246886a1E1202cb6b5a2db793eF3359d536302", "proxy": "0xb11824eAA659F8A4648711709dA60720d5Cdabd2",
"implementation": "0x96Fe19188c3c7d0EDA441dafC7976fBB3526d28c" "implementation": "0x144cC96e9b1DC5EC118DF49167DA83048A3050ae"
}, },
"YTRewardRouter": { "YTRewardRouter": {
"proxy": "0x51eEF57eC57c867AC23945f0ce21aA5A9a2C246c", "proxy": "0x5af5A51F7702024E7387bba7497DC9965C00F16E",
"implementation": "0x3688CDd7A25613E7b1E7E0ee1aA46c21F66D27F3" "implementation": "0x3688CDd7A25613E7b1E7E0ee1aA46c21F66D27F3"
} }
} }

View File

@@ -149,6 +149,7 @@ const config: HardhatUserConfig = {
url: "https://api.zan.top/node/v1/bsc/testnet/baf84c429d284bb5b676cb8c9ca21c07", url: "https://api.zan.top/node/v1/bsc/testnet/baf84c429d284bb5b676cb8c9ca21c07",
accounts: accounts, accounts: accounts,
chainId: 97, chainId: 97,
gasPrice: 2000000000,
}, },
}, },

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
{"id":"0c1e3adcf62e59a9","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IYTAssetVault.sol","2":"contracts/interfaces/IYTLendingPriceFeed.sol","3":"contracts/ytLending/Configurator.sol","4":"contracts/ytLending/ConfiguratorStorage.sol","5":"contracts/ytLending/Lending.sol","6":"contracts/ytLending/LendingConfiguration.sol","7":"contracts/ytLending/LendingFactory.sol","8":"contracts/ytLending/LendingMath.sol","9":"contracts/ytLending/LendingPriceFeed.sol","10":"contracts/ytLending/LendingStorage.sol","11":"contracts/ytVault/YTAssetFactory.sol","12":"contracts/ytVault/YTAssetVault.sol","13":"lib/forge-std/src/Base.sol","14":"lib/forge-std/src/StdAssertions.sol","15":"lib/forge-std/src/StdChains.sol","16":"lib/forge-std/src/StdCheats.sol","17":"lib/forge-std/src/StdConstants.sol","18":"lib/forge-std/src/StdError.sol","19":"lib/forge-std/src/StdInvariant.sol","20":"lib/forge-std/src/StdJson.sol","21":"lib/forge-std/src/StdMath.sol","22":"lib/forge-std/src/StdStorage.sol","23":"lib/forge-std/src/StdStyle.sol","24":"lib/forge-std/src/StdToml.sol","25":"lib/forge-std/src/StdUtils.sol","26":"lib/forge-std/src/Test.sol","27":"lib/forge-std/src/Vm.sol","28":"lib/forge-std/src/console.sol","29":"lib/forge-std/src/console2.sol","30":"lib/forge-std/src/interfaces/IMulticall3.sol","31":"lib/forge-std/src/safeconsole.sol","32":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","33":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","34":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","35":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","36":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","37":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","38":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","39":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","40":"node_modules/@openzeppelin/contracts/access/Ownable.sol","41":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","42":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","43":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","44":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","45":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","46":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","47":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","48":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","49":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","50":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","51":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","52":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","53":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","54":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","55":"node_modules/@openzeppelin/contracts/utils/Address.sol","56":"node_modules/@openzeppelin/contracts/utils/Context.sol","57":"node_modules/@openzeppelin/contracts/utils/Errors.sol","58":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","59":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","60":"test/YtLending.t.sol"},"language":"Solidity"}

View File

@@ -1 +0,0 @@
{"id":"3b7265d3b62873e1","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IYTAssetVault.sol","2":"contracts/interfaces/IYTLendingPriceFeed.sol","3":"contracts/ytLending/Configurator.sol","4":"contracts/ytLending/ConfiguratorStorage.sol","5":"contracts/ytLending/Lending.sol","6":"contracts/ytLending/LendingConfiguration.sol","7":"contracts/ytLending/LendingFactory.sol","8":"contracts/ytLending/LendingMath.sol","9":"contracts/ytLending/LendingPriceFeed.sol","10":"contracts/ytLending/LendingStorage.sol","11":"contracts/ytVault/YTAssetFactory.sol","12":"contracts/ytVault/YTAssetVault.sol","13":"lib/forge-std/src/Base.sol","14":"lib/forge-std/src/StdAssertions.sol","15":"lib/forge-std/src/StdChains.sol","16":"lib/forge-std/src/StdCheats.sol","17":"lib/forge-std/src/StdConstants.sol","18":"lib/forge-std/src/StdError.sol","19":"lib/forge-std/src/StdInvariant.sol","20":"lib/forge-std/src/StdJson.sol","21":"lib/forge-std/src/StdMath.sol","22":"lib/forge-std/src/StdStorage.sol","23":"lib/forge-std/src/StdStyle.sol","24":"lib/forge-std/src/StdToml.sol","25":"lib/forge-std/src/StdUtils.sol","26":"lib/forge-std/src/Test.sol","27":"lib/forge-std/src/Vm.sol","28":"lib/forge-std/src/console.sol","29":"lib/forge-std/src/console2.sol","30":"lib/forge-std/src/interfaces/IMulticall3.sol","31":"lib/forge-std/src/safeconsole.sol","32":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","33":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","34":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","35":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","36":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","37":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","38":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","39":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","40":"node_modules/@openzeppelin/contracts/access/Ownable.sol","41":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","42":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","43":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","44":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","45":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","46":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","47":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","48":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","49":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","50":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","51":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","52":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","53":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","54":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","55":"node_modules/@openzeppelin/contracts/utils/Address.sol","56":"node_modules/@openzeppelin/contracts/utils/Context.sol","57":"node_modules/@openzeppelin/contracts/utils/Errors.sol","58":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","59":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","60":"test/YtLending.t.sol"},"language":"Solidity"}

View File

@@ -1 +0,0 @@
{"id":"515ff2f06c470e6a","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IUSDY.sol","2":"contracts/interfaces/IYTAssetVault.sol","3":"contracts/interfaces/IYTLPToken.sol","4":"contracts/interfaces/IYTLendingPriceFeed.sol","5":"contracts/interfaces/IYTPoolManager.sol","6":"contracts/interfaces/IYTPriceFeed.sol","7":"contracts/interfaces/IYTVault.sol","8":"contracts/ytLending/Configurator.sol","9":"contracts/ytLending/ConfiguratorStorage.sol","10":"contracts/ytLending/Lending.sol","11":"contracts/ytLending/LendingConfiguration.sol","12":"contracts/ytLending/LendingFactory.sol","13":"contracts/ytLending/LendingMath.sol","14":"contracts/ytLending/LendingPriceFeed.sol","15":"contracts/ytLending/LendingStorage.sol","16":"contracts/ytLp/core/YTPoolManager.sol","17":"contracts/ytLp/core/YTPriceFeed.sol","18":"contracts/ytLp/core/YTRewardRouter.sol","19":"contracts/ytLp/core/YTVault.sol","20":"contracts/ytLp/tokens/USDY.sol","21":"contracts/ytLp/tokens/YTLPToken.sol","22":"contracts/ytVault/YTAssetFactory.sol","23":"contracts/ytVault/YTAssetVault.sol","24":"lib/forge-std/src/Base.sol","25":"lib/forge-std/src/StdAssertions.sol","26":"lib/forge-std/src/StdChains.sol","27":"lib/forge-std/src/StdCheats.sol","28":"lib/forge-std/src/StdConstants.sol","29":"lib/forge-std/src/StdError.sol","30":"lib/forge-std/src/StdInvariant.sol","31":"lib/forge-std/src/StdJson.sol","32":"lib/forge-std/src/StdMath.sol","33":"lib/forge-std/src/StdStorage.sol","34":"lib/forge-std/src/StdStyle.sol","35":"lib/forge-std/src/StdToml.sol","36":"lib/forge-std/src/StdUtils.sol","37":"lib/forge-std/src/Test.sol","38":"lib/forge-std/src/Vm.sol","39":"lib/forge-std/src/console.sol","40":"lib/forge-std/src/console2.sol","41":"lib/forge-std/src/interfaces/IMulticall3.sol","42":"lib/forge-std/src/safeconsole.sol","43":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","44":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","45":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","46":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","47":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","48":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","49":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","50":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","51":"node_modules/@openzeppelin/contracts/access/Ownable.sol","52":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","53":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","54":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","55":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","56":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","57":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","58":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","59":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","60":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","61":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","62":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","63":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","64":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","65":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","66":"node_modules/@openzeppelin/contracts/utils/Address.sol","67":"node_modules/@openzeppelin/contracts/utils/Context.sol","68":"node_modules/@openzeppelin/contracts/utils/Errors.sol","69":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","70":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","71":"test/YtLending.t.sol","72":"test/YtLp.t.sol","73":"test/YtVault.t.sol"},"language":"Solidity"}

View File

@@ -0,0 +1 @@
{"id":"69af2c0c93fea5ba","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IYTAssetVault.sol","2":"contracts/interfaces/IYTLendingPriceFeed.sol","3":"contracts/ytLending/Configurator.sol","4":"contracts/ytLending/ConfiguratorStorage.sol","5":"contracts/ytLending/Lending.sol","6":"contracts/ytLending/LendingConfiguration.sol","7":"contracts/ytLending/LendingFactory.sol","8":"contracts/ytLending/LendingMath.sol","9":"contracts/ytLending/LendingPriceFeed.sol","10":"contracts/ytLending/LendingStorage.sol","11":"contracts/ytLp/core/YTPriceFeed.sol","12":"contracts/ytVault/YTAssetFactory.sol","13":"contracts/ytVault/YTAssetVault.sol","14":"lib/forge-std/src/Base.sol","15":"lib/forge-std/src/StdAssertions.sol","16":"lib/forge-std/src/StdChains.sol","17":"lib/forge-std/src/StdCheats.sol","18":"lib/forge-std/src/StdConstants.sol","19":"lib/forge-std/src/StdError.sol","20":"lib/forge-std/src/StdInvariant.sol","21":"lib/forge-std/src/StdJson.sol","22":"lib/forge-std/src/StdMath.sol","23":"lib/forge-std/src/StdStorage.sol","24":"lib/forge-std/src/StdStyle.sol","25":"lib/forge-std/src/StdToml.sol","26":"lib/forge-std/src/StdUtils.sol","27":"lib/forge-std/src/Test.sol","28":"lib/forge-std/src/Vm.sol","29":"lib/forge-std/src/console.sol","30":"lib/forge-std/src/console2.sol","31":"lib/forge-std/src/interfaces/IMulticall3.sol","32":"lib/forge-std/src/safeconsole.sol","33":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","34":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","35":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","36":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","37":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","38":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","39":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","40":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","41":"node_modules/@openzeppelin/contracts/access/Ownable.sol","42":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","43":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","44":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","45":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","46":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","47":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","48":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","49":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","50":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","51":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","52":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","53":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","54":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","55":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","56":"node_modules/@openzeppelin/contracts/utils/Address.sol","57":"node_modules/@openzeppelin/contracts/utils/Context.sol","58":"node_modules/@openzeppelin/contracts/utils/Errors.sol","59":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","60":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","61":"test/SecurityFixes.t.sol"},"language":"Solidity"}

View File

@@ -1 +1 @@
{"id":"059f33eca1d35bb3","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IUSDY.sol","2":"contracts/interfaces/IYTAssetVault.sol","3":"contracts/interfaces/IYTLPToken.sol","4":"contracts/interfaces/IYTLendingPriceFeed.sol","5":"contracts/interfaces/IYTPoolManager.sol","6":"contracts/interfaces/IYTPriceFeed.sol","7":"contracts/interfaces/IYTVault.sol","8":"contracts/ytLending/Configurator.sol","9":"contracts/ytLending/ConfiguratorStorage.sol","10":"contracts/ytLending/Lending.sol","11":"contracts/ytLending/LendingConfiguration.sol","12":"contracts/ytLending/LendingFactory.sol","13":"contracts/ytLending/LendingMath.sol","14":"contracts/ytLending/LendingPriceFeed.sol","15":"contracts/ytLending/LendingStorage.sol","16":"contracts/ytLp/core/YTPoolManager.sol","17":"contracts/ytLp/core/YTPriceFeed.sol","18":"contracts/ytLp/core/YTRewardRouter.sol","19":"contracts/ytLp/core/YTVault.sol","20":"contracts/ytLp/tokens/USDY.sol","21":"contracts/ytLp/tokens/YTLPToken.sol","22":"contracts/ytVault/YTAssetFactory.sol","23":"contracts/ytVault/YTAssetVault.sol","24":"lib/forge-std/src/Base.sol","25":"lib/forge-std/src/StdAssertions.sol","26":"lib/forge-std/src/StdChains.sol","27":"lib/forge-std/src/StdCheats.sol","28":"lib/forge-std/src/StdConstants.sol","29":"lib/forge-std/src/StdError.sol","30":"lib/forge-std/src/StdInvariant.sol","31":"lib/forge-std/src/StdJson.sol","32":"lib/forge-std/src/StdMath.sol","33":"lib/forge-std/src/StdStorage.sol","34":"lib/forge-std/src/StdStyle.sol","35":"lib/forge-std/src/StdToml.sol","36":"lib/forge-std/src/StdUtils.sol","37":"lib/forge-std/src/Test.sol","38":"lib/forge-std/src/Vm.sol","39":"lib/forge-std/src/console.sol","40":"lib/forge-std/src/console2.sol","41":"lib/forge-std/src/interfaces/IMulticall3.sol","42":"lib/forge-std/src/safeconsole.sol","43":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","44":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","45":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","46":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","47":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","48":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","49":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","50":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","51":"node_modules/@openzeppelin/contracts/access/Ownable.sol","52":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","53":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","54":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","55":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","56":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","57":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","58":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","59":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","60":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","61":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","62":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","63":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","64":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","65":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","66":"node_modules/@openzeppelin/contracts/utils/Address.sol","67":"node_modules/@openzeppelin/contracts/utils/Context.sol","68":"node_modules/@openzeppelin/contracts/utils/Errors.sol","69":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","70":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","71":"test/YtLending.t.sol","72":"test/YtLp.t.sol","73":"test/YtVault.t.sol"},"language":"Solidity"} {"id":"6ba94da2911232d8","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IUSDY.sol","2":"contracts/interfaces/IYTAssetVault.sol","3":"contracts/interfaces/IYTLPToken.sol","4":"contracts/interfaces/IYTLendingPriceFeed.sol","5":"contracts/interfaces/IYTPoolManager.sol","6":"contracts/interfaces/IYTPriceFeed.sol","7":"contracts/interfaces/IYTVault.sol","8":"contracts/ytLending/Configurator.sol","9":"contracts/ytLending/ConfiguratorStorage.sol","10":"contracts/ytLending/Lending.sol","11":"contracts/ytLending/LendingConfiguration.sol","12":"contracts/ytLending/LendingFactory.sol","13":"contracts/ytLending/LendingMath.sol","14":"contracts/ytLending/LendingPriceFeed.sol","15":"contracts/ytLending/LendingStorage.sol","16":"contracts/ytLp/core/YTPoolManager.sol","17":"contracts/ytLp/core/YTPriceFeed.sol","18":"contracts/ytLp/core/YTRewardRouter.sol","19":"contracts/ytLp/core/YTVault.sol","20":"contracts/ytLp/tokens/USDY.sol","21":"contracts/ytLp/tokens/YTLPToken.sol","22":"contracts/ytVault/YTAssetFactory.sol","23":"contracts/ytVault/YTAssetVault.sol","24":"lib/forge-std/src/Base.sol","25":"lib/forge-std/src/StdAssertions.sol","26":"lib/forge-std/src/StdChains.sol","27":"lib/forge-std/src/StdCheats.sol","28":"lib/forge-std/src/StdConstants.sol","29":"lib/forge-std/src/StdError.sol","30":"lib/forge-std/src/StdInvariant.sol","31":"lib/forge-std/src/StdJson.sol","32":"lib/forge-std/src/StdMath.sol","33":"lib/forge-std/src/StdStorage.sol","34":"lib/forge-std/src/StdStyle.sol","35":"lib/forge-std/src/StdToml.sol","36":"lib/forge-std/src/StdUtils.sol","37":"lib/forge-std/src/Test.sol","38":"lib/forge-std/src/Vm.sol","39":"lib/forge-std/src/console.sol","40":"lib/forge-std/src/console2.sol","41":"lib/forge-std/src/interfaces/IMulticall3.sol","42":"lib/forge-std/src/safeconsole.sol","43":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","44":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","45":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","46":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","47":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","48":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","49":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","50":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","51":"node_modules/@openzeppelin/contracts/access/Ownable.sol","52":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","53":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","54":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","55":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","56":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","57":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","58":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","59":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","60":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","61":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","62":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","63":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","64":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","65":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","66":"node_modules/@openzeppelin/contracts/utils/Address.sol","67":"node_modules/@openzeppelin/contracts/utils/Context.sol","68":"node_modules/@openzeppelin/contracts/utils/Errors.sol","69":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","70":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","71":"test/SecurityFixes.t.sol","72":"test/YtLending.t.sol","73":"test/YtLp.t.sol","74":"test/YtVault.t.sol"},"language":"Solidity"}

View File

@@ -1 +0,0 @@
{"id":"97e3076db82493b4","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IYTAssetVault.sol","2":"contracts/interfaces/IYTLendingPriceFeed.sol","3":"contracts/ytLending/Configurator.sol","4":"contracts/ytLending/ConfiguratorStorage.sol","5":"contracts/ytLending/Lending.sol","6":"contracts/ytLending/LendingConfiguration.sol","7":"contracts/ytLending/LendingFactory.sol","8":"contracts/ytLending/LendingMath.sol","9":"contracts/ytLending/LendingPriceFeed.sol","10":"contracts/ytLending/LendingStorage.sol","11":"contracts/ytVault/YTAssetFactory.sol","12":"contracts/ytVault/YTAssetVault.sol","13":"lib/forge-std/src/Base.sol","14":"lib/forge-std/src/StdAssertions.sol","15":"lib/forge-std/src/StdChains.sol","16":"lib/forge-std/src/StdCheats.sol","17":"lib/forge-std/src/StdConstants.sol","18":"lib/forge-std/src/StdError.sol","19":"lib/forge-std/src/StdInvariant.sol","20":"lib/forge-std/src/StdJson.sol","21":"lib/forge-std/src/StdMath.sol","22":"lib/forge-std/src/StdStorage.sol","23":"lib/forge-std/src/StdStyle.sol","24":"lib/forge-std/src/StdToml.sol","25":"lib/forge-std/src/StdUtils.sol","26":"lib/forge-std/src/Test.sol","27":"lib/forge-std/src/Vm.sol","28":"lib/forge-std/src/console.sol","29":"lib/forge-std/src/console2.sol","30":"lib/forge-std/src/interfaces/IMulticall3.sol","31":"lib/forge-std/src/safeconsole.sol","32":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","33":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","34":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","35":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","36":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","37":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","38":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","39":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","40":"node_modules/@openzeppelin/contracts/access/Ownable.sol","41":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","42":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","43":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","44":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","45":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","46":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","47":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","48":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","49":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","50":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","51":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","52":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","53":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","54":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","55":"node_modules/@openzeppelin/contracts/utils/Address.sol","56":"node_modules/@openzeppelin/contracts/utils/Context.sol","57":"node_modules/@openzeppelin/contracts/utils/Errors.sol","58":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","59":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","60":"test/YtLending.t.sol"},"language":"Solidity"}

View File

@@ -1 +0,0 @@
{"id":"c25683059ee87c23","source_id_to_path":{"0":"contracts/interfaces/ILending.sol","1":"contracts/interfaces/IYTAssetVault.sol","2":"contracts/interfaces/IYTLendingPriceFeed.sol","3":"contracts/ytLending/Configurator.sol","4":"contracts/ytLending/ConfiguratorStorage.sol","5":"contracts/ytLending/Lending.sol","6":"contracts/ytLending/LendingConfiguration.sol","7":"contracts/ytLending/LendingFactory.sol","8":"contracts/ytLending/LendingMath.sol","9":"contracts/ytLending/LendingPriceFeed.sol","10":"contracts/ytLending/LendingStorage.sol","11":"contracts/ytVault/YTAssetFactory.sol","12":"contracts/ytVault/YTAssetVault.sol","13":"lib/forge-std/src/Base.sol","14":"lib/forge-std/src/StdAssertions.sol","15":"lib/forge-std/src/StdChains.sol","16":"lib/forge-std/src/StdCheats.sol","17":"lib/forge-std/src/StdConstants.sol","18":"lib/forge-std/src/StdError.sol","19":"lib/forge-std/src/StdInvariant.sol","20":"lib/forge-std/src/StdJson.sol","21":"lib/forge-std/src/StdMath.sol","22":"lib/forge-std/src/StdStorage.sol","23":"lib/forge-std/src/StdStyle.sol","24":"lib/forge-std/src/StdToml.sol","25":"lib/forge-std/src/StdUtils.sol","26":"lib/forge-std/src/Test.sol","27":"lib/forge-std/src/Vm.sol","28":"lib/forge-std/src/console.sol","29":"lib/forge-std/src/console2.sol","30":"lib/forge-std/src/interfaces/IMulticall3.sol","31":"lib/forge-std/src/safeconsole.sol","32":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","33":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","34":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","35":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","36":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","37":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","38":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","39":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","40":"node_modules/@openzeppelin/contracts/access/Ownable.sol","41":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","42":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","43":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","44":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","45":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","46":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","47":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","48":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","49":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","50":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","51":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","52":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","53":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","54":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","55":"node_modules/@openzeppelin/contracts/utils/Address.sol","56":"node_modules/@openzeppelin/contracts/utils/Context.sol","57":"node_modules/@openzeppelin/contracts/utils/Errors.sol","58":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","59":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","60":"test/YtLending.t.sol"},"language":"Solidity"}

View File

@@ -0,0 +1 @@
{"id":"d1a89c054fac217c","source_id_to_path":{"0":"contracts/interfaces/IUSDY.sol","1":"contracts/interfaces/IYTLPToken.sol","2":"contracts/interfaces/IYTPoolManager.sol","3":"contracts/interfaces/IYTVault.sol","4":"contracts/ytLp/core/YTPoolManager.sol","5":"contracts/ytLp/core/YTRewardRouter.sol","6":"contracts/ytLp/tokens/USDY.sol","7":"contracts/ytLp/tokens/YTLPToken.sol","8":"lib/forge-std/src/Base.sol","9":"lib/forge-std/src/StdAssertions.sol","10":"lib/forge-std/src/StdChains.sol","11":"lib/forge-std/src/StdCheats.sol","12":"lib/forge-std/src/StdConstants.sol","13":"lib/forge-std/src/StdError.sol","14":"lib/forge-std/src/StdInvariant.sol","15":"lib/forge-std/src/StdJson.sol","16":"lib/forge-std/src/StdMath.sol","17":"lib/forge-std/src/StdStorage.sol","18":"lib/forge-std/src/StdStyle.sol","19":"lib/forge-std/src/StdToml.sol","20":"lib/forge-std/src/StdUtils.sol","21":"lib/forge-std/src/Test.sol","22":"lib/forge-std/src/Vm.sol","23":"lib/forge-std/src/console.sol","24":"lib/forge-std/src/console2.sol","25":"lib/forge-std/src/interfaces/IMulticall3.sol","26":"lib/forge-std/src/safeconsole.sol","27":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","28":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","29":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","30":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","31":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","32":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","33":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","34":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","35":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","36":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","37":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","38":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","39":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","40":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","41":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","42":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","43":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","44":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","45":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","46":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","47":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","48":"node_modules/@openzeppelin/contracts/utils/Address.sol","49":"node_modules/@openzeppelin/contracts/utils/Context.sol","50":"node_modules/@openzeppelin/contracts/utils/Errors.sol","51":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","52":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","53":"test/CooldownBypassFix.t.sol"},"language":"Solidity"}

View File

@@ -0,0 +1 @@
{"id":"f66dad6325b2f1a6","source_id_to_path":{"0":"contracts/interfaces/IUSDY.sol","1":"contracts/interfaces/IYTAssetVault.sol","2":"contracts/interfaces/IYTLPToken.sol","3":"contracts/interfaces/IYTPoolManager.sol","4":"contracts/interfaces/IYTPriceFeed.sol","5":"contracts/interfaces/IYTVault.sol","6":"contracts/ytLp/core/YTPoolManager.sol","7":"contracts/ytLp/core/YTPriceFeed.sol","8":"contracts/ytLp/core/YTRewardRouter.sol","9":"contracts/ytLp/core/YTVault.sol","10":"contracts/ytLp/tokens/USDY.sol","11":"contracts/ytLp/tokens/YTLPToken.sol","12":"contracts/ytVault/YTAssetFactory.sol","13":"contracts/ytVault/YTAssetVault.sol","14":"lib/forge-std/src/Base.sol","15":"lib/forge-std/src/StdAssertions.sol","16":"lib/forge-std/src/StdChains.sol","17":"lib/forge-std/src/StdCheats.sol","18":"lib/forge-std/src/StdConstants.sol","19":"lib/forge-std/src/StdError.sol","20":"lib/forge-std/src/StdInvariant.sol","21":"lib/forge-std/src/StdJson.sol","22":"lib/forge-std/src/StdMath.sol","23":"lib/forge-std/src/StdStorage.sol","24":"lib/forge-std/src/StdStyle.sol","25":"lib/forge-std/src/StdToml.sol","26":"lib/forge-std/src/StdUtils.sol","27":"lib/forge-std/src/Test.sol","28":"lib/forge-std/src/Vm.sol","29":"lib/forge-std/src/console.sol","30":"lib/forge-std/src/console2.sol","31":"lib/forge-std/src/interfaces/IMulticall3.sol","32":"lib/forge-std/src/safeconsole.sol","33":"node_modules/@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol","34":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","35":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","36":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","37":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol","38":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","39":"node_modules/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol","40":"node_modules/@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol","41":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","42":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","43":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","44":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","45":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","46":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","47":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","48":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","49":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","50":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","51":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","52":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","53":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","54":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","55":"node_modules/@openzeppelin/contracts/utils/Address.sol","56":"node_modules/@openzeppelin/contracts/utils/Context.sol","57":"node_modules/@openzeppelin/contracts/utils/Errors.sol","58":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","59":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","60":"test/YtLp.t.sol"},"language":"Solidity"}

View File

@@ -108,6 +108,15 @@ async function main() {
console.log(" ✅ Vault地址:", vaultAddress); console.log(" ✅ Vault地址:", vaultAddress);
console.log(" ✅ Vault索引:", index.toString()); console.log(" ✅ Vault索引:", index.toString());
// 配置价格过期阈值
const vault = await ethers.getContractAt("YTAssetVault", vaultAddress);
const network = await ethers.provider.getNetwork();
const isTestnet = network.chainId === 97n || network.chainId === 11155111n; // BSC测试网或Sepolia
const priceStalenesThreshold = isTestnet ? 86400 : 3600; // 测试网24小时主网1小时
await factory.setPriceStalenessThreshold(vaultAddress, priceStalenesThreshold);
console.log(" ✅ 价格过期阈值:", priceStalenesThreshold, "秒", `(${priceStalenesThreshold / 3600}小时)`);
createdVaults.push({ createdVaults.push({
name: params.name, name: params.name,

View File

@@ -65,9 +65,11 @@ async function main() {
console.log(" ✅ 添加YTPoolManager"); console.log(" ✅ 添加YTPoolManager");
// 配置YTLPToken权限 // 配置YTLPToken权限
console.log("配置YTLPToken minter权限..."); console.log("配置YTLPToken权限...");
await ytLP.setMinter(poolManagerAddress, true); await ytLP.setMinter(poolManagerAddress, true);
console.log(" ✅ 设置YTPoolManager为minter"); console.log(" ✅ 设置YTPoolManager为minter");
await ytLP.setPoolManager(poolManagerAddress);
console.log(" ✅ 设置PoolManager用于转账时继承冷却时间");
// 配置Vault权限 // 配置Vault权限
console.log("配置YTVault权限..."); console.log("配置YTVault权限...");
@@ -87,6 +89,15 @@ async function main() {
// USDC价格从Chainlink获取无需设置价格来源 // USDC价格从Chainlink获取无需设置价格来源
console.log("✅ USDC价格从Chainlink自动获取"); console.log("✅ USDC价格从Chainlink自动获取");
// 根据网络设置价格过期阈值
const network = await ethers.provider.getNetwork();
const isTestnet = network.chainId === 97n || network.chainId === 11155111n; // BSC测试网或Sepolia
const priceStalenesThreshold = isTestnet ? 86400 : 3600; // 测试网24小时主网1小时
console.log("设置价格过期阈值...");
await priceFeed.setPriceStalenessThreshold(priceStalenesThreshold);
console.log(" ✅ 阈值:", priceStalenesThreshold, "秒", `(${priceStalenesThreshold / 3600}小时)`);
// 设置keeper权限默认设置deployer为keeper // 设置keeper权限默认设置deployer为keeper
console.log("设置Keeper权限..."); console.log("设置Keeper权限...");
await priceFeed.setKeeper(deployer.address, true); await priceFeed.setKeeper(deployer.address, true);
@@ -121,6 +132,7 @@ async function main() {
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
console.log("✅ USDY vaults: YTVault, YTPoolManager"); console.log("✅ USDY vaults: YTVault, YTPoolManager");
console.log("✅ YTLPToken minter: YTPoolManager"); console.log("✅ YTLPToken minter: YTPoolManager");
console.log("✅ YTLPToken poolManager: YTPoolManager (冷却时间保护)");
console.log("✅ YTVault poolManager: YTPoolManager"); console.log("✅ YTVault poolManager: YTPoolManager");
console.log("✅ YTVault swapper: YTRewardRouter"); console.log("✅ YTVault swapper: YTRewardRouter");
console.log("✅ YTPoolManager handler: YTRewardRouter"); console.log("✅ YTPoolManager handler: YTRewardRouter");
@@ -145,6 +157,7 @@ async function main() {
permissions: { permissions: {
usdyVaults: [vaultAddress, poolManagerAddress], usdyVaults: [vaultAddress, poolManagerAddress],
ytlpMinters: [poolManagerAddress], ytlpMinters: [poolManagerAddress],
ytlpPoolManager: poolManagerAddress,
vaultPoolManager: poolManagerAddress, vaultPoolManager: poolManagerAddress,
vaultSwappers: [routerAddress], vaultSwappers: [routerAddress],
poolManagerHandlers: [routerAddress], poolManagerHandlers: [routerAddress],

View File

@@ -79,6 +79,13 @@ async function main() {
console.log("✅ LendingPriceFeed Implementation:", lendingPriceFeedImplAddress); console.log("✅ LendingPriceFeed Implementation:", lendingPriceFeedImplAddress);
deployments.lendingPriceFeedImpl = lendingPriceFeedImplAddress; deployments.lendingPriceFeedImpl = lendingPriceFeedImplAddress;
// 根据网络设置价格过期阈值(必须在验证价格之前设置)
const isTestnet = network.chainId === 97n || network.chainId === 11155111n; // BSC测试网或Sepolia
const priceStalenesThreshold = isTestnet ? 86400 : 3600; // 测试网24小时主网1小时
const setThresholdTx = await lendingPriceFeed.setPriceStalenessThreshold(priceStalenesThreshold);
await setThresholdTx.wait(); // 等待交易确认
console.log("✅ 价格过期阈值已设置:", priceStalenesThreshold, "秒", `(${priceStalenesThreshold / 3600}小时)`);
// 验证价格获取 // 验证价格获取
const usdcPrice = await lendingPriceFeed.getPrice(USDC_ADDRESS); const usdcPrice = await lendingPriceFeed.getPrice(USDC_ADDRESS);
console.log("✅ USDC 价格 (1e30 精度):", usdcPrice.toString()); console.log("✅ USDC 价格 (1e30 精度):", usdcPrice.toString());

View File

@@ -38,6 +38,17 @@ async function main() {
console.log(" USDC Address:", deployments.usdcAddress); console.log(" USDC Address:", deployments.usdcAddress);
console.log(" USDC Price Feed:", deployments.usdcPriceFeed, "\n"); console.log(" USDC Price Feed:", deployments.usdcPriceFeed, "\n");
// ========== 配置 LendingPriceFeed 价格过期阈值 ==========
console.log("⚙️ 配置 LendingPriceFeed 价格过期阈值");
const lendingPriceFeed = await ethers.getContractAt("LendingPriceFeed", deployments.lendingPriceFeed);
// 根据网络设置价格过期阈值
const isTestnet = network.chainId === 97n || network.chainId === 11155111n; // BSC测试网或Sepolia
const priceStalenesThreshold = isTestnet ? 86400 : 3600; // 测试网24小时主网1小时
await lendingPriceFeed.setPriceStalenessThreshold(priceStalenesThreshold);
console.log(" ✅ 阈值:", priceStalenesThreshold, "秒", `(${priceStalenesThreshold / 3600}小时)\n`);
// ========== 读取 YT Vault 部署信息 ========== // ========== 读取 YT Vault 部署信息 ==========
const vaultDeploymentsPath = path.join(__dirname, "../../deployments-vault-system.json"); const vaultDeploymentsPath = path.join(__dirname, "../../deployments-vault-system.json");
if (!fs.existsSync(vaultDeploymentsPath)) { if (!fs.existsSync(vaultDeploymentsPath)) {

View File

@@ -0,0 +1,8 @@
npx hardhat run scripts/deploy/01-prepareUSDC.ts --network bscTestnet
npx hardhat run scripts/deploy/02-deployYTLp.ts --network bscTestnet
npx hardhat run scripts/deploy/03-deployAsset.ts --network bscTestnet
npx hardhat run scripts/deploy/04-createVault.ts --network bscTestnet
npx hardhat run scripts/deploy/05-configureYTLp.ts --network bscTestnet
npx hardhat run scripts/deploy/06-addVaultToWhitelist.ts --network bscTestnet
npx hardhat run scripts/deploy/07-deployLending.ts --network bscTestnet
npx hardhat run scripts/deploy/08-configureLending.ts --network bscTestnet

View File

@@ -1,46 +0,0 @@
import { ethers } from "hardhat";
async function generateSetAllowedBrokerCalldata() {
// 合约地址
const vaultAddress = "0x82b6b970711C07FE98Fa60C9d80f1be5B9fa32FF";
// 参数
const brokerHash = "0xad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5";
const allowed = true; // 添加 broker
// 定义函数的 ABI
const functionAbi = [
"function setAllowedBroker(bytes32 _brokerHash, bool _allowed)"
];
// 创建 Interface 实例
const iface = new ethers.Interface(functionAbi);
// 编码函数调用数据
const calldata = iface.encodeFunctionData("setAllowedBroker", [
brokerHash,
allowed
]);
console.log("=".repeat(80));
console.log("Vault 合约地址:", vaultAddress);
console.log("函数名称: setAllowedBroker");
console.log("参数:");
console.log(" - brokerHash:", brokerHash);
console.log(" - allowed:", allowed);
console.log("=".repeat(80));
console.log("生成的 Calldata:");
console.log(calldata);
console.log("=".repeat(80));
return calldata;
}
// 执行函数
generateSetAllowedBrokerCalldata()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});