fix contract
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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调用)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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地址
|
||||||
|
|||||||
@@ -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 暂停后,所有资金流动操作将被禁止
|
||||||
|
|||||||
@@ -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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
1
out/CooldownBypassFix.t.sol/CooldownBypassFixTest.json
Normal file
1
out/CooldownBypassFix.t.sol/CooldownBypassFixTest.json
Normal file
File diff suppressed because one or more lines are too long
1
out/CooldownBypassFix.t.sol/MockERC20.json
Normal file
1
out/CooldownBypassFix.t.sol/MockERC20.json
Normal file
File diff suppressed because one or more lines are too long
1
out/CooldownBypassFix.t.sol/MockYTVault.json
Normal file
1
out/CooldownBypassFix.t.sol/MockYTVault.json
Normal file
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
1
out/SecurityFixes.t.sol/MockChainlinkPriceFeed.json
Normal file
1
out/SecurityFixes.t.sol/MockChainlinkPriceFeed.json
Normal file
File diff suppressed because one or more lines are too long
1
out/SecurityFixes.t.sol/MockChainlinkPriceFeedStale.json
Normal file
1
out/SecurityFixes.t.sol/MockChainlinkPriceFeedStale.json
Normal file
File diff suppressed because one or more lines are too long
1
out/SecurityFixes.t.sol/MockERC20.json
Normal file
1
out/SecurityFixes.t.sol/MockERC20.json
Normal file
File diff suppressed because one or more lines are too long
1
out/SecurityFixes.t.sol/SecurityFixesTest.json
Normal file
1
out/SecurityFixes.t.sol/SecurityFixesTest.json
Normal file
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
@@ -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"}
|
|
||||||
@@ -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"}
|
|
||||||
@@ -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"}
|
|
||||||
1
out/build-info/69af2c0c93fea5ba.json
Normal file
1
out/build-info/69af2c0c93fea5ba.json
Normal 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"}
|
||||||
@@ -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"}
|
||||||
@@ -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"}
|
|
||||||
@@ -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"}
|
|
||||||
1
out/build-info/d1a89c054fac217c.json
Normal file
1
out/build-info/d1a89c054fac217c.json
Normal 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"}
|
||||||
1
out/build-info/f66dad6325b2f1a6.json
Normal file
1
out/build-info/f66dad6325b2f1a6.json
Normal 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"}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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],
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
8
scripts/deploy/deploy.txt
Normal file
8
scripts/deploy/deploy.txt
Normal 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
|
||||||
@@ -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);
|
|
||||||
});
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user