update lending contract
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -46,9 +46,9 @@ contract Lending is
|
|||||||
// 设置基础配置
|
// 设置基础配置
|
||||||
baseToken = config.baseToken;
|
baseToken = config.baseToken;
|
||||||
baseTokenPriceFeed = config.baseTokenPriceFeed;
|
baseTokenPriceFeed = config.baseTokenPriceFeed;
|
||||||
|
|
||||||
// 常量:一年的秒数
|
// 常量:一年的秒数
|
||||||
uint256 SECONDS_PER_YEAR = 365 * 24 * 60 * 60; // 31,536,000
|
uint64 SECONDS_PER_YEAR = 365 * 24 * 60 * 60; // 31,536,000
|
||||||
|
|
||||||
// 设置利率参数
|
// 设置利率参数
|
||||||
supplyKink = config.supplyKink;
|
supplyKink = config.supplyKink;
|
||||||
@@ -113,7 +113,7 @@ contract Lending is
|
|||||||
if (timeElapsed == 0) return;
|
if (timeElapsed == 0) return;
|
||||||
|
|
||||||
// 计算实际的 totalSupply 和 totalBorrow(含利息)
|
// 计算实际的 totalSupply 和 totalBorrow(含利息)
|
||||||
// 注意:totalSupplyBase 和 totalBorrowBase 都是正数本金
|
// 注意:totalSupplyBase 和 totalBorrowBase 都是正数本金(正数=存款本金,负数=借款本金)
|
||||||
// supplyIndex 用于存款,borrowIndex 用于借款
|
// supplyIndex 用于存款,borrowIndex 用于借款
|
||||||
uint256 totalSupply = (uint256(totalSupplyBase) * supplyIndex) / 1e18;
|
uint256 totalSupply = (uint256(totalSupplyBase) * supplyIndex) / 1e18;
|
||||||
uint256 totalBorrow = (uint256(totalBorrowBase) * borrowIndex) / 1e18;
|
uint256 totalBorrow = (uint256(totalBorrowBase) * borrowIndex) / 1e18;
|
||||||
@@ -137,7 +137,7 @@ contract Lending is
|
|||||||
borrowPerSecondInterestRateBase
|
borrowPerSecondInterestRateBase
|
||||||
);
|
);
|
||||||
|
|
||||||
// 更新利息累计因子(使用每秒利率,计算更精确且 Gas 更低)
|
// 更新利息累计因子(使用每秒利率)
|
||||||
supplyIndex = LendingMath.accrueInterest(supplyIndex, supplyRate, timeElapsed);
|
supplyIndex = LendingMath.accrueInterest(supplyIndex, supplyRate, timeElapsed);
|
||||||
borrowIndex = LendingMath.accrueInterest(borrowIndex, borrowRate, timeElapsed);
|
borrowIndex = LendingMath.accrueInterest(borrowIndex, borrowRate, timeElapsed);
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ contract Lending is
|
|||||||
uint256 newIndex = newBalance >= 0 ? supplyIndex : borrowIndex;
|
uint256 newIndex = newBalance >= 0 ? supplyIndex : borrowIndex;
|
||||||
int104 newPrincipal = LendingMath.balanceToPrincipal(newBalance, newIndex);
|
int104 newPrincipal = LendingMath.balanceToPrincipal(newBalance, newIndex);
|
||||||
|
|
||||||
// 计算还款和存款金额
|
// 根据新旧本金,计算还款和存款金额
|
||||||
(uint104 repayAmount, uint104 supplyAmount) = LendingMath.repayAndSupplyAmount(oldPrincipal, newPrincipal);
|
(uint104 repayAmount, uint104 supplyAmount) = LendingMath.repayAndSupplyAmount(oldPrincipal, newPrincipal);
|
||||||
|
|
||||||
// 更新全局状态
|
// 更新全局状态
|
||||||
@@ -307,7 +307,7 @@ contract Lending is
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @notice 清算不良债务(内部实现)
|
* @notice 清算不良债务(内部实现)
|
||||||
* @dev 当用户抵押品由于乘以liquidateCollateralFactor后,小于债务价值时,会进行清算,清算后,如果实际抵押品价值大于债务价值,则将差额部分作为用户本金(本金以baseToken显示),否则将差额部分作为坏账,由协议承担
|
* @dev 当用户抵押品由于乘以liquidateCollateralFactor后,小于债务价值时,会进行清算,清算后,如果实际抵押品价值乘以liquidateCollateralFactor大于债务价值,则将差额部分作为用户本金(本金以baseToken显示),否则将差额部分作为坏账,由协议承担
|
||||||
*/
|
*/
|
||||||
function _absorbInternal(address absorber, address borrower) internal {
|
function _absorbInternal(address absorber, address borrower) internal {
|
||||||
if (!isLiquidatable(borrower)) revert NotLiquidatable();
|
if (!isLiquidatable(borrower)) revert NotLiquidatable();
|
||||||
@@ -432,7 +432,7 @@ contract Lending is
|
|||||||
uint256 totalBorrow = (uint256(totalBorrowBase) * borrowIndex) / 1e18;
|
uint256 totalBorrow = (uint256(totalBorrowBase) * borrowIndex) / 1e18;
|
||||||
int256 currentReserves = int256(balance) - int256(totalSupply) + int256(totalBorrow);
|
int256 currentReserves = int256(balance) - int256(totalSupply) + int256(totalBorrow);
|
||||||
if (currentReserves >= 0 && uint256(currentReserves) >= targetReserves) {
|
if (currentReserves >= 0 && uint256(currentReserves) >= targetReserves) {
|
||||||
revert InsufficientBalance(); // 储备金充足,无需出售
|
revert NotForSale(); // 储备金充足,无需出售
|
||||||
}
|
}
|
||||||
|
|
||||||
// 收取清算人支付的资金
|
// 收取清算人支付的资金
|
||||||
@@ -619,6 +619,21 @@ contract Lending is
|
|||||||
return perSecondRate * 31536000; // SECONDS_PER_YEAR
|
return perSecondRate * 31536000; // SECONDS_PER_YEAR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getBorrowRate() external view override returns (uint64) {
|
||||||
|
uint256 totalSupply = (uint256(totalSupplyBase) * supplyIndex) / 1e18;
|
||||||
|
uint256 totalBorrow = (uint256(totalBorrowBase) * borrowIndex) / 1e18;
|
||||||
|
uint64 utilization = LendingMath.getUtilization(totalSupply, totalBorrow);
|
||||||
|
uint64 perSecondRate = LendingMath.getBorrowRate(
|
||||||
|
utilization,
|
||||||
|
borrowKink,
|
||||||
|
borrowPerSecondInterestRateSlopeLow,
|
||||||
|
borrowPerSecondInterestRateSlopeHigh,
|
||||||
|
borrowPerSecondInterestRateBase
|
||||||
|
);
|
||||||
|
// 转换为年化利率(APY)
|
||||||
|
return perSecondRate * 31536000; // SECONDS_PER_YEAR
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @notice 提取协议储备金(仅 owner)
|
* @notice 提取协议储备金(仅 owner)
|
||||||
*/
|
*/
|
||||||
@@ -638,20 +653,5 @@ contract Lending is
|
|||||||
|
|
||||||
emit WithdrawReserves(to, amount);
|
emit WithdrawReserves(to, amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBorrowRate() external view override returns (uint64) {
|
|
||||||
uint256 totalSupply = (uint256(totalSupplyBase) * supplyIndex) / 1e18;
|
|
||||||
uint256 totalBorrow = (uint256(totalBorrowBase) * borrowIndex) / 1e18;
|
|
||||||
uint64 utilization = LendingMath.getUtilization(totalSupply, totalBorrow);
|
|
||||||
uint64 perSecondRate = LendingMath.getBorrowRate(
|
|
||||||
utilization,
|
|
||||||
borrowKink,
|
|
||||||
borrowPerSecondInterestRateSlopeLow,
|
|
||||||
borrowPerSecondInterestRateSlopeHigh,
|
|
||||||
borrowPerSecondInterestRateBase
|
|
||||||
);
|
|
||||||
// 转换为年化利率(APY)
|
|
||||||
return perSecondRate * 31536000; // SECONDS_PER_YEAR
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ contract LendingConfiguration {
|
|||||||
address asset; // 资产地址
|
address asset; // 资产地址
|
||||||
address priceFeed; // 价格预言机地址
|
address priceFeed; // 价格预言机地址
|
||||||
uint8 decimals; // 小数位数
|
uint8 decimals; // 小数位数
|
||||||
uint64 borrowCollateralFactor; // 借款抵押率 (例: 0.8e18 = 80%)
|
uint64 borrowCollateralFactor; // 借款抵押率
|
||||||
uint64 liquidateCollateralFactor; // 清算抵押率 (例: 0.85e18 = 85%)
|
uint64 liquidateCollateralFactor; // 清算抵押率
|
||||||
uint64 liquidationFactor; // 清算激励 (例: 1.05e18 = 5%折扣)
|
uint64 liquidationFactor; // 清算折扣
|
||||||
uint128 supplyCap; // 供应上限
|
uint128 supplyCap; // 供应上限
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Configuration {
|
struct Configuration {
|
||||||
address baseToken; // 基础资产(借出的资产,如 USDC)
|
address baseToken; // 基础资产
|
||||||
address baseTokenPriceFeed; // 基础资产价格预言机
|
address baseTokenPriceFeed; // 基础资产价格预言机
|
||||||
|
|
||||||
// 利率模型参数
|
// 利率模型参数
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ interface ILending {
|
|||||||
error InvalidBorrowCollateralFactor();
|
error InvalidBorrowCollateralFactor();
|
||||||
error InvalidLiquidateCollateralFactor();
|
error InvalidLiquidateCollateralFactor();
|
||||||
error InsufficientReserves();
|
error InsufficientReserves();
|
||||||
|
error NotForSale();
|
||||||
|
|
||||||
// ========== Core Functions ==========
|
// ========== Core Functions ==========
|
||||||
|
|
||||||
|
|||||||
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 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x608080604052346013576039908160188239f35b5f80fdfe5f80fdfea26469706673582212205df123a32f07781f10c2b13b0f7054739bd8e6b6a24398e36df9a0d8834e26c764736f6c634300081e0033","sourceMap":"138:1917:11:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea26469706673582212205df123a32f07781f10c2b13b0f7054739bd8e6b6a24398e36df9a0d8834e26c764736f6c634300081e0033","sourceMap":"138:1917:11:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"LendingConfiguration\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"\\u501f\\u8d37\\u6c60\\u914d\\u7f6e\\u7ed3\\u6784\\u4f53\\u5b9a\\u4e49\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ytLending/LendingConfiguration.sol\":\"LendingConfiguration\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/=node_modules/@ensdomains/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=node_modules/hardhat/\"],\"viaIR\":true},\"sources\":{\"contracts/ytLending/LendingConfiguration.sol\":{\"keccak256\":\"0x7a8dadeff49ae459038386c7d5a897af60f2b6a0e609c1a18f60e6fcddddb198\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc7ed641e66137db4da0571954b80bef5531c95610c9c6ed4052f1b4568c659c\",\"dweb:/ipfs/QmWq71yC4YG97g4JckTo3S8aHA1Bk2zGgoLppo4gSZfiTa\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@ensdomains/=node_modules/@ensdomains/","@openzeppelin/=node_modules/@openzeppelin/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"contracts/ytLending/LendingConfiguration.sol":"LendingConfiguration"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"contracts/ytLending/LendingConfiguration.sol":{"keccak256":"0x7a8dadeff49ae459038386c7d5a897af60f2b6a0e609c1a18f60e6fcddddb198","urls":["bzz-raw://fc7ed641e66137db4da0571954b80bef5531c95610c9c6ed4052f1b4568c659c","dweb:/ipfs/QmWq71yC4YG97g4JckTo3S8aHA1Bk2zGgoLppo4gSZfiTa"],"license":"MIT"}},"version":1},"id":11}
|
{"abi":[],"bytecode":{"object":"0x608080604052346013576039908160188239f35b5f80fdfe5f80fdfea264697066735822122076098cfdad6b8b1070c4224cc2030f7a7c45e74d0408ccaa578faefa747c668c64736f6c634300081e0033","sourceMap":"138:1818:3:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea264697066735822122076098cfdad6b8b1070c4224cc2030f7a7c45e74d0408ccaa578faefa747c668c64736f6c634300081e0033","sourceMap":"138:1818:3:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"LendingConfiguration\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"\\u501f\\u8d37\\u6c60\\u914d\\u7f6e\\u7ed3\\u6784\\u4f53\\u5b9a\\u4e49\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ytLending/LendingConfiguration.sol\":\"LendingConfiguration\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/=node_modules/@ensdomains/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":forge-std/=lib/forge-std/src/\",\":hardhat/=node_modules/hardhat/\"],\"viaIR\":true},\"sources\":{\"contracts/ytLending/LendingConfiguration.sol\":{\"keccak256\":\"0xb865cb13a3cdd84c409188043405fce03159fef567296b4ad795eebfbe3ba1ce\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://05b6f564c096a2dc656c9b06a6683b723314d01ec194f4a3f288c7d2ecca54f3\",\"dweb:/ipfs/QmYbAD9EDyGBCjHid2hP7m1qmd19bXR7h2hyDA8F1AP2ow\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@ensdomains/=node_modules/@ensdomains/","@openzeppelin/=node_modules/@openzeppelin/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"contracts/ytLending/LendingConfiguration.sol":"LendingConfiguration"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"contracts/ytLending/LendingConfiguration.sol":{"keccak256":"0xb865cb13a3cdd84c409188043405fce03159fef567296b4ad795eebfbe3ba1ce","urls":["bzz-raw://05b6f564c096a2dc656c9b06a6683b723314d01ec194f4a3f288c7d2ecca54f3","dweb:/ipfs/QmYbAD9EDyGBCjHid2hP7m1qmd19bXR7h2hyDA8F1AP2ow"],"license":"MIT"}},"version":1},"id":3}
|
||||||
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 +1 @@
|
|||||||
{"id":"4d57c48057fc3574","source_id_to_path":{"0":"contracts/ytLending/Configurator.sol","1":"contracts/ytLending/ConfiguratorStorage.sol","2":"contracts/ytLending/Lending.sol","3":"contracts/ytLending/LendingConfiguration.sol","4":"contracts/ytLending/LendingFactory.sol","5":"contracts/ytLending/LendingMath.sol","6":"contracts/ytLending/LendingStorage.sol","7":"contracts/ytLending/interfaces/ILending.sol","8":"contracts/ytLending/interfaces/IPriceFeed.sol","9":"lib/forge-std/src/Base.sol","10":"lib/forge-std/src/StdAssertions.sol","11":"lib/forge-std/src/StdChains.sol","12":"lib/forge-std/src/StdCheats.sol","13":"lib/forge-std/src/StdConstants.sol","14":"lib/forge-std/src/StdError.sol","15":"lib/forge-std/src/StdInvariant.sol","16":"lib/forge-std/src/StdJson.sol","17":"lib/forge-std/src/StdMath.sol","18":"lib/forge-std/src/StdStorage.sol","19":"lib/forge-std/src/StdStyle.sol","20":"lib/forge-std/src/StdToml.sol","21":"lib/forge-std/src/StdUtils.sol","22":"lib/forge-std/src/Test.sol","23":"lib/forge-std/src/Vm.sol","24":"lib/forge-std/src/console.sol","25":"lib/forge-std/src/console2.sol","26":"lib/forge-std/src/interfaces/IMulticall3.sol","27":"lib/forge-std/src/safeconsole.sol","28":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","29":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","30":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.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/access/Ownable.sol","35":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","36":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","37":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","38":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","39":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","40":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","41":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","42":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","43":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","44":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","45":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","46":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","47":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","48":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","49":"node_modules/@openzeppelin/contracts/utils/Address.sol","50":"node_modules/@openzeppelin/contracts/utils/Context.sol","51":"node_modules/@openzeppelin/contracts/utils/Errors.sol","52":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","53":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","54":"test/YtLending.t.sol"},"language":"Solidity"}
|
{"id":"3727933aebc49b60","source_id_to_path":{"0":"contracts/ytLending/Configurator.sol","1":"contracts/ytLending/ConfiguratorStorage.sol","2":"contracts/ytLending/Lending.sol","3":"contracts/ytLending/LendingConfiguration.sol","4":"contracts/ytLending/LendingFactory.sol","5":"contracts/ytLending/LendingMath.sol","6":"contracts/ytLending/LendingStorage.sol","7":"contracts/ytLending/interfaces/ILending.sol","8":"contracts/ytLending/interfaces/IPriceFeed.sol","9":"lib/forge-std/src/Base.sol","10":"lib/forge-std/src/StdAssertions.sol","11":"lib/forge-std/src/StdChains.sol","12":"lib/forge-std/src/StdCheats.sol","13":"lib/forge-std/src/StdConstants.sol","14":"lib/forge-std/src/StdError.sol","15":"lib/forge-std/src/StdInvariant.sol","16":"lib/forge-std/src/StdJson.sol","17":"lib/forge-std/src/StdMath.sol","18":"lib/forge-std/src/StdStorage.sol","19":"lib/forge-std/src/StdStyle.sol","20":"lib/forge-std/src/StdToml.sol","21":"lib/forge-std/src/StdUtils.sol","22":"lib/forge-std/src/Test.sol","23":"lib/forge-std/src/Vm.sol","24":"lib/forge-std/src/console.sol","25":"lib/forge-std/src/console2.sol","26":"lib/forge-std/src/interfaces/IMulticall3.sol","27":"lib/forge-std/src/safeconsole.sol","28":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","29":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","30":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.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/access/Ownable.sol","35":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","36":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","37":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","38":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","39":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","40":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","41":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","42":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","43":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","44":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","45":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","46":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","47":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","48":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","49":"node_modules/@openzeppelin/contracts/utils/Address.sol","50":"node_modules/@openzeppelin/contracts/utils/Context.sol","51":"node_modules/@openzeppelin/contracts/utils/Errors.sol","52":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","53":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","54":"test/YtLending.t.sol"},"language":"Solidity"}
|
||||||
@@ -1 +1 @@
|
|||||||
{"id":"685284636136dbec","source_id_to_path":{"0":"contracts/ytLending/Configurator.sol","1":"contracts/ytLending/ConfiguratorStorage.sol","2":"contracts/ytLending/Lending.sol","3":"contracts/ytLending/LendingConfiguration.sol","4":"contracts/ytLending/LendingFactory.sol","5":"contracts/ytLending/LendingMath.sol","6":"contracts/ytLending/LendingStorage.sol","7":"contracts/ytLending/interfaces/ILending.sol","8":"contracts/ytLending/interfaces/IPriceFeed.sol","9":"lib/forge-std/src/Base.sol","10":"lib/forge-std/src/StdAssertions.sol","11":"lib/forge-std/src/StdChains.sol","12":"lib/forge-std/src/StdCheats.sol","13":"lib/forge-std/src/StdConstants.sol","14":"lib/forge-std/src/StdError.sol","15":"lib/forge-std/src/StdInvariant.sol","16":"lib/forge-std/src/StdJson.sol","17":"lib/forge-std/src/StdMath.sol","18":"lib/forge-std/src/StdStorage.sol","19":"lib/forge-std/src/StdStyle.sol","20":"lib/forge-std/src/StdToml.sol","21":"lib/forge-std/src/StdUtils.sol","22":"lib/forge-std/src/Test.sol","23":"lib/forge-std/src/Vm.sol","24":"lib/forge-std/src/console.sol","25":"lib/forge-std/src/console2.sol","26":"lib/forge-std/src/interfaces/IMulticall3.sol","27":"lib/forge-std/src/safeconsole.sol","28":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","29":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","30":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.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/access/Ownable.sol","35":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","36":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","37":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","38":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","39":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","40":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","41":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","42":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","43":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","44":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","45":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","46":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","47":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","48":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","49":"node_modules/@openzeppelin/contracts/utils/Address.sol","50":"node_modules/@openzeppelin/contracts/utils/Context.sol","51":"node_modules/@openzeppelin/contracts/utils/Errors.sol","52":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","53":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","54":"test/YtLending.t.sol"},"language":"Solidity"}
|
{"id":"5c8609e4d5730c4a","source_id_to_path":{"0":"contracts/ytLending/Configurator.sol","1":"contracts/ytLending/ConfiguratorStorage.sol","2":"contracts/ytLending/Lending.sol","3":"contracts/ytLending/LendingConfiguration.sol","4":"contracts/ytLending/LendingFactory.sol","5":"contracts/ytLending/LendingMath.sol","6":"contracts/ytLending/LendingStorage.sol","7":"contracts/ytLending/interfaces/ILending.sol","8":"contracts/ytLending/interfaces/IPriceFeed.sol","9":"lib/forge-std/src/Base.sol","10":"lib/forge-std/src/StdAssertions.sol","11":"lib/forge-std/src/StdChains.sol","12":"lib/forge-std/src/StdCheats.sol","13":"lib/forge-std/src/StdConstants.sol","14":"lib/forge-std/src/StdError.sol","15":"lib/forge-std/src/StdInvariant.sol","16":"lib/forge-std/src/StdJson.sol","17":"lib/forge-std/src/StdMath.sol","18":"lib/forge-std/src/StdStorage.sol","19":"lib/forge-std/src/StdStyle.sol","20":"lib/forge-std/src/StdToml.sol","21":"lib/forge-std/src/StdUtils.sol","22":"lib/forge-std/src/Test.sol","23":"lib/forge-std/src/Vm.sol","24":"lib/forge-std/src/console.sol","25":"lib/forge-std/src/console2.sol","26":"lib/forge-std/src/interfaces/IMulticall3.sol","27":"lib/forge-std/src/safeconsole.sol","28":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","29":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","30":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.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/access/Ownable.sol","35":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","36":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","37":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","38":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","39":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","40":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","41":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","42":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","43":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","44":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","45":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","46":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","47":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","48":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","49":"node_modules/@openzeppelin/contracts/utils/Address.sol","50":"node_modules/@openzeppelin/contracts/utils/Context.sol","51":"node_modules/@openzeppelin/contracts/utils/Errors.sol","52":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","53":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","54":"test/YtLending.t.sol"},"language":"Solidity"}
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"id":"873f71b8338f0e7a","source_id_to_path":{"0":"contracts/ytLending/Configurator.sol","1":"contracts/ytLending/ConfiguratorStorage.sol","2":"contracts/ytLending/Lending.sol","3":"contracts/ytLending/LendingConfiguration.sol","4":"contracts/ytLending/LendingFactory.sol","5":"contracts/ytLending/LendingMath.sol","6":"contracts/ytLending/LendingStorage.sol","7":"contracts/ytLending/interfaces/ILending.sol","8":"contracts/ytLending/interfaces/IPriceFeed.sol","9":"lib/forge-std/src/Base.sol","10":"lib/forge-std/src/StdAssertions.sol","11":"lib/forge-std/src/StdChains.sol","12":"lib/forge-std/src/StdCheats.sol","13":"lib/forge-std/src/StdConstants.sol","14":"lib/forge-std/src/StdError.sol","15":"lib/forge-std/src/StdInvariant.sol","16":"lib/forge-std/src/StdJson.sol","17":"lib/forge-std/src/StdMath.sol","18":"lib/forge-std/src/StdStorage.sol","19":"lib/forge-std/src/StdStyle.sol","20":"lib/forge-std/src/StdToml.sol","21":"lib/forge-std/src/StdUtils.sol","22":"lib/forge-std/src/Test.sol","23":"lib/forge-std/src/Vm.sol","24":"lib/forge-std/src/console.sol","25":"lib/forge-std/src/console2.sol","26":"lib/forge-std/src/interfaces/IMulticall3.sol","27":"lib/forge-std/src/safeconsole.sol","28":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","29":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","30":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.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/access/Ownable.sol","35":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","36":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","37":"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol","38":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","39":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol","40":"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol","41":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol","42":"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","43":"node_modules/@openzeppelin/contracts/proxy/Proxy.sol","44":"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol","45":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","46":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","47":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","48":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","49":"node_modules/@openzeppelin/contracts/utils/Address.sol","50":"node_modules/@openzeppelin/contracts/utils/Context.sol","51":"node_modules/@openzeppelin/contracts/utils/Errors.sol","52":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","53":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","54":"test/YtLending.t.sol"},"language":"Solidity"}
|
|
||||||
@@ -45,7 +45,7 @@ contract YtLendingTest is Test {
|
|||||||
uint64 constant SUPPLY_KINK = 0.8e18; // 80%
|
uint64 constant SUPPLY_KINK = 0.8e18; // 80%
|
||||||
uint64 constant SUPPLY_RATE_LOW = 0.03e18; // 3% APY
|
uint64 constant SUPPLY_RATE_LOW = 0.03e18; // 3% APY
|
||||||
uint64 constant SUPPLY_RATE_HIGH = 0.4e18; // 40% APY
|
uint64 constant SUPPLY_RATE_HIGH = 0.4e18; // 40% APY
|
||||||
uint64 constant SUPPLY_RATE_BASE = 0;
|
uint64 constant SUPPLY_RATE_BASE = 0; // 设置为0%,当没有借款时,存款人不获得利息
|
||||||
|
|
||||||
uint64 constant BORROW_KINK = 0.8e18; // 80%
|
uint64 constant BORROW_KINK = 0.8e18; // 80%
|
||||||
uint64 constant BORROW_RATE_LOW = 0.05e18; // 5% APY
|
uint64 constant BORROW_RATE_LOW = 0.05e18; // 5% APY
|
||||||
|
|||||||
Reference in New Issue
Block a user